//#include //#include //#include //#include #include /*jmr*/ #include "ed.graphics.h" #include "ed.global.h" #include "ed.editors.h" #include "dlogtool.h" /* 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 town_item_list t_i; extern unsigned char out[96][96],out_e[96][96]; extern setup_save_type setup_save; extern stored_items_list_type stored_items[3]; pascal Boolean cd_event_filter (DialogPtr hDlg, EventRecord *event, short *dummy_item_hit); extern short dialog_answer; extern short store_flags[3]; extern Boolean dialog_not_toast; extern short current_active_pc; extern WindowPtr mainPtr; extern Rect d_rects[80]; extern short d_rect_index[80],current_cursor; extern CursHandle sword_curs; extern Boolean modeless_exists[12],diff_depth_ok,current_file_has_maps; extern short modeless_key[12]; extern DialogPtr modeless_dialogs[12]; Boolean equippable[18] = {FALSE,TRUE,TRUE,FALSE,TRUE,TRUE,TRUE,FALSE,FALSE,TRUE,TRUE,TRUE, TRUE,TRUE,TRUE,FALSE,FALSE,TRUE}; short num_hands_to_use[18] = {0,1,2,0,1,1,1,0,0,1,1,0,0,0,0,0,0,0}; short num_that_can_equip[18] = {0,2,1,0,1,1,1,0,0,2,1,1,1,2,1,0,0,1}; short selected,item_max = 0; Boolean choice_active[6]; extern short store_trait_mode; pc_record_type *store_pc; GWorldPtr button_num_gworld; void combine_things(short pc_num) { short i,j,test; for (i = 0; i < 24; i++) { if ((adven[pc_num].items[i].variety > 0) && (adven[pc_num].items[i].type_flag > 0) && (adven[pc_num].items[i].item_properties & 254 != 0)) { for (j = i + 1; j < 24; j++) if ((adven[pc_num].items[j].variety > 0) && (adven[pc_num].items[j].type_flag == adven[pc_num].items[i].type_flag) && (adven[pc_num].items[j].item_properties & 254 != 0)) { add_string_to_buf("(items combined)"); test = (short) (adven[pc_num].items[i].charges) + (short) (adven[pc_num].items[j].charges); if (test > 125) { adven[pc_num].items[i].charges = 125; ASB("Can have at most 125 of any item."); } else adven[pc_num].items[i].charges += adven[pc_num].items[j].charges; if (adven[pc_num].equip[j] == TRUE) { adven[pc_num].equip[i] = TRUE; adven[pc_num].equip[j] = FALSE; } take_item(pc_num,j); } } if ((adven[pc_num].items[i].variety > 0) && (adven[pc_num].items[i].charges < 0)) adven[pc_num].items[i].charges = 1; } } Boolean give_to_pc(short pc_num,item_record_type item, short print_result) { short free_space; char announce_string[60]; if (item.variety == 0) return TRUE; if (((free_space = pc_has_space(pc_num)) == 24 ) || (adven[pc_num].main_status != 1)) return FALSE; else { adven[pc_num].items[free_space] = item; combine_things(pc_num); return TRUE; } return FALSE; } Boolean give_to_party(item_record_type item,short print_result) { short free_space, i = 0; while (i < 6) { if (give_to_pc(i,item,print_result) == TRUE) return TRUE; i++; } return FALSE; } void give_gold(short amount,Boolean print_result) { party.gold = party.gold + amount; } Boolean take_gold(short amount,Boolean print_result) { if (party.gold < amount) return FALSE; party.gold = party.gold - amount; return TRUE; } short pc_has_space(short pc_num) { short i = 0; while (i < 24) { if (adven[pc_num].items[i].variety == 0) return i; i++; } return 24; } void take_item(short pc_num,short which_item) //short pc_num,which_item; // if which_item > 20, don't update stat win, item is which_item - 20 { short i; Boolean do_print = TRUE; if ((adven[pc_num].weap_poisoned == which_item) && (adven[pc_num].status[0] > 0)) { // add_string_to_buf(" Poison lost. "); adven[pc_num].status[0] = 0; } if ((adven[pc_num].weap_poisoned > which_item) && (adven[pc_num].status[0] > 0)) adven[pc_num].weap_poisoned--; for (i = which_item; i < 23; i++) { adven[pc_num].items[i] = adven[pc_num].items[i + 1]; adven[pc_num].equip[i] = adven[pc_num].equip[i + 1]; } adven[pc_num].items[23].variety = 0; adven[pc_num].equip[23] = FALSE; } void fancy_choice_dialog_event_filter (short item_hit) { dialog_not_toast = FALSE; dialog_answer = item_hit; } short fancy_choice_dialog(short which_dlog,short parent) // ignore parent in Mac version { short item_hit,i,store_dialog_answer; Str255 temp_str; store_dialog_answer = dialog_answer; make_cursor_sword(); cd_create_dialog_parent_num(which_dlog,parent); #ifndef EXILE_BIG_GUNS while (dialog_not_toast) ModalDialog((ModalFilterProcPtr) cd_event_filter, &item_hit); #endif #ifdef EXILE_BIG_GUNS while (dialog_not_toast) ModalDialog(main_dialog_UPP, &item_hit); #endif cd_kill_dialog(which_dlog,0); i = dialog_answer; dialog_answer = store_dialog_answer; return i; } void select_pc_event_filter (short item_hit) { dialog_not_toast = FALSE; if (item_hit == 16) dialog_answer = 6; else dialog_answer = item_hit - 3; } short char_select_pc(short active_only,short free_inv_only,char *title) //active_only; // 0 - no 1 - yes 2 - disarm trap { short item_hit,i; make_cursor_sword(); cd_create_dialog(1018,(DialogPtr)mainPtr); if (active_only == 2) csit(1018,15,"Select PC to disarm trap:"); else csit( 1018,15,title); for (i = 0; i < 6; i++) { if ((adven[i].main_status == 0) || ((active_only == TRUE) && (adven[i].main_status > 1)) || ((free_inv_only == 1) && (pc_has_space(i) == 24)) || (adven[i].main_status == 5)) { cd_activate_item(1018, 3 + i, 0); } if (adven[i].main_status != 0) { csit(1018,9 + i,adven[i].name); } else cd_activate_item(1018, 9 + i, 0); } #ifndef EXILE_BIG_GUNS while (dialog_not_toast) ModalDialog((ModalFilterProcPtr) cd_event_filter, &item_hit); #endif #ifdef EXILE_BIG_GUNS while (dialog_not_toast) ModalDialog(main_dialog_UPP, &item_hit); #endif cd_kill_dialog(1018,0); return dialog_answer; } short select_pc(short active_only,short free_inv_only) //active_only; // 0 - no 1 - yes 2 - disarm trap { if (active_only == 2) return char_select_pc(active_only,free_inv_only,"Trap! Who will disarm?"); else return char_select_pc(active_only,free_inv_only,"Select a character:"); } // only used at beginning of program short choice_dialog(short pic,short num) { DialogPtr select_dialog = NULL; short the_type; Handle the_handle = NULL; Rect the_rect; short item_hit,i; Str255 pc_name; GrafPtr old_port; PicHandle pict_to_draw; select_dialog = GetNewDialog (num, 0, IN_FRONT); if (select_dialog == NULL) { SysBeep(50); ExitToShell(); } SetPort(GetDialogPort(select_dialog)); ShowWindow(GetDialogWindow(select_dialog)); //if (pic > 0) // put_dialog_graphic(pic,0,the_rect); ModalDialog(NIL, &item_hit); DisposeDialog(select_dialog); // SetPort(GetWindowPort(mainPtr)); // BeginUpdate(mainPtr); // if (in_startup_mode == FALSE) // refresh_screen(0); // else draw_startup(0); // EndUpdate(mainPtr); return item_hit; } short party_total_level() { short i,j = 0; for (i = 0; i < 6; i++) if (adven[i].main_status == 1) j += adven[i].level; return j; } short luck_total() { short i = 0; for (i = 0; i < 6; i++) if (adven[i].main_status == 1) i += adven[i].skills[18]; return i; } void display_traits_graphics() { short i,store; Str255 str; for (i = 0; i < 3; i++) { cd_set_led(1013,4 + i,(store_pc->race == i) ? 1 : 0); } for (i = 0; i < 10; i++) { cd_set_led(1013,7 + i,(store_pc->traits[i] > 0) ? 1 : 0); } for (i = 0; i < 5; i++) { cd_set_led(1013,36 + i,(store_pc->traits[10 + i] > 0) ? 1 : 0); } store = get_tnl(store_pc); cdsin(1013,18,store); } void pick_race_abil_event_filter(short item_hit) { Str255 abil_str; pc_record_type *pc; pc = store_pc; switch (item_hit) { case 3: dialog_not_toast = FALSE; break; case 4: case 5: case 6: if (store_trait_mode == 0) pc->race = item_hit - 4; display_traits_graphics(); get_str(abil_str,5,12 + item_hit); csit(1013,19,(char *) abil_str); break; case 36: case 37: case 38: case 39: case 40: if (store_trait_mode != 1) pc->traits[item_hit - 36 + 10] = (pc->traits[item_hit - 36 + 10] == TRUE) ? FALSE : TRUE; display_traits_graphics(); get_str(abil_str,5,item_hit - 36 + 11); csit(1013,19,(char *) abil_str); break; default: if (item_hit >= 100) return; if (store_trait_mode != 1) pc->traits[item_hit - 7] = (pc->traits[item_hit - 7] == TRUE) ? FALSE : TRUE; display_traits_graphics(); get_str(abil_str,5,item_hit - 6); csit(1013,19,(char *) abil_str); break; } } void pick_race_abil(pc_record_type *pc,short mode,short parent_num) //mode; // 0 - edit 1 - just display 2 - can't change race { char *start_str1 = "Click on advantage button for description."; char *start_str2 = "Click on advantage button to add/lose."; short item_hit; mode = 0; store_trait_mode = mode; store_pc = pc; make_cursor_sword(); cd_create_dialog_parent_num(1013,parent_num); display_traits_graphics(); if (mode == 1) csit(1013,19,start_str1); else csit(1013,19,start_str2); #ifndef EXILE_BIG_GUNS while (dialog_not_toast) ModalDialog((ModalFilterProcPtr) cd_event_filter, &item_hit); #endif #ifdef EXILE_BIG_GUNS while (dialog_not_toast) ModalDialog(main_dialog_UPP, &item_hit); #endif cd_kill_dialog(1013,0); dialog_not_toast = TRUE; } short get_tnl(pc_record_type *pc) { short tnl = 100,i,store_per = 100; short rp[3] = {0,12,20}; short ap[15] = {10,20,8,10,4, 6,10,7,12,15, -10,-8,-8,-20,-8}; tnl = (tnl * (100 + rp[pc->race])) / 100; for (i = 0; i < 15; i++) if (pc->traits[i] == TRUE) store_per = store_per + ap[i]; tnl = (tnl * store_per) / 100; return tnl; } //display_strings(20,7,0,0,"Editing party",57,707,916);