#include #include "stdio.h" #include "string.h" #include "global.h" #include "graphics.h" #include "edsound.h" #include "dlogtool.h" #include "graphutl.h" extern short store_size; /* Adventure globals */ extern party_record_type party; extern pc_record_type adven[6]; extern outdoor_record_type outdoors[2][2]; extern current_town_type c_town; extern big_tr_type t_d; extern stored_items_list_type t_i; extern unsigned char out[96][96]; extern unsigned char out_e[96][96]; extern setup_save_type setup_save; extern stored_items_list_type stored_items[3]; extern stored_town_maps_type maps; extern stored_outdoor_maps_type o_maps; extern HWND mainPtr; extern Boolean play_sounds,file_in_mem; extern short store_flags[3]; extern HBITMAP button_num_gworld; extern short current_active_pc,ulx,uly; extern Boolean dialog_not_toast,party_in_scen; extern char town_strs[180][256]; extern HFONT font,italic_font,underline_font,bold_font,tiny_font,small_bold_font; extern HCURSOR arrow_curs[3][3], sword_curs, boot_curs, key_curs, target_curs,talk_curs,look_curs; //extern HPALETTE hpal; extern HDC main_dc,main_dc2,main_dc3; HBITMAP title_gworld,pc_gworld,dlogpics_gworld,buttons_gworld; HBITMAP dlg_buttons_gworld,mixed_gworld,dialog_pattern_gworld,pattern_gworld; RECT whole_win_rect; RECT title_from = {41,0,380,70}; extern RECT pc_area_buttons[6][4] ; // 0 - whole 1 - pic 2 - name 3 - stat strs 4,5 - later extern RECT item_string_rects[24][4]; // 0 - name 1 - drop 2 - id 3 - extern RECT pc_info_rect; // Frame that holds a pc's basic info and items extern RECT name_rect; extern RECT pc_race_rect; extern RECT info_area_rect; extern RECT hp_sp_rect; extern RECT skill_rect; extern RECT pc_skills_rect[19]; extern RECT status_rect; extern RECT pc_status_rect[10]; extern RECT traits_rect; extern RECT pc_traits_rect[16]; extern RECT edit_rect[5][2]; extern HINSTANCE store_hInstance; short store_str1a; short store_str1b; short store_str2a; short store_str2b; short store_which_string_dlog; short store_page_on,store_num_i; RECT frame_rect = {0,0,605,440}; RECT ed_buttons_from[2] = {{0,0,57,57},{57,0,114,57}}; short current_pressed_button = -1; void init_main_buttons() { short i; short indent = 0, indent2 = 0; RECT base_rect; RECT active_area_rect = {0,0,590,440}; GetClientRect(mainPtr,&whole_win_rect); ulx = (whole_win_rect.right - 600) / 2; uly = (whole_win_rect.bottom - 440) / 2; pc_info_rect= active_area_rect; InflateRect(&pc_info_rect,-100,-100); pc_info_rect.bottom+=52; pc_info_rect.top-=25; pc_info_rect.right+=5; name_rect.left = pc_info_rect.left; name_rect.right = pc_info_rect.left + 100; name_rect.bottom = pc_info_rect.top + 15; name_rect.top = pc_info_rect.top; //Initialize pc_area_buttons pc_area_buttons[0][0].top=pc_info_rect.top; pc_area_buttons[0][0].bottom=pc_area_buttons[0][0].top + 57 ; for(i = 0; i < 6; i++) { pc_area_buttons[i][0].left = 20; pc_area_buttons[i][0].right = pc_area_buttons[0][0].left + 57; pc_area_buttons[i][2].left = 20; pc_area_buttons[i][2].right = pc_area_buttons[i][2].left + 56; pc_area_buttons[i][3].left = 20; pc_area_buttons[i][3].right = pc_area_buttons[i][3].left + 56; pc_area_buttons[i][1].left = 34; pc_area_buttons[i][1].right = pc_area_buttons[i][1].left + 28; pc_area_buttons[i][0].top = pc_area_buttons[0][0].top + 60*i; pc_area_buttons[i][0].bottom = pc_area_buttons[0][0].bottom + 60*i; pc_area_buttons[i][1].top = pc_area_buttons[i][0].top+3; pc_area_buttons[i][1].bottom = pc_area_buttons[i][2].top = pc_area_buttons[i][0].bottom - 18; pc_area_buttons[i][2].bottom = pc_area_buttons[i][3].top = pc_area_buttons[i][0].bottom - 9; pc_area_buttons[i][3].bottom = pc_area_buttons[i][0].bottom; OffsetRect(&pc_area_buttons[i][2],0,4); OffsetRect(&pc_area_buttons[i][3],0,-2); } //Initialize the edit_rect buttons edit_rect[0][0].top = pc_info_rect.top; for(i = 0; i < 5; i++) { if(i >= 2) indent = 7; else indent = 0; if( i == 4) indent2 = 1; edit_rect[i][0].top = edit_rect[0][0].top + 66*i; edit_rect[i][0].bottom = edit_rect[i][0].top + 53; edit_rect[i][0].left = 510; edit_rect[i][0].right = edit_rect[i][0].left + 53; edit_rect[i][1].top = edit_rect[i][0].top + 7 + indent; edit_rect[i][1].bottom = edit_rect[i][0].bottom - 11 - indent; edit_rect[i][1].right = edit_rect[i][0].right - 8 +indent2; edit_rect[i][1].left = edit_rect[i][0].left + 10 + indent2; } //Initialize pc_race_rect pc_race_rect.top = pc_info_rect.top; pc_race_rect.bottom = name_rect.bottom; pc_race_rect.left = name_rect.right; pc_race_rect.right = pc_info_rect.left + (pc_info_rect.right - pc_info_rect.left)/2; //initialize info_area_rect info_area_rect.top = pc_info_rect.top; info_area_rect.left = pc_info_rect.left; info_area_rect.right = pc_race_rect.right; info_area_rect.bottom = pc_info_rect.bottom; // Initialize hp_sp_rect hp_sp_rect.top = name_rect.bottom + 1; hp_sp_rect.left = pc_info_rect.left + 1; hp_sp_rect.right = pc_race_rect.right - 30; hp_sp_rect.bottom = hp_sp_rect.top + 12; for (i = 0; i < 6; i++) { pc_area_buttons[i][3].left = hp_sp_rect.right - 32; pc_area_buttons[i][3].right = pc_area_buttons[i][3].left + 77; pc_area_buttons[i][3].top = hp_sp_rect.top + 1; pc_area_buttons[i][3].bottom = hp_sp_rect.bottom + 1; } // Initialize skill_rect skill_rect.top = hp_sp_rect.bottom + 2; skill_rect.left = pc_info_rect.left + 1; skill_rect.right = pc_race_rect.right; skill_rect.bottom = skill_rect.top + 12; //Initialize skills_rect base_rect.top = skill_rect.bottom + 1; base_rect.left = skill_rect.left + 1; base_rect.right = name_rect.right - 1; base_rect.bottom = base_rect.top + (pc_info_rect.bottom - skill_rect.bottom)/30; for (i = 0; i < 19; i++) { pc_skills_rect[i] = base_rect; OffsetRect(&pc_skills_rect[i], (i / 10) * ((name_rect.right)-(name_rect.left)), (i % 10) * (pc_info_rect.bottom - name_rect.bottom)/30); } //Initialize status_rect status_rect.top = pc_skills_rect[9].bottom + 5; status_rect.left = pc_info_rect.left + 1; status_rect.right = pc_race_rect.right; status_rect.bottom = status_rect.top + 12; //Initialize pc_status_rect base_rect.top = status_rect.bottom + 1; base_rect.left = status_rect.left + 1; base_rect.right = name_rect.right - 1; base_rect.bottom = base_rect.top + (pc_info_rect.bottom - status_rect.bottom)/15; for (i = 0; i < 10; i++) { pc_status_rect[i] = base_rect; OffsetRect(&pc_status_rect[i], (i / 5) * ((name_rect.right)-(name_rect.left)), (i % 5) * (pc_info_rect.bottom - status_rect.bottom)/15); } //Initialize traits_rect traits_rect.top = pc_status_rect[4].bottom + 5; traits_rect.left = pc_info_rect.left + 1; traits_rect.right = pc_race_rect.right; traits_rect.bottom = traits_rect.top + 12; //Initialize pc_traits_rect base_rect.top = traits_rect.bottom - 1; base_rect.left = traits_rect.left + 1; base_rect.right = name_rect.right - 1; base_rect.bottom = base_rect.top + 10; for (i = 0; i < 16; i++) { pc_traits_rect[i] = base_rect; OffsetRect(&pc_traits_rect[i], (i / 7) * ((name_rect.right)-(name_rect.left)), (i % 7) * 10); } item_string_rects[0][0].top = pc_info_rect.top + 3; item_string_rects[0][0].left = pc_info_rect.left + (pc_info_rect.right - pc_info_rect.left)/2; item_string_rects[0][0].right = pc_info_rect.right; item_string_rects[0][0].bottom = item_string_rects[0][0].top + 12; for (i = 1; i < 24; i++) { item_string_rects[i][0] = item_string_rects[0][0]; OffsetRect(&item_string_rects[i][0],0,13 * i); } for (i = 0; i < 24; i++) { item_string_rects[i][1] = item_string_rects[i][0]; item_string_rects[i][1].right -= 14; item_string_rects[i][1].left = item_string_rects[i][1].right - 14; item_string_rects[i][2] = item_string_rects[i][0]; item_string_rects[i][2].left = item_string_rects[i][2].right - 14; } for (i = 0; i < 24; i++) { item_string_rects[i][0].left += 2; item_string_rects[i][0].bottom++; } name_rect.left -= 2; pc_info_rect.left -= 2; info_area_rect.left -= 2; } void Set_up_win () { main_dc = GetDC(mainPtr); dlg_buttons_gworld = load_pict(2000,main_dc); title_gworld = load_pict(5000,main_dc); //SelectPalette(main_dc,hpal,0); SelectObject(main_dc,font); SetBkMode(main_dc,TRANSPARENT); main_dc2 = CreateCompatibleDC(main_dc); SetMapMode(main_dc2,GetMapMode((HDC) mainPtr)); //SelectPalette(main_dc2,hpal,0); main_dc3 = CreateCompatibleDC(main_dc); SetMapMode(main_dc3,GetMapMode((HDC) mainPtr)); //SelectPalette(main_dc3,hpal,0); mixed_gworld = load_pict(903,main_dc); pc_gworld = load_pict(902,main_dc); dlogpics_gworld = load_pict(850,main_dc); buttons_gworld = load_pict(5001,main_dc); pattern_gworld = CreateCompatibleBitmap(main_dc,192,256); dialog_pattern_gworld = CreateCompatibleBitmap(main_dc,192,256); } void lose_graphics() { DeleteObject(title_gworld); DeleteObject(pc_gworld); DeleteObject(mixed_gworld); DeleteObject(dlogpics_gworld); DeleteObject(dlg_buttons_gworld); DeleteObject(pattern_gworld); DeleteObject(dialog_pattern_gworld); //DeleteObject(hpal); DeleteDC(main_dc); DeleteDC(main_dc2); DeleteDC(main_dc3); DeleteObject(font); DeleteObject(underline_font); DeleteObject(italic_font); DeleteObject(bold_font); DeleteObject(sword_curs); } void redraw_screen() { draw_main_screen(); display_party(6,1); draw_items(1); } void draw_main_screen() { RECT source_rect, dest_rec,dest_rect; RECT reg_rect; RECT top_pic_from = {3,16,41,54}; paint_pattern(NULL,3,whole_win_rect,3); dest_rec = source_rect = title_from; OffsetRect(&dest_rec,20,6); rect_draw_some_item (title_gworld,source_rect, title_gworld,dest_rec, 1,1); dest_rec = top_pic_from; OffsetRect(&dest_rec,20,6); rect_draw_some_item (title_gworld,top_pic_from, title_gworld,dest_rec, 0,1); dest_rect = dest_rec; dest_rect.top = dest_rect.bottom; dest_rect.bottom = dest_rect.top + 50; dest_rect.right += 40; dest_rect.left -=5; SelectObject(main_dc,bold_font); char_win_draw_string(main_dc,dest_rect,"Your party:",0,10); dest_rec = whole_win_rect; InflateRect(&dest_rec,-10,-10); if ((ulx >= 5) && (uly >= 5) && (whole_win_rect.right - 30 > frame_rect.right)) frame_dlog_rect(mainPtr,frame_rect,0); frame_dlog_rect(mainPtr,pc_info_rect,0); // draw the frame dest_rect = pc_area_buttons[5][0]; dest_rect.right = whole_win_rect.right - 30; //What is this for? Commenting it out has no effect. dest_rect.left += 60; OffsetRect(&dest_rect,0,21); if (file_in_mem == TRUE) char_win_draw_string(main_dc,dest_rect,"Click on character to edit it.",0,10); else char_win_draw_string(main_dc,dest_rect,"Select Open from File menu.",0,10); OffsetRect(&dest_rect,0,12); if (file_in_mem == TRUE) char_win_draw_string(main_dc,dest_rect,"Press 'I' button to identify item, and 'D' button to drop item.",0,10); OffsetRect(&dest_rect,0,16); if (file_in_mem == TRUE) char_win_draw_string(main_dc,dest_rect,"Back up save file before editing it!",0,10); OffsetRect(&dest_rect,275,0); char_win_draw_string(main_dc,dest_rect,"Released under the GNU GPL, Version 2",0,10); reg_rect.right = pc_info_rect.right + 100; reg_rect.left = reg_rect.right - 170; reg_rect.top = pc_info_rect.top - 70; reg_rect.bottom = pc_info_rect.top; } void do_button_action(short,short which_button) { long dummy; current_pressed_button = which_button; display_party(6,0); play_sound(34); Delay(10,&dummy); current_pressed_button = -1; display_party(6,0); } //extern Rect pc_area_buttons[6][6] ; // 0 - whole 1 - pic 2 - name 3 - stat strs 4,5 - later //extern Rect item_string_rects[24][4]; // 0 - name 1 - drop 2 - id 3 - void draw_items(short clear_first) //short clear_first; // 0 - redraw over, 1 - don't redraw over { short i; char to_draw[256]; RECT d_from = {28,12,42,24},i_from = {42,12,56,24}; if (file_in_mem == FALSE) return; // dest_rect = item_string_rects[0][0]; // dest_rect.bottom += 3; // OffsetRect(&dest_rect,0,-14); if (clear_first == 1) { for (i = 0; i < 24; i++) paint_pattern(NULL,1,item_string_rects[i][0],3); // paint_pattern(NULL,1,dest_rect,3); } // frame_dlog_rect(mainPtr,frame_rect,0); if (adven[current_active_pc].main_status != 1){ frame_dlog_rect(mainPtr,pc_info_rect,0); // re draw entire frame frame_dlog_rect(mainPtr,info_area_rect,0); // draw the frame frame_dlog_rect(mainPtr,pc_race_rect,0); // draw the frame return; // If PC is dead, it has no items } for (i = 0; i < 24; i++) // Loop through items and draw each if (adven[current_active_pc].items[i].variety > 0) { // i.e. does item exist sprintf((char *) to_draw, ""); if (adven[current_active_pc].items[i].item_properties % 2 == 0) sprintf((char *) to_draw, "%d. %s ",i + 1,adven[current_active_pc].items[i].name); else if (adven[current_active_pc].items[i].charges > 0) sprintf((char *) to_draw, "%d. %s (%d)",i + 1,adven[current_active_pc].items[i].full_name, adven[current_active_pc].items[i].charges); else sprintf((char *) to_draw, "%d. %s ",i + 1,adven[current_active_pc].items[i].full_name); char_win_draw_string(main_dc,item_string_rects[i][0],(char *) to_draw,0,10); //Draw id/drop buttons rect_draw_some_item(mixed_gworld,d_from,mixed_gworld,item_string_rects[i][1],1,1); rect_draw_some_item(mixed_gworld,i_from,mixed_gworld,item_string_rects[i][2],1,1); } frame_dlog_rect(mainPtr,pc_info_rect,0); // re draw entire frame frame_dlog_rect(mainPtr,name_rect,0); // draw the frame frame_dlog_rect(mainPtr,pc_race_rect,0); // draw the frame frame_dlog_rect(mainPtr,info_area_rect,0); // draw the frame } void display_party(short,short clear_first) //short mode; // 0 - 5 this pc, 6 - all //short clear_first; // 0 - redraw over, 1 - don't redraw over { short i; char to_draw[256],skill_value[256]; RECT from_base = {0,0,28,36},from_rect; COLORREF colors[4] = {RGB(0,0,0),RGB(255,0,0),RGB(0,0,102),RGB(255,255,255)}; //UINT c[4]; short k,string_num, cur_rect=0; RECT no_party_rect,temp_rect; /*c[0] = GetNearestPaletteIndex(hpal,colors[0]); c[1] = GetNearestPaletteIndex(hpal,colors[1]); c[2] = GetNearestPaletteIndex(hpal,colors[2]); c[3] = GetNearestPaletteIndex(hpal,colors[3]);*/ if (clear_first == 1) { // first erase what's already there for (i = 0; i < 6; i++) paint_pattern(NULL,1,pc_area_buttons[i][0],3); paint_pattern(NULL,1,name_rect,3); paint_pattern(NULL,1,pc_race_rect,3); paint_pattern(NULL,1,info_area_rect,3); frame_dlog_rect(mainPtr,pc_info_rect,0); // re-draw the frame } SelectObject(main_dc,bold_font); if (file_in_mem == FALSE) { no_party_rect=pc_info_rect; no_party_rect.top+=5; no_party_rect.left+=5; char_win_draw_string(main_dc,no_party_rect,"No party loaded.",0,10); } else { char buffer[256]; from_rect = title_from; //draw gold, food and day variables from_rect.top = from_rect.bottom-10; from_rect.left += 57; from_rect.right += 300; if(party_in_scen == FALSE) sprintf(buffer,"Food: %d Gold: %d Day: %ld",party.food,party.gold,(party.age/3700)+1); else{ if(store_flags[0] == 5790) sprintf(buffer,"Food: %d Gold: %d Day: %ld Party is outdoor",party.food,party.gold,(party.age/3700)+1); else sprintf(buffer,"Food: %d Gold: %d Day: %ld Party in %s",party.food,party.gold,(party.age/3700)+1,town_strs[0]); } char_win_draw_string(main_dc,from_rect,buffer,0,10); /* from_rect = title_from; //town variable from_rect.top = from_rect.bottom - 10; from_rect.left += 300; from_rect.right = from_rect.left + 300; if(store_flags[0] == 5790) sprintf(buffer,"Party is outdoor"); else sprintf(buffer,"In Town : %s ",town_strs[0]); char_win_draw_string(main_dc,from_rect,buffer,0,10);*/ from_rect = title_from; from_rect.bottom += 385; from_rect.top = from_rect.bottom - 14; from_rect.left -= 40; from_rect.right = from_rect.left + 604; if (party_in_scen == FALSE) char_win_draw_string(main_dc,from_rect," Party not in a scenario.",0,10); else { char buf[256]; sprintf(buf," Party is in : %s.",party.scen_name); char_win_draw_string(main_dc,from_rect,buf,0,10); } from_rect.left -= 1; from_rect.top -= 1; frame_dlog_rect(mainPtr,from_rect,0); for (i = 0; i < 6; i++) { if (i == current_active_pc) SetTextColor(main_dc,colors[1]); else SetTextColor(main_dc,colors[0]); from_rect = (current_pressed_button == i) ? ed_buttons_from[1] : ed_buttons_from[0]; if ((current_pressed_button < 0) || (current_pressed_button == i)) rect_draw_some_item(buttons_gworld,from_rect,buttons_gworld,pc_area_buttons[i][0],0,1); SetTextColor(main_dc,colors[0]); // pc_record_type adven[6] is the records that contains characters // main_status determins 0 - not exist, 1 - alive, OK, 2 - dead, 3 - stoned, 4 - dust if (adven[i].main_status != 0) { // PC exists? from_rect = from_base; // draw PC graphic OffsetRect(&from_rect,56 * (adven[i].which_graphic / 8),36 * (adven[i].which_graphic % 8)); rect_draw_some_item(pc_gworld,from_rect,pc_gworld,pc_area_buttons[i][1],0,1); frame_dlog_rect(mainPtr,pc_area_buttons[i][1],0); // re-draw the frame //frame_dlog_rect((GrafPtr) mainPtr,pc_area_buttons[i][1],0); // draw name //TextSize(9); if( (strlen(adven[i].name)) >= 0) { //TextFace(0); SelectObject(main_dc,font); sprintf((char *) to_draw, "%-s", (char *) adven[i].name); //TextSize(6); } else { sprintf((char *) to_draw, "%-s", (char *) adven[i].name); } if (i == current_active_pc) SetTextColor(main_dc,colors[1]); else SetTextColor(main_dc,colors[3]); win_draw_string(main_dc,pc_area_buttons[i][2],to_draw,1,10); SelectObject(main_dc,bold_font); if (i == current_active_pc){ sprintf((char *) to_draw, "%-.18s ", (char *) adven[i].name); if( (strlen(adven[i].name)) > 12) SelectObject(main_dc,font); SetTextColor(main_dc,colors[0]); win_draw_string(main_dc,name_rect,to_draw,1,10); SelectObject(main_dc,bold_font); } if ((current_pressed_button < 0) || (current_pressed_button == i)) switch (adven[i].main_status) { // draw statistics case 1: if (i == current_active_pc) { //Draw in race if (adven[i].race == 0) char_win_draw_string(main_dc,pc_race_rect,"Human ",1,10); if (adven[i].race == 1) char_win_draw_string(main_dc,pc_race_rect,"Nephilim ",1,10); if (adven[i].race == 2) char_win_draw_string(main_dc,pc_race_rect,"Slithzerikai ",1,10); // Draw in skills sprintf((char *) to_draw, "Skills:"); win_draw_string(main_dc,skill_rect,to_draw,0,10); sprintf((char *) to_draw, "Hp: %d/%d Sp: %d/%d",adven[i].cur_health,adven[i].max_health,adven[i].cur_sp, adven[i].max_sp); win_draw_string(main_dc,hp_sp_rect,to_draw,0,10); SelectObject(main_dc,font); string_num=1; for( k = 0; k < 19 ; ++k) { temp_rect = pc_skills_rect[k]; temp_rect.left = pc_skills_rect[k].left + ((k < 10) ? 90 : 83); get_str(to_draw,9,string_num); win_draw_string(main_dc,pc_skills_rect[k],to_draw,0,9); sprintf((char *) skill_value,"%d",adven[i].skills[k]); OffsetRect(&temp_rect,-8,0); temp_rect.right += 10; win_draw_string(main_dc,temp_rect,skill_value,0,9); //frame_dlog_rect((GrafPtr) mainPtr,pc_skills_rect[k],0); string_num+=2; } //end skills //Write in pc Status SelectObject(main_dc,bold_font); sprintf((char *) to_draw, "Status:"); win_draw_string(main_dc,status_rect,to_draw,0,10); SelectObject(main_dc,font); //for(k = 0 ; k < 10; k++) //frame_dlog_rect((GrafPtr) mainPtr,pc_status_rect[k],0); if (adven[i].status[0] > 0) if(cur_rect <= 9) { char_win_draw_string(main_dc,pc_status_rect[cur_rect],"Poisoned Weap.",0,9); cur_rect++; } if (adven[i].status[1] > 0) if(cur_rect <= 9) { char_win_draw_string(main_dc,pc_status_rect[cur_rect],"Blessed",0,9); cur_rect++; } else if(adven[i].status[1] < 0) if(cur_rect <= 9) { char_win_draw_string(main_dc,pc_status_rect[cur_rect],"Cursed",0,9); cur_rect++; } if (adven[i].status[2] > 0) if(cur_rect <= 9) { char_win_draw_string(main_dc,pc_status_rect[cur_rect],"Poisoned",0,9); cur_rect++; } if (adven[i].status[3] > 0) if(cur_rect <= 9) { char_win_draw_string(main_dc,pc_status_rect[cur_rect],"Hasted",0,9); cur_rect++; } else if(adven[i].status[3] < 0) if(cur_rect <= 9) { char_win_draw_string(main_dc,pc_status_rect[cur_rect],"Slowed",0,9); cur_rect++; } if (adven[i].status[4] > 0) if(cur_rect <= 9) { char_win_draw_string(main_dc,pc_status_rect[cur_rect],"Invulnerable",0,9); cur_rect++; } if (adven[i].status[5] > 0) if(cur_rect <= 9) { char_win_draw_string(main_dc,pc_status_rect[cur_rect],"Magic Resistant",0,9); cur_rect++; } if (adven[i].status[6] > 0) if(cur_rect <= 9) { char_win_draw_string(main_dc,pc_status_rect[cur_rect],"Webbed",0,9); cur_rect++; } if (adven[i].status[7] > 0) if(cur_rect <= 9) { char_win_draw_string(main_dc,pc_status_rect[cur_rect],"Diseased",0,9); cur_rect++; } if (adven[i].status[8] > 0) if(cur_rect <= 9) { char_win_draw_string(main_dc,pc_status_rect[cur_rect],"Sanctury",0,9); cur_rect++; } if (adven[i].status[9] > 0) if(cur_rect <= 9) { char_win_draw_string(main_dc,pc_status_rect[cur_rect],"Dumbfounded",0,9); cur_rect++; } if (adven[i].status[10] > 0) if(cur_rect <= 9) { char_win_draw_string(main_dc,pc_status_rect[cur_rect],"Martyr's Shield",0,9); cur_rect++; } if (adven[i].status[11] > 0) if(cur_rect <= 9) { char_win_draw_string(main_dc,pc_status_rect[cur_rect],"Asleep",0,9); cur_rect++; } if (adven[i].status[12] > 0) if(cur_rect <= 9) { char_win_draw_string(main_dc,pc_status_rect[cur_rect],"Paralyzed",0,9); cur_rect++; } if (adven[i].status[13] > 0) if(cur_rect <= 9) { char_win_draw_string(main_dc,pc_status_rect[cur_rect],"Acid",0,9); cur_rect++; } //end pc status section //Write in Traits SelectObject(main_dc,bold_font); sprintf((char *) to_draw, "Traits:"); win_draw_string(main_dc,traits_rect,to_draw,0,10); SelectObject(main_dc,font); cur_rect=0; if (adven[i].traits[0] == 1) if(cur_rect <= 15) { char_win_draw_string(main_dc,pc_traits_rect[cur_rect],"Toughness",0,9); cur_rect++; } if (adven[i].traits[1] == 1) if(cur_rect <= 15) { char_win_draw_string(main_dc,pc_traits_rect[cur_rect],"Magically Apt",0,9); cur_rect++; } if (adven[i].traits[2] == 1) if(cur_rect <= 15) { char_win_draw_string(main_dc,pc_traits_rect[cur_rect],"Ambidextrous",0,9); cur_rect++; } if (adven[i].traits[3] == 1) if(cur_rect <= 15) { char_win_draw_string(main_dc,pc_traits_rect[cur_rect],"Nimble Fingers",0,9); cur_rect++; } if (adven[i].traits[4] == 1) if(cur_rect <= 15) { char_win_draw_string(main_dc,pc_traits_rect[cur_rect],"Cave Lore",0,9); cur_rect++; } if (adven[i].traits[5] == 1) if(cur_rect <= 15) { char_win_draw_string(main_dc,pc_traits_rect[cur_rect],"Woodsman",0,9); cur_rect++; } if (adven[i].traits[6] == 1) if(cur_rect <= 15) { char_win_draw_string(main_dc,pc_traits_rect[cur_rect],"Good Constitution",0,9); cur_rect++; } if (adven[i].traits[7] == 1) if(cur_rect <= 15) { char_win_draw_string(main_dc,pc_traits_rect[cur_rect],"Highly Alert",0,9); cur_rect++; } if (adven[i].traits[8] == 1) if(cur_rect <= 15) { char_win_draw_string(main_dc,pc_traits_rect[cur_rect],"Exceptional Str.",0,9); cur_rect++; } if (adven[i].traits[9] == 1) if(cur_rect <= 15) { char_win_draw_string(main_dc,pc_traits_rect[cur_rect],"Recuperation",0,9); cur_rect++; } if (adven[i].traits[10] == 1) if(cur_rect <= 15) { char_win_draw_string(main_dc,pc_traits_rect[cur_rect],"Sluggish",0,9); cur_rect++; } if (adven[i].traits[11] == 1) if(cur_rect <= 15) { char_win_draw_string(main_dc,pc_traits_rect[cur_rect],"Magically Inept",0,9); cur_rect++; } if (adven[i].traits[12] == 1) if(cur_rect <= 14) { char_win_draw_string(main_dc,pc_traits_rect[cur_rect],"Frail",0,9); cur_rect++; } if (adven[i].traits[13] == 1) if(cur_rect <= 14) { char_win_draw_string(main_dc,pc_traits_rect[cur_rect],"Chronic Disease",0,9); cur_rect++; } if (adven[i].traits[14] == 1) if(cur_rect <= 13) { char_win_draw_string(main_dc,pc_traits_rect[cur_rect],"Bad Back",0,9); cur_rect++; } //end traits SetTextColor(main_dc,colors[0]); SelectObject(main_dc,bold_font); char_win_draw_string(main_dc,pc_area_buttons[i][3],"Alive ",1,10); SelectObject(main_dc,bold_font); } break; case 2: if (i == current_active_pc){ SetTextColor(main_dc,colors[0]); SelectObject(main_dc,bold_font); char_win_draw_string(main_dc,pc_area_buttons[i][3],"Dead ",1,10); SelectObject(main_dc,bold_font); break; } case 3: if (i == current_active_pc){ SetTextColor(main_dc,colors[0]); SelectObject(main_dc,bold_font); char_win_draw_string(main_dc,pc_area_buttons[i][3],"Dust ",1,10); SelectObject(main_dc,bold_font); break; } case 4: if (i == current_active_pc){ SetTextColor(main_dc,colors[0]); SelectObject(main_dc,bold_font); char_win_draw_string(main_dc,pc_area_buttons[i][3],"Stone ",1,10); SelectObject(main_dc,bold_font); break; } case 5: if (i == current_active_pc){ SetTextColor(main_dc,colors[0]); SelectObject(main_dc,bold_font); char_win_draw_string(main_dc,pc_area_buttons[i][3],"Fled ",1,10); SelectObject(main_dc,bold_font); break; } case 6: if (i == current_active_pc){ SetTextColor(main_dc,colors[0]); SelectObject(main_dc,bold_font); char_win_draw_string(main_dc,pc_area_buttons[i][3],"Surface ",1,10); SelectObject(main_dc,bold_font); break; } default: if (i == current_active_pc){ SetTextColor(main_dc,colors[0]); SelectObject(main_dc,bold_font); char_win_draw_string(main_dc,pc_area_buttons[i][3],"Absent ",1,10); SelectObject(main_dc,bold_font); break; } } //frame_dlog_rect((GrafPtr) mainPtr,pc_area_buttons[i][0],0); } } // Closes the for i=6 loop SetTextColor(main_dc,colors[0]); for(i = 0; i < 5; i++) if ((current_pressed_button < 0) || (current_pressed_button == i + 10)) { if (clear_first == 1) { // first erase what's already there paint_pattern(NULL,1,edit_rect[i][0],3); } from_rect = (current_pressed_button == i + 10) ? ed_buttons_from[1] : ed_buttons_from[0]; rect_draw_some_item(buttons_gworld,from_rect,buttons_gworld,edit_rect[i][0],0,1); SetTextColor(main_dc,colors[3]); switch(i) { case 0: char_win_draw_string(main_dc,edit_rect[0][1]," Add|Mage|Spells ",0,10); break; case 1: char_win_draw_string(main_dc,edit_rect[1][1]," Add|Priest|Spells ",0,10); break; case 2: char_win_draw_string(main_dc,edit_rect[2][1]," Edit|Traits",0,10); break; case 3: char_win_draw_string(main_dc,edit_rect[3][1]," Edit|Skills",0,10); break; case 4: char_win_draw_string(main_dc,edit_rect[4][1]," Edit| XP",0,10); break; default: break; } SetTextColor(main_dc,colors[0]); } } SetTextColor(main_dc,colors[0]); } void display_strings_event_filter (short item_hit) { switch (item_hit) { case 1: dialog_not_toast = FALSE; break; } } void display_strings(short str1a,short str1b,short str2a,short str2b, char const *title,short sound_num,short graphic_num,short parent_num) { char sign_text[256]; make_cursor_sword(); store_str1a = str1a; store_str1b = str1b; store_str2a = str2a; store_str2b = str2b; if ((str1a <= 0) || (str1b <= 0)) return; store_which_string_dlog = 970; if (strlen(title) > 0) store_which_string_dlog += 2; if ((str2a > 0) && (str2b > 0)) store_which_string_dlog++; cd_create_dialog_parent_num(store_which_string_dlog,parent_num); cd_activate_item(store_which_string_dlog,2,0); csp(store_which_string_dlog,store_which_string_dlog,graphic_num); get_str(sign_text,str1a,str1b); csit(store_which_string_dlog,4,(char *) sign_text); if ((str2a > 0) && (str2b > 0)) { get_str(sign_text,str2a,str2b); csit(store_which_string_dlog,5,(char *) sign_text); } if (strlen(title) > 0) csit(store_which_string_dlog,6,title); csp(store_which_string_dlog,3,graphic_num); if (sound_num >= 0) play_sound(sound_num); while (dialog_not_toast) ModalDialog(); cd_kill_dialog(store_which_string_dlog,0); } void get_str(char *str,short i, short j) { GetIndString(str, i, j); } void char_win_draw_string(HDC dest_window,RECT dest_rect,char const *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) { 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); 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 i; char p_str[257]; SIZE val_returned; char *store_array; short *store2; store_array = (char *) 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; GetTextExtentPoint32(hdc,p_str,i, &val_returned); text_len[i] = val_returned.cx; } 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 make_cursor_sword() { SetCursor(sword_curs); }