#include #include "stdio.h" #include "string.h" #include "global.h" #include "graphics.h" #include "math.h" #include "dlogtool.h" #include "edsound.h" #include "graphutl.h" #include "keydlgs.h" extern char far scen_strs[160][256]; extern char far scen_strs2[110][256]; extern char far talk_strs[170][256]; extern char far town_strs[180][256]; extern HFONT font,italic_font,underline_font,bold_font,tiny_font,small_bold_font; extern HPALETTE hpal; extern HDC main_dc,main_dc2,main_dc3; extern HCURSOR cursors[8]; extern outdoor_record_type far current_terrain; extern HWND mainPtr; extern town_record_type current_town; extern short cen_x, cen_y,current_terrain_type,cur_town; extern town_record_type far town; extern big_tr_type far t_d; extern template_town_type town_template; extern short town_type; // 0 - big 1 - ave 2 - small extern short cur_viewing_mode,overall_mode; extern short available_dlog_buttons[NUM_DLOG_B]; extern Boolean editing_town; extern short max_dim[3]; extern short dungeon_font_num,geneva_font_num; extern RECT windRect; extern piles_of_stuff_dumping_type *data_store; extern scenario_data_type far scenario; extern RECT world_screen; extern scen_item_data_type far scen_item_list; extern RECT left_button[NLS]; extern RECT right_buttons[NRSONPAGE]; extern RECT right_scrollbar_rect; extern RECT right_area_rect; extern unsigned char borders[4][50]; extern HWND right_sbar; extern Boolean left_buttons_active,right_buttons_active; extern short left_button_status[NLS]; // 0 - clear, 1 - text, 2 - title text, +10 - button extern short right_button_status[NRS]; extern unsigned char m_pic_index[200]; extern char *button_strs[140]; extern location cur_out; extern short ulx,uly; extern HANDLE store_hInstance,accel; short num_ir[3] = {12,10,4}; GWorldPtr monst_gworld[10],terrain_gworld[6],small_terrain_gworld,editor_mixed,terrain_buttons_gworld; GWorldPtr anim_gworld,field_gworld,dialog_gworld,items_gworld,tiny_obj_gworld; GWorldPtr dlg_buttons_gworld,ter_draw_gworld,dlogpics_gworld,talkfaces_gworld,mixed_gworld; GWorldPtr dialog_pattern_gworld,pattern_gworld; HBITMAP spec_scen_g = NULL; short small_icons[24] = {0,23,37,38,39,35,33,34,30,0, 30,26,0,0,36,0,27,28,29,20, 21,22,0,0}; HBRUSH map_brush[25]; HBITMAP map_bitmap[25]; // begin new stuff RECT blue_button_from = {91,112,107,126};// RECT start_button_from = {70,112,91,119}; RECT base_small_button_from = {0,112,7,119}; extern RECT palette_buttons[8][6]; RECT palette_button_base = {0,0,25,18}; RECT terrain_buttons_rect = {0,0,294,410}; extern RECT left_buttons[NLS][2]; // 0 - whole, 1 - blue button RECT left_button_base = {5,5,200,21}; RECT right_button_base = {RIGHT_AREA_UL_Y,RIGHT_AREA_UL_X,17,RIGHT_AREA_UL_Y}; RECT terrain_rect = {0,0,272,340}; char current_string[256] = ""; char current_string2[256] = ""; extern RECT terrain_rects[256]; short map_pats[220] = {50,50,1,1,1,6,6,6,6,6, 6,6,6,6,6,6,6,6,2,2, 2,2,2,2,2,2,2,2,2,2, 2,2,4,4,4,4,4,4,4,4, 4,4,4,4,4,4,3,3,3,3, 3,3,3,3,3,3,3,3,3,0, // 50 0,0,0,0,0,0,0,23,23,23, 15,15,50,50,0,0,0,0,0,7, 7,8,8,14,14,9,9,9,5,5, 0,0,0,0,0,0,0,0,0,0, 18,18,0,0,0,0,0,0,0,0, // 100 22,22,0,0,0,0,0,0,0,0, 0,0,0,10,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,11,0,0, // 150 0,0,0,12,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0, // 200 0,0,0,0,0,0,0,0,0,0 }; unsigned char small_what_drawn[64][64]; extern Boolean small_any_drawn; void Set_up_win () { short i,j; RECT whole_win_rect; GetClientRect(mainPtr,&whole_win_rect); ulx = (whole_win_rect.right - 600) / 2 ; uly = (whole_win_rect.bottom - 440) / 2 + 8; for (i = 0; i < 8; i++) for (j = 0; j < 6; j++) { palette_buttons[i][j] = palette_button_base; OffsetRect(&palette_buttons[i][j],i * 25, j * 17); if (i == 7) palette_buttons[i][j].right++; } for (i = 0; i < 8; i++) for (j = 2; j < 6; j++) OffsetRect(&palette_buttons[i][j],0,3); for (i = 0; i < 8; i++) for (j = 3; j < 6; j++) OffsetRect(&palette_buttons[i][j],0,3); for (i = 0; i < 8; i++) for (j = 4; j < 6; j++) OffsetRect(&palette_buttons[i][j],0,3); for (i = 0; i < NLS; i++) { left_buttons[i][0] = left_button_base; OffsetRect(&left_buttons[i][0],0,i * 16); left_buttons[i][1] = left_buttons[i][0]; left_buttons[i][1].top += 1; left_buttons[i][1].bottom -= 1; left_buttons[i][1].left += 0; left_buttons[i][1].right = left_buttons[i][1].left + 16; } right_button_base.left = RIGHT_AREA_UL_X + 1; right_button_base.top = RIGHT_AREA_UL_Y + 1; right_button_base.bottom = right_button_base.top + 12; right_button_base.right = right_button_base.left + RIGHT_AREA_WIDTH - 20; for (i = 0; i < NRSONPAGE; i++) { right_buttons[i] = right_button_base; OffsetRect(&right_buttons[i],0,i * 12); } load_main_screen(); } void run_startup_g() { RECT pict_rect = {0,0,640,480},to_rect; //PicHandle pict_to_draw; HBITMAP start_g; RECT pat_rect; HBRUSH old_brush; pat_rect = windRect; InflateRect(&pat_rect,500,500); // paint_pattern(NULL,1,pat_rect,3); old_brush = SelectObject(main_dc,GetStockObject(BLACK_BRUSH)); Rectangle(main_dc, pat_rect.left,pat_rect.top, pat_rect.right,pat_rect.bottom); SelectObject(main_dc,old_brush); start_g = load_pict(3002); to_rect = pict_rect; OffsetRect(&to_rect,-18,-30); rect_draw_some_item(start_g,pict_rect,start_g,to_rect,0,1); DeleteObject(start_g); play_sound(95); } void load_main_screen() { short i,j; RECT map_from_orig = {372,0,380,8},map_from,brush_to = {0,0,8,8}; main_dc = GetDC(mainPtr); SelectPalette(main_dc,hpal,0); SelectObject(main_dc,font); SetBkMode(main_dc,TRANSPARENT); SetStretchBltMode(main_dc,STRETCH_DELETESCANS); terrain_buttons_gworld = CreateCompatibleBitmap(main_dc,terrain_buttons_rect.right,terrain_buttons_rect.bottom); ter_draw_gworld = CreateCompatibleBitmap(main_dc,terrain_rect.right,terrain_rect.bottom); dlg_buttons_gworld = load_pict(2000); mixed_gworld = load_pict(903); run_startup_g(); world_screen = terrain_rect; OffsetRect(&world_screen,TER_RECT_UL_X,TER_RECT_UL_Y); for (i = 0; i < 10; i++) monst_gworld[i] = load_pict(1100 + i); for (i = 0; i < 6; i++) terrain_gworld[i] = load_pict(800 + i); small_terrain_gworld = load_pict(904); editor_mixed = load_pict(906); anim_gworld = load_pict(820); field_gworld = load_pict(821); talkfaces_gworld = load_pict(860); items_gworld = load_pict(901); tiny_obj_gworld = load_pict(900); dlogpics_gworld = load_pict(850); dialog_pattern_gworld = CreateCompatibleBitmap(main_dc,192,256); pattern_gworld = CreateCompatibleBitmap(main_dc,192,256); //draw_main_screen(); for (i = 0; i < 25; i++) { map_from = map_from_orig; OffsetRect(&map_from,8 * (i / 10),8 * (i % 10)); map_bitmap[i] = CreateCompatibleBitmap(main_dc,8,8); rect_draw_some_item(mixed_gworld,map_from,map_bitmap[i],brush_to,0,0); map_brush[i] = CreatePatternBrush(map_bitmap[i]); } } void redraw_screen() { RECT pat_rect; pat_rect = windRect; InflateRect(&pat_rect,500,500); paint_pattern(NULL,1,pat_rect,3); draw_main_screen(); if (overall_mode < 60); draw_terrain(); } void draw_main_screen() { short i; RECT draw_rect,big_rect = {-1,-1,582,414}; HBRUSH old_brush,new_brush; COLORREF y = RGB(128,128,128);//y = RGB(119,119,119); UINT c; // draw left buttons (always active) //for (i = 0; i < NLS; i++) { // draw_lb_slot(i); // } draw_lb(); // draw right buttons (only when not editing terrain) if (overall_mode >= 60) { draw_rect.left = RIGHT_AREA_UL_X; draw_rect.top = RIGHT_AREA_UL_Y; draw_rect.right = RIGHT_AREA_UL_X + RIGHT_AREA_WIDTH - 16; draw_rect.bottom = RIGHT_AREA_UL_Y + RIGHT_AREA_HEIGHT; c = GetNearestPaletteIndex(hpal,y); new_brush = CreateSolidBrush(PALETTEINDEX(c)); OffsetRect(&draw_rect,ulx,uly); FrameRect(main_dc,&draw_rect,new_brush); OffsetRect(&big_rect,ulx,uly); if (ulx > 40) FrameRect(main_dc,&big_rect,new_brush); DeleteObject(new_brush); InsetRect(&draw_rect,1,1); OffsetRect(&draw_rect,-1 * ulx,-1 * uly); paint_pattern(NULL,1,draw_rect,3); draw_rb(); // redraw scroll bar here } // draw terrain palette if ((overall_mode < 60) || (overall_mode == 62)) { //draw_rect = terrain_buttons_rect; //OffsetRect(&draw_rect,RIGHT_AREA_UL_X,RIGHT_AREA_UL_Y); //rect_draw_some_item(terrain_buttons_gworld,terrain_buttons_rect, // terrain_buttons_gworld,draw_rect,0,1); place_location(); } } void draw_lb() { RECT temp_rect; short i; temp_rect = windRect; temp_rect.right = RIGHT_AREA_UL_X - 2; //FillCRECT(&temp_rect,bg[12]); paint_pattern(NULL,1,temp_rect,3); for (i = 0; i < NLS; i++) draw_lb_slot(i,0); } // mode 0 normal 1 click void draw_lb_slot (short which,short mode) { RECT text_rect,from_rect; COLORREF colors = RGB(0,0,102),colors2 = RGB(0,0,0); UINT c,c2; c = GetNearestPaletteIndex(hpal,colors); c2 = GetNearestPaletteIndex(hpal,colors2); //FillCRECT(&left_buttons[which][0],bg[12]); paint_pattern(NULL,1,left_buttons[which][0],3); if (left_button_status[which] == 0) return; text_rect = left_buttons[which][0]; if (left_button_status[which] >= 10) { text_rect.left += 18; from_rect = blue_button_from; if (mode > 0) OffsetRect(&from_rect,from_rect.right - from_rect.left,0); rect_draw_some_item(editor_mixed,from_rect,editor_mixed,left_buttons[which][1],0,1); } if (left_button_status[which] % 10 == 3) text_rect.left += 16; if (left_button_status[which] % 10 == 2) { //TextSize(14); //TextFace(bold); SelectObject(main_dc,bold_font); } else OffsetRect(&text_rect,0,2); if (mode > 0) SetTextColor(main_dc,PALETTEINDEX(c)); char_win_draw_string(main_dc,text_rect,(char *)data_store->strings_ls[which],0,12); SetTextColor(main_dc,PALETTEINDEX(c2)); SelectObject(main_dc,font); } void draw_rb() { short i,pos; pos = GetScrollPos(right_sbar,SB_CTL); for (i = pos; i < pos + NRSONPAGE; i++) draw_rb_slot(i,0); } // mode 0 normal 1 pressed void draw_rb_slot (short which,short mode) { RECT text_rect; short pos; COLORREF colors = RGB(255,0,0),colors2 = RGB(0,0,0); UINT c,c2; c = GetNearestPaletteIndex(hpal,colors); c2 = GetNearestPaletteIndex(hpal,colors2); pos = GetScrollPos(right_sbar,SB_CTL); if ((which < pos) || (which >= pos + NRSONPAGE)) return; text_rect = right_buttons[which - pos]; text_rect.right += 2; text_rect.bottom += 2; paint_pattern(NULL,1,text_rect,1); text_rect.bottom -= 2; if (right_button_status[which] == 0) return; if (mode > 0) SetTextColor(main_dc,PALETTEINDEX(c)); OffsetRect(&text_rect,0,-1); char_win_draw_string(main_dc,text_rect,(char *)data_store->strings_rs[which],0,12); SetTextColor(main_dc,PALETTEINDEX(c2)); } void set_up_terrain_buttons() { short i,pic,small_i; RECT ter_from,ter_to,ter_from_base = {0,0,28,36}; RECT tiny_from,tiny_to; HDC hdc; RECT palette_from = {0,0,0,0},palette_to; HBITMAP store_bmp; COLORREF y = RGB(128,128,128);//y = RGB(119,119,119); UINT c; HBRUSH new_brush; paint_pattern(terrain_buttons_gworld,0,terrain_buttons_rect,1); hdc = CreateCompatibleDC(main_dc); //store_text_hdc = hdc; SelectPalette(hdc,hpal,0); SetBkMode(hdc,TRANSPARENT); SelectObject(hdc,small_bold_font); SetStretchBltMode(hdc,STRETCH_DELETESCANS); store_bmp = SelectObject(hdc,terrain_buttons_gworld); c = GetNearestPaletteIndex(hpal,y); new_brush = CreateSolidBrush(PALETTEINDEX(c)); store_bmp = SelectObject(hdc,terrain_buttons_gworld); FrameRect(hdc,&terrain_buttons_rect,new_brush); // first make terrain buttons for (i = 0; i < 256; i++) { ter_from = ter_from_base; pic = scenario.ter_types[i].picture; } SelectObject(hdc,store_bmp); DeleteObject(hdc); DeleteObject(new_brush); SetStretchBltMode(main_dc,STRETCH_DELETESCANS); // first make terrain buttons for (i = 0; i < 256; i++) { ter_from = ter_from_base; pic = scenario.ter_types[i].picture; if (pic >= 1000) { ter_from = get_custom_rect(pic % 1000); rect_draw_some_item(spec_scen_g, ter_from,terrain_buttons_gworld,terrain_rects[i],0,0); } else if (pic < 400) { pic = pic % 50; OffsetRect(&ter_from,28 * (pic % 10), 36 * (pic / 10)); rect_draw_some_item(terrain_gworld[scenario.ter_types[i].picture/50], ter_from,terrain_buttons_gworld,terrain_rects[i],0,0); } else if (pic < 1000) { pic = pic % 50; ter_from.left = 112 * (pic / 5); ter_from.right = ter_from.left + 28; ter_from.top = 36 * (pic % 5); ter_from.bottom = ter_from.top + 36; rect_draw_some_item(anim_gworld, ter_from,terrain_buttons_gworld,terrain_rects[i],0,0); } small_i = small_icons[scenario.ter_types[i].special]; if ((small_i == 30) && (scenario.ter_types[i].flag2 >= 5)) small_i = 31; if ((small_i == 31) && (scenario.ter_types[i].flag2 == 10)) small_i = 32; if (i == 82) small_i = 3; if (i == 83) small_i = 2; if ((i == 7) || (i == 10) || (i == 13) || (i == 16)) small_i = 23; tiny_from = base_small_button_from; OffsetRect(&tiny_from,7 * (small_i % 10),7 * (small_i / 10)); tiny_to = terrain_rects[i]; tiny_to.top = tiny_to.bottom - 7; tiny_to.left = tiny_to.right - 7; if (small_i > 0) { rect_draw_some_item(editor_mixed, tiny_from,terrain_buttons_gworld,tiny_to,0,0); } } if (overall_mode < 60) { palette_to.left = 5; palette_to.top = terrain_rects[255].bottom + 5; if (editing_town == TRUE) { palette_from.bottom = palette_buttons[0][5].bottom; palette_from.right = palette_buttons[7][5].right; } else { palette_from.bottom = palette_buttons[0][2].bottom; palette_from.right = palette_buttons[7][2].right; } palette_to.right = palette_to.left + palette_from.right; palette_to.bottom = palette_to.top + palette_from.bottom; rect_draw_some_item(editor_mixed, palette_from,terrain_buttons_gworld,palette_to,1,0); } } void draw_terrain() { short q,r,x,y,i,small_i; location which_pt,where_draw; RECT draw_rect,clipping_rect = {8,8,260,332}; unsigned char t_to_draw; RECT tiny_to,tiny_to_base = {29,37,36,44},tiny_from,from_rect,to_rect; HBITMAP store_bmp; COLORREF gray = RGB(128,128,128); COLORREF red = RGB(255,0,0); COLORREF white = RGB(255,255,255); UINT c; HBRUSH new_brush; HDC hdc; HPEN old_pen; if (overall_mode >= 60) return; if (cur_viewing_mode == 0) { paint_pattern(ter_draw_gworld,0,terrain_rect,1); } hdc = CreateCompatibleDC(main_dc); //store_text_hdc = hdc; SelectPalette(hdc,hpal,0); SetBkMode(hdc,TRANSPARENT); SelectObject(hdc,small_bold_font); store_bmp = SelectObject(hdc,ter_draw_gworld); c = GetNearestPaletteIndex(hpal,gray); new_brush = CreateSolidBrush(PALETTEINDEX(c)); FrameRect(hdc,&terrain_rect,new_brush); DeleteObject(new_brush); old_pen = SelectObject(hdc,GetStockObject(NULL_PEN)); SelectObject(hdc,store_bmp); if (cur_viewing_mode == 0) { for (q = 0; q < 9; q++) for (r = 0; r < 9; r++) { where_draw.x = q; where_draw.y = r; if (editing_town == TRUE) { t_to_draw = t_d.terrain[cen_x + q - 4][cen_y + r - 4]; } else { if (cen_x + q - 4 == -1) t_to_draw = borders[3][cen_y + r - 4]; else if (cen_x + q - 4 == 48) t_to_draw = borders[1][cen_y + r - 4]; else if (cen_y + r - 4 == -1) t_to_draw = borders[0][cen_x + q - 4]; else if (cen_y + r - 4 == 48) t_to_draw = borders[2][cen_x + q - 4]; else t_to_draw = current_terrain.terrain[cen_x + q - 4][cen_y + r - 4]; } draw_one_terrain_spot(q,r,t_to_draw); which_pt.x = cen_x + q - 4; which_pt.y =cen_y + r - 4; tiny_to = tiny_to_base; OffsetRect(&tiny_to,28 * q, 36 * r); // draw start icon, if starting point if ((editing_town == TRUE) && (cur_town == scenario.which_town_start) && (scenario.where_start.x == cen_x + q - 4) && (scenario.where_start.y == cen_y + r - 4)) { from_rect = start_button_from; to_rect = tiny_to; to_rect.left -= 14; rect_draw_some_item(editor_mixed,from_rect,ter_draw_gworld,to_rect,0,0); OffsetRect(&tiny_to,0,-7); } if ((editing_town == FALSE) && (scenario.out_sec_start.x == cur_out.x) && (scenario.out_sec_start.y == cur_out.y) && (scenario.out_start.x == cen_x + q - 4) && (scenario.out_start.y == cen_y + r - 4)) { from_rect = start_button_from; to_rect = tiny_to; to_rect.left -= 14; rect_draw_some_item(editor_mixed,from_rect,ter_draw_gworld,to_rect,0,0); OffsetRect(&tiny_to,0,-7); } small_i = small_icons[scenario.ter_types[t_to_draw].special]; if ((small_i == 30) && (scenario.ter_types[t_to_draw].flag2 >= 5)) small_i = 31; if ((small_i == 31) && (scenario.ter_types[t_to_draw].flag2 == 10)) small_i = 32; tiny_from = base_small_button_from; OffsetRect(&tiny_from,7 * (small_i % 10),7 * (small_i / 10)); if (small_i > 0) { rect_draw_some_item(editor_mixed,tiny_from,ter_draw_gworld,tiny_to,0,0); OffsetRect(&tiny_to,0,-7); } if (is_special(cen_x + q - 4,cen_y + r - 4) == TRUE) { tiny_from = base_small_button_from; OffsetRect(&tiny_from,7 * (7),7 * (0)); rect_draw_some_item(editor_mixed,tiny_from,ter_draw_gworld,tiny_to,0,0); OffsetRect(&tiny_to,0,-7); } if ((t_to_draw == 7) || (t_to_draw == 10) || (t_to_draw == 13) || (t_to_draw == 16)) { tiny_from = base_small_button_from; OffsetRect(&tiny_from,7 * (3),7 * (2)); rect_draw_some_item(editor_mixed,tiny_from,ter_draw_gworld,tiny_to,0,0); OffsetRect(&tiny_to,0,-7); } //if (is_s_d(cen_x + q - 4,cen_y + r - 4) == TRUE) { // } if (editing_town == FALSE) { for (i = 0; i < 4; i++) if ((cen_x + q - 4 == current_terrain.wandering_locs[i].x) && (cen_y + r - 4 == current_terrain.wandering_locs[i].y)) { tiny_from = base_small_button_from; OffsetRect(&tiny_from,7 * (2),7 * (1)); rect_draw_some_item(editor_mixed,tiny_from,ter_draw_gworld,tiny_to,0,0); OffsetRect(&tiny_to,0,-7); i = 4; } } if (editing_town == TRUE) { for (i = 0; i < 4; i++) if ((cen_x + q - 4 == town.start_locs[i].x) && (cen_y + r - 4 == town.start_locs[i].y)) { tiny_from = base_small_button_from; OffsetRect(&tiny_from,7 * (6 + i),7 * (1)); rect_draw_some_item(editor_mixed,tiny_from,ter_draw_gworld,tiny_to,0,0); OffsetRect(&tiny_to,0,-7); } for (i = 0; i < 4; i++) if ((cen_x + q - 4 == town.wandering_locs[i].x) && (cen_y + r - 4 == town.wandering_locs[i].y)) { tiny_from = base_small_button_from; OffsetRect(&tiny_from,7 * (2),7 * (1)); rect_draw_some_item(editor_mixed,tiny_from,ter_draw_gworld,tiny_to,0,0); OffsetRect(&tiny_to,0,-7); i = 4; } if (is_web(cen_x + q - 4,cen_y + r - 4) == TRUE) { from_rect = calc_rect(5,0); Draw_Some_Item(field_gworld,from_rect,ter_draw_gworld,where_draw,1,0); } if (is_crate(cen_x + q - 4,cen_y + r - 4) == TRUE) { from_rect = calc_rect(6,0); Draw_Some_Item(field_gworld,from_rect,ter_draw_gworld,where_draw,1,0); } if (is_barrel(cen_x + q - 4,cen_y + r - 4) == TRUE) { from_rect = calc_rect(7,0); Draw_Some_Item(field_gworld,from_rect,ter_draw_gworld,where_draw,1,0); } if (is_fire_barrier(cen_x + q - 4,cen_y + r - 4) == TRUE) { from_rect = calc_rect(0,2); Draw_Some_Item(field_gworld,from_rect,ter_draw_gworld,where_draw,1,0); } if (is_quickfire(cen_x + q - 4,cen_y + r - 4) == TRUE) { from_rect = calc_rect(7,1); Draw_Some_Item(field_gworld,from_rect,ter_draw_gworld,where_draw,1,0); } if (is_force_barrier(cen_x + q - 4,cen_y + r - 4) == TRUE) { from_rect = calc_rect(2,2); Draw_Some_Item(field_gworld,from_rect,ter_draw_gworld,where_draw,1,0); } for (i = 0; i < 8; i++) if (is_sfx(cen_x + q - 4,cen_y + r - 4,i)) { from_rect = calc_rect(i,3); Draw_Some_Item(field_gworld,from_rect,ter_draw_gworld,where_draw,1,0); } for (x = 0; x < 64; x++) if ((cen_x + q - 4 == town.preset_items[x].item_loc.x) && (cen_y + r - 4 == town.preset_items[x].item_loc.y) && (town.preset_items[x].item_code >= 0)) { } for (x = 0; x < 60; x++) if ((cen_x + q - 4 == t_d.creatures[x].start_loc.x) && (cen_y + r - 4 == t_d.creatures[x].start_loc.y) && (t_d.creatures[x].number != 0)) { } } } if (editing_town == TRUE) { draw_monsts(hdc); draw_items(hdc); } store_bmp = SelectObject(hdc,ter_draw_gworld); ClipRect(hdc,&clipping_rect); if (editing_town == TRUE) { // draw info rects for (i = 0; i < 16; i++) if (t_d.room_rect[i].left > 0) { draw_rect.left = 22 + 28 * (t_d.room_rect[i].left - cen_x + 4); draw_rect.right = 22 + 28 * (t_d.room_rect[i].right - cen_x + 4); draw_rect.top = 24 + 36 * (t_d.room_rect[i].top - cen_y + 4); draw_rect.bottom = 24 + 36 * (t_d.room_rect[i].bottom - cen_y + 4); c = GetNearestPaletteIndex(hpal,red); new_brush = CreateSolidBrush(PALETTEINDEX(c)); FrameRect(hdc,&draw_rect,new_brush); DeleteObject(new_brush); } // draw border rect draw_rect.left = 21 + 28 * (town.in_town_rect.left - cen_x + 4); draw_rect.right = 21 + 28 * (town.in_town_rect.right - cen_x + 4); draw_rect.top = 25 + 36 * (town.in_town_rect.top - cen_y + 4); draw_rect.bottom = 25 + 36 * (town.in_town_rect.bottom - cen_y + 4); c = GetNearestPaletteIndex(hpal,white); new_brush = CreateSolidBrush(PALETTEINDEX(c)); FrameRect(hdc,&draw_rect,new_brush); DeleteObject(new_brush); } if (editing_town == FALSE) { // draw info rects for (i = 0; i < 8; i++) if (current_terrain.info_rect[i].left > 0) { draw_rect.left = 22 + 28 * (current_terrain.info_rect[i].left - cen_x + 4); draw_rect.right = 22 + 28 * (current_terrain.info_rect[i].right - cen_x + 4); draw_rect.top = 24 + 36 * (current_terrain.info_rect[i].top - cen_y + 4); draw_rect.bottom = 24 + 36 * (current_terrain.info_rect[i].bottom - cen_y + 4); c = GetNearestPaletteIndex(hpal,red); new_brush = CreateSolidBrush(PALETTEINDEX(c)); FrameRect(hdc,&draw_rect,new_brush); DeleteObject(new_brush); } } undo_clip(hdc); SelectObject(hdc,store_bmp); small_any_drawn = FALSE; //if (cur_viewing_mode == 0) // draw_frames(); } if (cur_viewing_mode == 1) { if (small_any_drawn == FALSE) { InsetRect(&terrain_rect,1,1); paint_pattern(ter_draw_gworld,0,terrain_rect,1); InsetRect(&terrain_rect,-1,-1); //FrameRect(&terrain_rect); } for (q = 0; q < ((editing_town == TRUE) ? max_dim[town_type] : 48); q++) for (r = 0; r < ((editing_town == TRUE) ? max_dim[town_type] : 48); r++) { t_to_draw = (editing_town == TRUE) ? t_d.terrain[q][r] : current_terrain.terrain[q][r]; if ((small_what_drawn[q][r] != t_to_draw) || (small_any_drawn == FALSE)) { draw_one_tiny_terrain_spot(q,r,t_to_draw,hdc); small_what_drawn[q][r] = t_to_draw; } } small_any_drawn = TRUE; } SelectObject(hdc,old_pen); DeleteObject(hdc); //draw_cur_string(); place_location(); //to_rect = world_screen; //OffsetRect(&to_rect,TER_RECT_UL_X,TER_RECT_UL_Y); rect_draw_some_item(ter_draw_gworld,terrain_rect,ter_draw_gworld,world_screen,0,1); } void draw_monsts(HDC hdc) { short i,k,width,height,m_start_pic; GWorldPtr from_gworld; RECT source_rect,draw_rect; location where_draw,store_loc; COLORREF y = RGB(128,128,128),red = RGB(255,0,0),white = RGB(255,255,255);//y = RGB(119,119,119); HBITMAP store_bmp; UINT c; HBRUSH new_brush; for (i = 0; i < 60; i++) if (t_d.creatures[i].number != 0) { where_draw.x = t_d.creatures[i].start_loc.x - cen_x + 4; where_draw.y = t_d.creatures[i].start_loc.y - cen_y + 4; width = scenario.scen_monsters[t_d.creatures[i].number].x_width; height = scenario.scen_monsters[t_d.creatures[i].number].y_width; for (k = 0; k < width * height; k++) { store_loc = where_draw; if ((where_draw.x == minmax(0,8,where_draw.x)) && (where_draw.y == minmax(0,8,where_draw.y)) && (scenario.scen_monsters[t_d.creatures[i].number].picture_num >= 1000)) { source_rect = get_custom_rect((scenario.scen_monsters[t_d.creatures[i].number].picture_num + k) % 1000); store_loc.x += k % width; store_loc.y += k / width; Draw_Some_Item(spec_scen_g, source_rect, ter_draw_gworld, store_loc, 1, 0); } else if (scenario.scen_monsters[t_d.creatures[i].number].picture_num < 1000) { m_start_pic = m_pic_index[scenario.scen_monsters[t_d.creatures[i].number].picture_num] + k; from_gworld = monst_gworld[m_start_pic / 20]; m_start_pic = m_start_pic % 20; source_rect = calc_rect(2 * (m_start_pic / 10), m_start_pic % 10); store_loc.x += k % width; store_loc.y += k / width; Draw_Some_Item(from_gworld, source_rect, ter_draw_gworld, store_loc, 1, 0); } } } } // Returns rect for drawing an item, if num < 25, rect is in big item template, // otherwise in small item template RECT get_item_template_rect (short type_wanted) { RECT store_rect; if (type_wanted < 45) { store_rect.top = (type_wanted / 5) * BITMAP_HEIGHT; store_rect.bottom = store_rect.top + BITMAP_HEIGHT; store_rect.left = (type_wanted % 5) * BITMAP_WIDTH; store_rect.right = store_rect.left + BITMAP_WIDTH; } else { store_rect.top = (type_wanted / 10) * 18; store_rect.bottom = store_rect.top + 18; store_rect.left = (type_wanted % 10) * 18; store_rect.right = store_rect.left + 18; } return store_rect; } void draw_items(HDC hdc) { short i; RECT source_rect,draw_rect; location where_draw; short pic_num; COLORREF y = RGB(128,128,128),red = RGB(255,0,0),blue = RGB(0,0,255);//y = RGB(119,119,119); HBITMAP store_bmp; UINT c; HBRUSH new_brush; for (i = 0; i < 64; i++) { if (town.preset_items[i].item_code >= 0) { where_draw.x = town.preset_items[i].item_loc.x - cen_x + 4; where_draw.y = town.preset_items[i].item_loc.y - cen_y + 4; pic_num = scen_item_list.scen_items[town.preset_items[i].item_code].graphic_num; if ((where_draw.x >= 0) && (where_draw.x <= 8) && (where_draw.y >= 0) && (where_draw.y <= 8)) { if (pic_num >= 150) { source_rect = get_custom_rect(pic_num - 150); draw_rect = calc_rect(where_draw.x,where_draw.y); rect_draw_some_item(spec_scen_g, source_rect, ter_draw_gworld, draw_rect, 1, 0); } else { source_rect = get_item_template_rect(pic_num); draw_rect = calc_rect(where_draw.x,where_draw.y); OffsetRect(&draw_rect,8,8); if (pic_num >= 45) { draw_rect.top += 9; draw_rect.bottom -= 9; draw_rect.left += 5; draw_rect.right -= 5; } rect_draw_some_item((pic_num < 45) ? items_gworld : tiny_obj_gworld, source_rect, ter_draw_gworld, draw_rect, 1, 0); } } } } } void force_tiny_redraw() { // short q,r; // for (q = 0; q < 8; q++) // for (r = 0; r < 64; r++) // ter_changed[q][r] = 255; } void redraw_selected_ter() { // draw_one_terrain_spot(18,8,(unsigned char) current_terrain_type); } void draw_one_terrain_spot (short i,short j,unsigned char terrain_to_draw) { location where_draw; RECT source_rect; short picture_wanted; GWorldPtr source_gworld; picture_wanted = scenario.ter_types[terrain_to_draw].picture; where_draw.x = (char) i; where_draw.y = (char) j; if ((picture_wanted >= 1000) && (spec_scen_g != NULL)) { source_gworld = spec_scen_g; source_rect = get_custom_rect(picture_wanted % 1000); } else if (picture_wanted >= 400) { source_gworld = anim_gworld; picture_wanted -= 400; source_rect.left = 112 * (picture_wanted / 5); source_rect.right = source_rect.left + 28; source_rect.top = 36 * (picture_wanted % 5); source_rect.bottom = source_rect.top + 36; } else { source_rect = get_template_rect(terrain_to_draw); source_gworld = terrain_gworld[picture_wanted / 50]; } Draw_Some_Item(source_gworld, source_rect, ter_draw_gworld, where_draw, 0, 0); } void draw_one_tiny_terrain_spot (short i,short j,unsigned char terrain_to_draw,HDC hdc) { location where_draw; RECT source_rect,dest_rect = {0,0,5,5},from_rect = {0,0,4,4},orig_draw_rect = {0,0,4,4}; short picture_wanted,k; GWorldPtr source_gworld; HBITMAP store_bmp; HBRUSH old_brush; picture_wanted = scenario.ter_types[terrain_to_draw].picture; if (picture_wanted >= 1000) picture_wanted = 74; where_draw.x = (char) i; where_draw.y = (char) j; OffsetRect(&dest_rect,8 + 4 * i,8 + 4 * j); store_bmp = SelectObject(hdc,ter_draw_gworld); old_brush = SelectObject(hdc,map_brush[0]); switch (picture_wanted) { case 0: case 1: case 73: case 72: SelectObject(hdc,map_brush[0]); Rectangle(hdc,dest_rect.left, dest_rect.top,dest_rect.right,dest_rect.bottom); break; case 2: case 3: case 4: SelectObject(hdc,map_brush[1]); Rectangle(hdc,dest_rect.left, dest_rect.top,dest_rect.right,dest_rect.bottom); break; default: if ((picture_wanted < 170) && (map_pats[picture_wanted] > 0)) { SelectObject(hdc,map_brush[map_pats[picture_wanted]]); Rectangle(hdc,dest_rect.left, dest_rect.top,dest_rect.right,dest_rect.bottom); } else if (picture_wanted >= 1000) { from_rect = get_custom_rect(picture_wanted % 1000); rect_draw_some_item(spec_scen_g, from_rect, ter_draw_gworld, dest_rect, 0, 0); } else if (picture_wanted >= 400) { source_gworld = anim_gworld; picture_wanted -= 400; if (picture_wanted == 0) { SelectObject(hdc,map_brush[13]); Rectangle(hdc,dest_rect.left, dest_rect.top,dest_rect.right,dest_rect.bottom); } else if (picture_wanted == 4) { SelectObject(hdc,map_brush[21]); Rectangle(hdc,dest_rect.left, dest_rect.top,dest_rect.right,dest_rect.bottom); } else if (picture_wanted == 7) { SelectObject(hdc,map_brush[20]); Rectangle(hdc,dest_rect.left, dest_rect.top,dest_rect.right,dest_rect.bottom); } else if (picture_wanted == 8) { SelectObject(hdc,map_brush[19]); Rectangle(hdc,dest_rect.left, dest_rect.top,dest_rect.right,dest_rect.bottom); } else if (picture_wanted == 9) { SelectObject(hdc,map_brush[20]); Rectangle(hdc,dest_rect.left, dest_rect.top,dest_rect.right,dest_rect.bottom); } else if (picture_wanted == 10) { SelectObject(hdc,map_brush[19]); Rectangle(hdc,dest_rect.left, dest_rect.top,dest_rect.right,dest_rect.bottom); } else { //source_rect.left = 112 * (picture_wanted / 5); //source_rect.right = source_rect.left + 28; //source_rect.top = 36 * (picture_wanted % 5); //source_rect.bottom = source_rect.top + 36; from_rect = orig_draw_rect; OffsetRect(&from_rect, 312 + 24 * (picture_wanted / 5) + 1, 163 + 6 * (picture_wanted % 5) + 1); SelectObject(hdc,store_bmp); dest_rect.right--; dest_rect.bottom--; rect_draw_some_item(mixed_gworld, from_rect, ter_draw_gworld, dest_rect, 0, 0); store_bmp = SelectObject(hdc,ter_draw_gworld); //rect_draw_some_item(source_gworld, source_rect, ter_draw_gworld, dest_rect, 0, 0); } } else { //source_rect = get_template_rect(terrain_to_draw); //source_gworld = terrain_gworld[picture_wanted / 50]; from_rect = orig_draw_rect; OffsetRect(&from_rect, 6 * (picture_wanted % 10) + 312 + 1,1 + 6 * (picture_wanted / 10)); SelectObject(hdc,store_bmp); dest_rect.right--; dest_rect.bottom--; rect_draw_some_item(mixed_gworld, from_rect, ter_draw_gworld, dest_rect, 0, 0); store_bmp = SelectObject(hdc,ter_draw_gworld); } break; } SelectObject(hdc,store_bmp); SelectObject(hdc,old_brush); } /* Draw a bitmap in the world window. hor in 0 .. 8, vert in 0 .. 8, object is ptr. to bitmap to be drawn, and masking is for Copybits. */ void Draw_Some_Item ( GWorldPtr src_gworld,RECT src_rect,GWorldPtr targ_gworld,location target, char masked,short main_win) { RECT destrec; if ((target.x < 0) || (target.x > 8) || (target.y < 0) || (target.y > 8)) return; destrec.left = 8 + BITMAP_WIDTH * target.x; destrec.right = destrec.left + BITMAP_WIDTH; destrec.top = 8 + BITMAP_HEIGHT * target.y; destrec.bottom = destrec.top + BITMAP_HEIGHT; destrec.left = destrec.right - (src_rect.right - src_rect.left); destrec.top = destrec.bottom - (src_rect.bottom - src_rect.top); rect_draw_some_item(src_gworld,src_rect,ter_draw_gworld,destrec,masked,0); } void discard_graphics() { short i; DeleteObject(terrain_buttons_gworld); DeleteObject(ter_draw_gworld); DeleteObject(dlg_buttons_gworld); for (i = 0; i < 10; i++) DeleteObject(monst_gworld[i]); for (i = 0; i < 6; i++) DeleteObject(terrain_gworld[i]); DeleteObject(small_terrain_gworld); DeleteObject(editor_mixed); DeleteObject(anim_gworld); DeleteObject(talkfaces_gworld); DeleteObject(field_gworld); DeleteObject(tiny_obj_gworld); DeleteObject(items_gworld); DeleteObject(dlogpics_gworld); DeleteObject(mixed_gworld); DeleteObject(pattern_gworld); DeleteObject(dialog_pattern_gworld); if (spec_scen_g != NULL) DeleteObject(spec_scen_g); reset_palette(); DeleteObject(hpal); // DeleteObject(opening_palette); DeleteDC(main_dc); DeleteObject(font); // DeleteObject(small_bold_font); DeleteObject(underline_font); DeleteObject(italic_font); DeleteObject(bold_font); for (i = 0; i < 8; i++) if (cursors[i] != NULL) DeleteObject(cursors[i]); for (i = 0; i < 25; i++) { DeleteObject(map_bitmap[i]); DeleteObject(map_brush[i]); } } /* Input terrain currently trying to draw. Get back RECT in terrain template containing desired pixmap, or RECT to darkness if desired map not present */ RECT get_template_rect (unsigned char type_wanted) { RECT store_rect; short i,j; short picture_wanted; picture_wanted = scenario.ter_types[type_wanted].picture; if (picture_wanted >= 1000) picture_wanted = 0; picture_wanted = picture_wanted % 50; store_rect.top = 0 + (picture_wanted / 10) * BITMAP_HEIGHT; store_rect.bottom = store_rect.top + BITMAP_HEIGHT; store_rect.left = 0 + (picture_wanted % 10) * BITMAP_WIDTH; store_rect.right = store_rect.left + BITMAP_WIDTH; return store_rect; } void place_location() { RECT text_rect = {367,290,384,510}; char draw_str[256]; RECT from_rect,draw_rect,source_rect,erase_rect; short picture_wanted; HBITMAP store_bmp; COLORREF y = RGB(128,128,128),red = RGB(255,0,0),white = RGB(255,255,255);//y = RGB(119,119,119); UINT c; HBRUSH new_brush; HDC hdc; erase_rect.left = terrain_rects[255].left + 17; erase_rect.right = RIGHT_AREA_WIDTH - 1; erase_rect.top = terrain_rects[255].top + 12 - 10; erase_rect.bottom = erase_rect.top + 12; paint_pattern(terrain_buttons_gworld,0,erase_rect,1); erase_rect.left = 2; erase_rect.right = RIGHT_AREA_WIDTH - 1; erase_rect.top = terrain_rects[255].bottom + 117; erase_rect.bottom = RIGHT_AREA_HEIGHT + 6; paint_pattern(terrain_buttons_gworld,0,erase_rect,1); hdc = CreateCompatibleDC(main_dc); //store_text_hdc = hdc; SelectPalette(hdc,hpal,0); SetBkMode(hdc,TRANSPARENT); SelectObject(hdc,small_bold_font); store_bmp = SelectObject(hdc,terrain_buttons_gworld); draw_rect.left = terrain_rects[255].left + 20; draw_rect.top = terrain_rects[255].top; if (overall_mode < 60) sprintf((char *) draw_str,"Center: x = %d, y = %d ",(short) cen_x, (short) cen_y); else { draw_rect.left = 5; draw_rect.top = terrain_rects[255].top + 28; sprintf((char *) draw_str,"Click terrain to edit. ",cen_x,cen_y); } draw_rect.bottom = draw_rect.top + 14; draw_rect.right = draw_rect.left + 200; win_draw_string(hdc,draw_rect,draw_str,0,12); SelectObject(hdc,store_bmp); store_bmp = SelectObject(hdc,terrain_buttons_gworld); if (overall_mode < 60) { draw_rect.left = 5; draw_rect.top = terrain_rects[255].bottom + 119; draw_rect.bottom = draw_rect.top + 14; draw_rect.right = draw_rect.left + 400; win_draw_string(hdc,draw_rect,current_string,0,12) ; draw_rect.left = RIGHT_AREA_WIDTH / 2; draw_rect.top = terrain_rects[255].bottom + 119; draw_rect.bottom = draw_rect.top + 14; draw_rect.right = draw_rect.left + 200; win_draw_string(hdc,draw_rect,current_string2,0,12) ; } SelectObject(hdc,store_bmp); DeleteObject(hdc); draw_rect.top = palette_buttons[0][0].top + terrain_rects[255].bottom + 5; draw_rect.left = palette_buttons[7][0].right + 17; draw_rect.bottom = draw_rect.top + 36; draw_rect.right = draw_rect.left + 28; picture_wanted = scenario.ter_types[current_terrain_type].picture; if (overall_mode < 60) { if (picture_wanted >= 1000) { source_rect = get_custom_rect(picture_wanted % 1000); rect_draw_some_item(spec_scen_g, source_rect,terrain_buttons_gworld,draw_rect,0,0); } else if (picture_wanted >= 400) { picture_wanted -= 400; source_rect.left = 112 * (picture_wanted / 5); source_rect.right = source_rect.left + 28; source_rect.top = 36 * (picture_wanted % 5); source_rect.bottom = source_rect.top + 36; rect_draw_some_item(anim_gworld,source_rect,terrain_buttons_gworld,draw_rect,0,0); } else { source_rect = get_template_rect(current_terrain_type); rect_draw_some_item(terrain_gworld[picture_wanted / 50],source_rect, terrain_buttons_gworld,draw_rect,0,0); } } draw_rect = terrain_buttons_rect; OffsetRect(&draw_rect,RIGHT_AREA_UL_X,RIGHT_AREA_UL_Y); rect_draw_some_item(terrain_buttons_gworld,terrain_buttons_rect, terrain_buttons_gworld,draw_rect,0,1); } // klugde for speed ...exactly like place location above, but just writes location void place_just_location() { RECT text_rect = {367,290,384,510}; char draw_str[256]; RECT from_rect,draw_rect,source_rect,erase_rect; short picture_wanted; HBITMAP store_bmp; COLORREF y = RGB(128,128,128),red = RGB(255,0,0),white = RGB(255,255,255);//y = RGB(119,119,119); UINT c; HBRUSH new_brush; HDC hdc; erase_rect.left = terrain_rects[255].left + 17; erase_rect.right = RIGHT_AREA_WIDTH - 1; erase_rect.top = terrain_rects[255].top + 12 - 9; erase_rect.bottom = erase_rect.top + 12; paint_pattern(terrain_buttons_gworld,0,erase_rect,1); hdc = CreateCompatibleDC(main_dc); //store_text_hdc = hdc; SelectPalette(hdc,hpal,0); SetBkMode(hdc,TRANSPARENT); SelectObject(hdc,small_bold_font); store_bmp = SelectObject(hdc,terrain_buttons_gworld); draw_rect.left = terrain_rects[255].left + 20; draw_rect.top = terrain_rects[255].top; if (overall_mode < 60) sprintf((char *) draw_str,"Center: x = %d, y = %d ",cen_x,cen_y); else { draw_rect.left = 5; draw_rect.top = terrain_rects[255].top + 28; sprintf((char *) draw_str,"Click terrain to edit. ",cen_x,cen_y); } draw_rect.bottom = draw_rect.top + 14; draw_rect.right = draw_rect.left + 200; win_draw_string(hdc,draw_rect,draw_str,0,12); SelectObject(hdc,store_bmp); from_rect = terrain_buttons_rect; from_rect.top = erase_rect.top; from_rect.bottom = erase_rect.bottom; draw_rect = from_rect; OffsetRect(&draw_rect,RIGHT_AREA_UL_X,RIGHT_AREA_UL_Y); rect_draw_some_item(terrain_buttons_gworld,from_rect, terrain_buttons_gworld,draw_rect,0,1); DeleteObject(hdc); } void set_string(char *string,char *string2) { strcpy((char *)current_string,string); c2p(current_string); // if (strlen(string2) == 0) // current_string2[0] = 0; // else // sprintf((char *)current_string2,"Bob"); strcpy((char *)current_string2,string2); c2p(current_string2); place_location(); } /* void draw_cur_string() { RECT from_rect,draw_rect; from_rect = terrain_buttons_rect; from_rect.top = from_rect.bottom - 40; draw_rect = from_rect; OffsetRect(&draw_rect,RIGHT_AREA_UL_X,RIGHT_AREA_UL_Y); rect_draw_some_item(terrain_buttons_gworld,from_rect, terrain_buttons_gworld,draw_rect,0,1); MoveTo(RIGHT_AREA_UL_X + 5,terrain_rects[255].bottom + 120); DrawString(current_string); MoveTo(RIGHT_AREA_UL_X + 5,terrain_rects[255].bottom + 132); DrawString(current_string2); } */ Boolean is_special(short i,short j) { short k; if (editing_town == TRUE) for (k = 0; k < 50; k++) if ((town.special_locs[k].x == i) && (town.special_locs[k].y == j)) return TRUE; if (editing_town == FALSE) for (k = 0; k < 18; k++) if ((current_terrain.special_locs[k].x == i) && (current_terrain.special_locs[k].y == j)) return TRUE; return FALSE; } void take_special(short i,short j) {} void make_special(short i,short j) {} void sort_specials() {} Boolean is_field_type(short i,short j,short field_type) { short k; for (k = 0; k < 50; k++) if ((town.preset_fields[k].field_type == field_type) && (town.preset_fields[k].field_loc.x == i) && (town.preset_fields[k].field_loc.y == j)) return TRUE; return FALSE; } void make_field_type(short i,short j,short field_type) { short k; if (is_field_type(i,j,field_type) == TRUE) return; for (k = 0; k < 50; k++) if (town.preset_fields[k].field_type == 0) { town.preset_fields[k].field_loc.x = i; town.preset_fields[k].field_loc.y = j; town.preset_fields[k].field_type = field_type; return; } give_error("Each town can have at most 50 fields and special effects (webs, barrels, blood stains, etc.). To place more, use the eraser first.","",0); } void take_field_type(short i,short j,short field_type) { short k; for (k = 0; k < 50; k++) if ((town.preset_fields[k].field_type == field_type) && (town.preset_fields[k].field_loc.x == i) && (town.preset_fields[k].field_loc.y == j)) { town.preset_fields[k].field_type = 0; return; } } Boolean is_web(short i,short j) { return is_field_type(i,j,3); } void make_web(short i,short j) { make_field_type(i,j,3); } void take_web(short i,short j) { take_field_type(i,j,3); } Boolean is_crate(short i,short j) { return is_field_type(i,j,4); } void make_crate(short i,short j) { make_field_type(i,j,4); } void take_crate(short i,short j) { take_field_type(i,j,4); } Boolean is_barrel(short i,short j) { return is_field_type(i,j,5); } void make_barrel(short i,short j) { make_field_type(i,j,5); } void take_barrel(short i,short j) { take_field_type(i,j,5); } Boolean is_fire_barrier(short i,short j) { return is_field_type(i,j,6); } void make_fire_barrier(short i,short j) { make_field_type(i,j,6); } void take_fire_barrier(short i,short j) { take_field_type(i,j,6); } Boolean is_force_barrier(short i,short j) { return is_field_type(i,j,7); } void make_force_barrier(short i,short j) { make_field_type(i,j,7); } void take_force_barrier(short i,short j) { take_field_type(i,j,7); } Boolean is_sfx(short i,short j,short type) { return is_field_type(i,j,type + 14); } void make_sfx(short i,short j,short type) { make_field_type(i,j,type + 14); } void take_sfx(short i,short j,short type) { take_field_type(i,j,type + 14); } Boolean is_quickfire(short i,short j) { return is_field_type(i,j,8); } void make_quickfire(short i,short j) { make_field_type(i,j,8); } void take_quickfire(short i,short j) { take_field_type(i,j,8); } Boolean container_there(location l) { unsigned char ter; if (editing_town == FALSE) return FALSE; if (scenario.ter_types[t_d.terrain[l.x][l.y]].special == 14) return TRUE; if (is_barrel(l.x,l.y) == TRUE) return TRUE; if (is_crate(l.x,l.y) == TRUE) return TRUE; return 0; } void char_win_draw_string(HDC dest_window,RECT dest_rect,char *str,short mode,short line_height) { char store_s[256]; strcpy((char *) store_s,str); win_draw_string( dest_window, dest_rect,store_s, mode, line_height); } // mode: 0 - align up and left, 1 - center on one line // str is a c string, 256 characters // uses current font void win_draw_string(HDC dest_hdc,RECT dest_rect,char *str,short mode,short line_height) { short i; // this will need formatting for '|' line breaks for (i = 0; i < 256; i++) { if (str[i] == '|') str[i] = 13; if (str[i] == '_') str[i] = 34; } // if dest is main window, add ulx, uly if (dest_hdc == main_dc) OffsetRect(&dest_rect,ulx,uly); switch (mode) { case 0: dest_rect.bottom += 6; DrawText(dest_hdc,str,strlen((char *)str),&dest_rect,DT_LEFT | DT_WORDBREAK); break; case 1: dest_rect.bottom += 6; dest_rect.top -= 6; DrawText(dest_hdc,str,strlen((char *)str),&dest_rect, DT_CENTER | DT_VCENTER | DT_NOCLIP | DT_SINGLELINE); break; case 2: case 3: dest_rect.bottom += 6; dest_rect.top -= 6; DrawText(dest_hdc,str,strlen((char *)str),&dest_rect, DT_LEFT | DT_VCENTER | DT_NOCLIP | DT_SINGLELINE); break; } // not yet done adjusts for 1, 2, 3 } short string_length(char *str,HDC hdc) { short text_len[257]; short total_width = 0,i,len; char p_str[256]; for (i = 0; i < 257; i++) text_len[i]= 0; strcpy((char *) p_str,str); MeasureText(256,p_str,text_len,hdc); len = strlen((char *)str); //print_nums(text_len[1],text_len[2],text_len[3]); //print_nums(text_len[10],text_len[20],text_len[30]); for (i = 0; i < 257; i++) if ((text_len[i] > total_width) && (i <= len)) total_width = text_len[i]; return total_width; } // Note ... this expects a str len of at most 256 and // len_array pointing to a 256 long array of shorts void MeasureText(short str_len,char *str, short *len_array,HDC hdc) { short text_len[257]; short total_width = 0,i,len; char p_str[257]; DWORD val_returned; char *store_array; short *store2; store_array = (char *) len_array; //text_len = len_array; for (i = 0; i < 256; i++) text_len[i] = 0; for (i = 1; i < str_len; i++) { strncpy(p_str,str,i); p_str[i] = 0; val_returned = GetTextExtent(hdc,p_str,i); text_len[i] = LOWORD(val_returned); } for (i = 0; i < 256; i++) { store2 = (short *) store_array; *store2 = text_len[i]; store_array += 2; } } void GetIndString(char *str,short i, short j) { UINT resnum = 0,len; short k; resnum = i * 300 + j; len = LoadString(store_hInstance,resnum,str,256); if (len == 0) { sprintf(str,""); return; } for (k = 0; k < 256; k++) { if (str[k] == '|') str[k] = 13; if (str[k] == '_') str[k] = 34; } } void c2p(char *str) { } void p2c(char *str) { } void get_str(char *str,short i, short j) { if (i == -1) { strcpy((char *) str,scen_item_list.monst_names[j]); return; } if (i == -2) { strcpy((char *) str,scen_item_list.scen_items[j].full_name); return; } if (i == -3) { strcpy((char *) str,button_strs[available_dlog_buttons[j]]); return; } if (i == -4) { strcpy((char *) str,scen_item_list.ter_names[j]); return; } if (i == -5) { get_str(str,40,j * 7 + 1); return; } GetIndString(str, i, j); p2c(str); } short string_length(char *str) { short text_len[257]; short total_width = 0,i,len; char p_str[256]; for (i = 0; i < 257; i++) text_len[i]= 0; strcpy((char *) p_str,str); c2p(p_str); MeasureText(256,p_str,text_len,main_dc); len = strlen((char *)str); for (i = 0; i < 257; i++) if ((text_len[i] > total_width) && (i <= len)) total_width = text_len[i]; return total_width; } void undo_clip(HDC hdc) { // RECT overall_rect = {0,0,530,435}; HRGN rgn; rgn = CreateRectRgn(0,0,5000,5000); SelectClipRgn(hdc,rgn); DeleteObject(rgn); } void ClipRect(HDC hdc,RECT *rect) { HRGN rgn; RECT rect2; rect2 = *rect; // OffsetRect(&rect2,ulx,uly); rgn = CreateRectRgn(rect2.left,rect2.top,rect2.right,rect2.bottom); SelectClipRgn(hdc,rgn); DeleteObject(rgn); } void FlushEvents(short mode) // mode... 0 - keystrokes 1 - mouse presses 2 - both { MSG msg; if ((mode == 0) || (mode == 2)) { while ((PeekMessage(&msg, mainPtr, WM_KEYFIRST, WM_KEYLAST, PM_REMOVE)) != 0) ; } if ((mode == 1) || (mode == 2)) { while ((PeekMessage(&msg, mainPtr, WM_MOUSEFIRST, WM_MOUSELAST, PM_REMOVE)) != 0) ; } } RECT get_custom_rect (short which_rect) //// { RECT store_rect = {0,0,28,36}; OffsetRect(&store_rect,28 * (which_rect % 10),36 * (which_rect / 10)); return store_rect; }