From 6af129c2774a6bf6ad9387232f42c58133163172 Mon Sep 17 00:00:00 2001 From: Celtic Minstrel Date: Sun, 28 Jun 2009 17:18:24 +0000 Subject: [PATCH] - Nuked the storage_gworld and party_template_gworld. Monster, terrain, and PC graphics are now drawn directly from their sheets of origin. This is partly tested, and seems to work fine. - Removed the terrain_pic and terrain_blockage arrays, which were redundant (though shorter). - Cleaned out some of the commented code in boe.graphics.cpp and boe.graphutil.cpp - Added a templated get function to cOutdoors::cWandering. In the dialog engine: - Important fields are now initialized to default values, as they should be. - The absence of required attributes is now recognized as an error - Added stack element to the DTD; no code support yet - Added fore attribute to the dialog element to specify default text colour; DTD updated and code support added. - Likewise with the def-key attribute on other clickable items besides buttons (which already had it) - Updated stylesheet to fall back on the fore attribute when colour is unspecified - When drawing default monster graphics, it uses m_start_pic instead of num as the index. This should be right, though it's untested. Unfortunately, the dialog engine is still unstable. git-svn-id: http://openexile.googlecode.com/svn/trunk@100 4ebdad44-0ea0-11de-aab3-ff745001d230 --- osx/Blades of Exile Char Editor/pc.global.h | 2 +- osx/boe.actions.cpp | 3 - osx/boe.combat.cpp | 2 - osx/boe.dlgutil.cpp | 7 +- osx/boe.fields.cpp | 3 +- osx/boe.fileio.cpp | 37 +- osx/boe.fileio.h | 2 +- osx/boe.global.h | 2 +- osx/boe.graphics.cpp | 631 +------------------- osx/boe.graphics.h | 16 - osx/boe.graphutil.cpp | 377 ++++-------- osx/boe.graphutil.h | 4 - osx/boe.locutils.cpp | 52 +- osx/boe.locutils.h | 2 +- osx/boe.main.cpp | 13 +- osx/boe.monster.cpp | 5 - osx/boe.party.cpp | 12 +- osx/boe.startup.cpp | 2 - osx/boe.text.cpp | 20 +- osx/boe.text.h | 2 +- osx/boe.town.cpp | 13 +- osx/classes.h | 6 + osx/classes/monster.h | 4 +- osx/classes/outdoors.h | 1 + osx/classes/pc.h | 2 +- osx/dialogxml/button.cpp | 21 +- osx/dialogxml/control.cpp | 7 +- osx/dialogxml/dialog.cpp | 188 ++++-- osx/dialogxml/dialog.dtd | 33 +- osx/dialogxml/dialog.h | 19 +- osx/dialogxml/dialog.xsl | 6 +- osx/dialogxml/edit-terrain.xml | 2 +- osx/dialogxml/field.cpp | 4 +- osx/dialogxml/message.cpp | 9 +- osx/dialogxml/pict.cpp | 6 +- 35 files changed, 395 insertions(+), 1120 deletions(-) diff --git a/osx/Blades of Exile Char Editor/pc.global.h b/osx/Blades of Exile Char Editor/pc.global.h index da64e953..d5389bbf 100644 --- a/osx/Blades of Exile Char Editor/pc.global.h +++ b/osx/Blades of Exile Char Editor/pc.global.h @@ -15,7 +15,7 @@ #define BITMAP_WIDTH 28 #define BITMAP_HEIGHT 36 -#define STORED_GRAPHICS 240 +//#define STORED_GRAPHICS 240 #define PC_WIN_UL_X 291 #define PC_WIN_UL_Y 5 diff --git a/osx/boe.actions.cpp b/osx/boe.actions.cpp index 70033492..6378927c 100644 --- a/osx/boe.actions.cpp +++ b/osx/boe.actions.cpp @@ -1790,8 +1790,6 @@ bool handle_keystroke(char chr,char chr2,EventRecord event) break; case '`': - //break; - dump_gworld(); break; case '[': //break; @@ -2342,7 +2340,6 @@ void switch_pc(short which) else if (current_pc == which) current_pc = current_switch; set_stat_window(current_pc); - update_pc_graphics(); current_switch = 6; } } diff --git a/osx/boe.combat.cpp b/osx/boe.combat.cpp index 4f35e4a7..37962b45 100644 --- a/osx/boe.combat.cpp +++ b/osx/boe.combat.cpp @@ -399,7 +399,6 @@ void start_outdoor_combat(cOutdoors::cCreature encounter,ter_num_t in_which_terr set_pc_moves(); pick_next_pc(); center = pc_pos[current_pc]; - load_area_graphics(); draw_buttons(0); put_pc_screen(); set_stat_window(current_pc); @@ -4039,7 +4038,6 @@ void end_combat() } if (which_combat_type == 0) { overall_mode = MODE_OUTDOORS; - load_area_graphics(); } combat_active_pc = 6; current_pc = store_current_pc; diff --git a/osx/boe.dlgutil.cpp b/osx/boe.dlgutil.cpp index 61fcde72..bb1b0b8a 100644 --- a/osx/boe.dlgutil.cpp +++ b/osx/boe.dlgutil.cpp @@ -58,9 +58,6 @@ extern cUniverse univ; //extern talking_record_type talking; extern GWorldPtr pc_gworld; - -short terrain_pic[256]; - extern cScenarioList scen_headers; short sign_mode,person_graphic,store_person_graphic,store_sign_mode; @@ -1130,8 +1127,8 @@ void do_sign(short town_num, short which_sign, short sign_type,location sign_loc cd_create_dialog(1014,mainPtr); store_sign_mode = sign_type; - if (terrain_pic[sign_type] < 1000) - csp(1014,3,terrain_pic[sign_type],PICT_TER); + if (scenario.ter_types[sign_type].picture < 1000) + csp(1014,3,scenario.ter_types[sign_type].picture,PICT_TER); else csp(1014,3,94,PICT_TER); if (town_num >= 200) { diff --git a/osx/boe.fields.cpp b/osx/boe.fields.cpp index e260c107..0d12516b 100644 --- a/osx/boe.fields.cpp +++ b/osx/boe.fields.cpp @@ -19,7 +19,6 @@ extern bool sleep_field; extern ter_num_t combat_terrain[64][64]; //extern unsigned char out[96][96], univ.out.out_e[96][96]; //extern unsigned char univ.out.misc_i[64][64],univ.out.sfx[64][64]; -extern char terrain_blocked[256]; //extern short town_size[3]; extern cScenario scenario; extern cUniverse univ; @@ -393,7 +392,7 @@ void make_sfx(short i,short j, short type) if (get_obscurity(i,j) > 0) return; ter = coord_to_ter(i,j); - if (terrain_blocked[ter] != 0) + if (scenario.ter_types[ter].blockage != 0) return; switch (type) { // case 1: case 2: diff --git a/osx/boe.fileio.cpp b/osx/boe.fileio.cpp index 5ab83e66..16c0b317 100644 --- a/osx/boe.fileio.cpp +++ b/osx/boe.fileio.cpp @@ -57,8 +57,7 @@ extern bool modeless_exists[18]; //extern location monster_targs[60]; extern DialogPtr modeless_dialogs[18] ; extern short which_combat_type; -extern char terrain_blocked[256]; -extern short terrain_pic[256],cur_town_talk_loaded; +extern short cur_town_talk_loaded; extern cScenario scenario; extern cUniverse univ; //extern piles_of_stuff_dumping_type *data_store; @@ -193,8 +192,6 @@ void finish_load_party(){ // graphics wise end_startup(); - set_up_ter_pics(); - load_outdoors(loc(univ.party.outdoor_corner.x + 1,univ.party.outdoor_corner.y + 1),univ.out.outdoors[1][1]); load_outdoors(loc(univ.party.outdoor_corner.x,univ.party.outdoor_corner.y + 1),univ.out.outdoors[0][1]); load_outdoors(loc(univ.party.outdoor_corner.x + 1,univ.party.outdoor_corner.y),univ.out.outdoors[1][0]); @@ -205,12 +202,10 @@ void finish_load_party(){ stat_screen_mode = 0; build_outdoors(); erase_out_specials(); - update_pc_graphics(); if (!town_restore) { center = univ.party.p_loc; - load_area_graphics(); } else { load_town_str(univ.town.num,univ.town.record); @@ -250,7 +245,6 @@ void finish_load_party(){ blade_wall = true; sleep_field = true; center = univ.town.p_loc; - load_area_graphics(); } create_clip_region(); @@ -628,10 +622,6 @@ void shift_universe_left() load_outdoors(loc(univ.party.outdoor_corner.x,univ.party.outdoor_corner.y),univ.out.outdoors[0][0]); load_outdoors(loc(univ.party.outdoor_corner.x,univ.party.outdoor_corner.y + 1),univ.out.outdoors[0][1]); build_outdoors(); - - - // reload graphics -- who knows what we added - load_area_graphics(); make_cursor_sword(); } @@ -666,9 +656,6 @@ void shift_universe_right() load_outdoors(loc(univ.party.outdoor_corner.x + 1,univ.party.outdoor_corner.y),univ.out.outdoors[1][0]); load_outdoors(loc(univ.party.outdoor_corner.x + 1,univ.party.outdoor_corner.y + 1),univ.out.outdoors[1][1]); build_outdoors(); - - // reload graphics -- who knows what we added - load_area_graphics(); make_cursor_sword(); } @@ -704,9 +691,6 @@ void shift_universe_up() load_outdoors(loc(univ.party.outdoor_corner.x + 1,univ.party.outdoor_corner.y),univ.out.outdoors[1][0]); build_outdoors(); - - // reload graphics -- who knows what we added - load_area_graphics(); make_cursor_sword(); } @@ -743,9 +727,6 @@ void shift_universe_down() load_outdoors(loc(univ.party.outdoor_corner.x + 1,univ.party.outdoor_corner.y + 1),univ.out.outdoors[1][1]); build_outdoors(); - - // reload graphics -- who knows what we added - load_area_graphics(); make_cursor_sword(); } @@ -1118,14 +1099,14 @@ void end_data_dump() // return true; //} -void set_up_ter_pics() -{ - short i; - - set_terrain_blocked(); - for (i = 0; i < 256; i++) - terrain_pic[i] = scenario.ter_types[i].picture; -} +//void set_up_ter_pics() +//{ +// short i; +// +// set_terrain_blocked(); +// for (i = 0; i < 256; i++) +// terrain_pic[i] = scenario.ter_types[i].picture; +//} //void oops_error(short error) //{ // Str255 error_str; diff --git a/osx/boe.fileio.h b/osx/boe.fileio.h index e1578451..d8033688 100644 --- a/osx/boe.fileio.h +++ b/osx/boe.fileio.h @@ -27,7 +27,7 @@ void start_data_dump(); void end_data_dump(); void set_terrain(location l, ter_num_t terrain_type); //void oops_error(short error); -void set_up_ter_pics(); +//void set_up_ter_pics(); //bool load_scenario(); short onm(char x_sector,char y_sector); void build_scen_headers(); diff --git a/osx/boe.global.h b/osx/boe.global.h index 34b9f55f..14493b9a 100644 --- a/osx/boe.global.h +++ b/osx/boe.global.h @@ -15,7 +15,7 @@ #define BITMAP_WIDTH 28 #define BITMAP_HEIGHT 36 -#define STORED_GRAPHICS 240 +//#define STORED_GRAPHICS 240 #define PC_WIN_UL_X 291 #define PC_WIN_UL_Y 5 diff --git a/osx/boe.graphics.cpp b/osx/boe.graphics.cpp index 790694a9..c9add238 100644 --- a/osx/boe.graphics.cpp +++ b/osx/boe.graphics.cpp @@ -34,14 +34,7 @@ extern short stat_window,give_delays; extern eGameMode overall_mode; extern short current_spell_range,town_type,store_anim_type; extern bool in_startup_mode,anim_onscreen,play_sounds,frills_on,startup_loaded,party_in_memory; -//extern short town_size[3]; extern short anim_step; -//extern party_record_type univ.party; -//extern big_tr_type t_d; -//extern cOutdoors univ.out.outdoors[2][2]; -//extern current_town_type univ.town; -//extern town_item_list t_i; -//extern unsigned char univ.out[96][96],out_e[96][96]; extern ter_num_t combat_terrain[64][64]; extern effect_pat_type current_pat; extern bool web,crate,barrel,fire_barrier,force_barrier,quickfire,force_wall,fire_wall,antimagic,scloud,ice_wall,blade_wall; @@ -51,8 +44,6 @@ extern short which_combat_type,current_pc; extern bool monsters_going,boom_anim_active,cartoon_happening,skip_boom_delay; extern PicHandle spell_pict; extern short current_ground; -extern short terrain_pic[256]; -//extern short pc_moves[6]; extern short num_targets_left; extern location spell_targets[8]; extern short display_mode; @@ -65,27 +56,14 @@ extern Point store_anim_ul; extern long register_flag; extern long ed_flag,ed_key; extern bool fast_bang; -//extern unsigned char m_pic_index[200]; extern Rect bg[]; extern KeyMap key_state; extern bool fry_startup; -//extern piles_of_stuff_dumping_type *data_store; extern cScenario scenario; extern cUniverse univ; -//extern outdoor_strs_type outdoor_text[2][2]; extern GWorldPtr spec_scen_g; extern DialogPtr modeless_dialogs[18]; extern bool modeless_exists[18]; -//extern dlg_filter_t give_password_filter,pick_prefab_scen_event_filter,pick_a_scen_event_filter,tip_of_day_event_filter; -//extern dlg_filter_t talk_notes_event_filter,adventure_notes_event_filter,journal_event_filter,display_strings_event_filter; -//extern dlg_filter_t display_strings_event_filter,display_strings_event_filter,display_strings_event_filter; -//extern dlg_filter_t display_item_event_filter,pick_trapped_monst_event_filter,edit_party_event_filter,display_pc_event_filter; -//extern dlg_filter_t display_alchemy_event_filter,display_help_event_filter,display_pc_item_event_filter,display_monst_event_filter; -//extern dlg_filter_t spend_xp_event_filter,get_num_of_items_event_filter,pick_race_abil_event_filter,sign_event_filter; -//extern dlg_filter_t get_text_response_event_filter,get_text_response_event_filter,select_pc_event_filter; -//extern dlg_filter_t give_pc_info_event_filter,alch_choice_event_filter,pc_graphic_event_filter,pc_name_event_filter; -//extern dlg_filter_t give_reg_info_event_filter,do_registration_event_filter,display_spells_event_filter; -//extern dlg_filter_t display_skills_event_filter,pick_spell_event_filter,prefs_event_filter,fancy_choice_dialog_event_filter; extern bool show_startup_splash; RgnHandle clip_region; @@ -135,12 +113,10 @@ GWorldPtr vehicle_gworld = NULL; GWorldPtr pc_stats_gworld = NULL; GWorldPtr item_stats_gworld = NULL; GWorldPtr text_area_gworld = NULL; -GWorldPtr storage_gworld = NULL; // TODO: Abolish GWorldPtr terrain_screen_gworld = NULL; GWorldPtr text_bar_gworld = NULL; GWorldPtr orig_text_bar_gworld = NULL; GWorldPtr buttons_gworld = NULL; -GWorldPtr party_template_gworld = NULL; GWorldPtr items_gworld = NULL; GWorldPtr tiny_obj_gworld = NULL; GWorldPtr fields_gworld = NULL; @@ -162,13 +138,6 @@ GWorldPtr startup_button_orig = NULL; GWorldPtr startup_button_g = NULL; GWorldPtr anim_mess = NULL; -// Graphics storage vals -short which_g_stored[STORED_GRAPHICS]; -// 0 - 299 terrain graphic 300 + i monster graphic i, face right 600 + i face left -// 1000 + 100 * j + i anim i pos j 2300 + i combat monster graphic i, face right 2600 + i face left -short wish_list[STORED_GRAPHICS]; -short storage_status[STORED_GRAPHICS]; // 0 - empty 1 - in use 2 - there, not in use - bool has_run_anim = false,currently_loading_graphics = false; //short anim_step = 0; //short overall_anim_step = 0; @@ -187,9 +156,6 @@ Rect share_mess_source_rect = {0,0,59,120}, Rect start_buttons_source_rect = {0,0,186,190}, start_buttons_rect = {214,30,400,220}; -// Variables to store trim. Makes game faster, but wastes 15K. We'll see how it works... -//char out_trim[96][96],town_trim[64][64]; - // Array to store which spots have been seen. Time-saver for drawing fields char spot_seen[9][9]; @@ -219,18 +185,10 @@ void init_dialogs(){ &small_ter_gworld, &fields_gworld, &pc_stats_gworld, - &item_stats_gworld,/* - &text_area_gworld, - &storage_gworld, - &terrain_screen_gworld, - &text_bar_gworld, - &orig_text_bar_gworld, - &buttons_gworld, - &party_template_gworld,*/ + &item_stats_gworld, NULL, &spec_scen_g ); - //cd_register_event_filter(823,give_password_filter); cd_register_event_filter(869,pick_prefab_scen_event_filter); cd_register_event_filter(947,pick_a_scen_event_filter); cd_register_event_filter(958,tip_of_day_event_filter); @@ -263,7 +221,6 @@ void init_dialogs(){ cd_register_event_filter(1098,pick_spell_event_filter ); cd_register_event_filter(1099,prefs_event_filter ); cd_register_default_event_filter(fancy_choice_dialog_event_filter); - //return &tmp; } void adjust_window_mode() @@ -290,7 +247,7 @@ void adjust_window_mode() } create_clip_region(); undo_clip(); - if (overall_mode != MODE_STARTUP) { // TODO: This is odd ‚Äì fix it + if (overall_mode != MODE_STARTUP) { // TODO: This is odd - fix it if (in_startup_mode == true) draw_startup(0); if (in_startup_mode == false) @@ -367,12 +324,7 @@ void plop_fancy_startup() SetPort(oldPort); */ } - // initialize buffers and rects TODO: Not needed - for (i = 0; i < STORED_GRAPHICS; i++) { - which_g_stored[i] = (i < 50) ? i : 0; - wish_list[i] = 0; - storage_status[i] = (i < 50) ? 1 : 0; - } + // for (i = 0;i < 8; i++) // OffsetRect(&trim_rects[i],61,37); for (i = 0; i < 9; i++) @@ -517,11 +469,6 @@ void fancy_startup_delay() void init_startup() { startup_loaded = true; - -// startup_gworld = load_pict(830); -// startup_button_orig = load_pict(832); -// startup_button_g = load_pict(832); -// anim_mess = load_pict(831); startup_gworld = load_pict("startup.png"); startup_button_orig = load_pict("startbut.png"); startup_button_g = load_pict("startbut.png"); @@ -589,7 +536,7 @@ void draw_startup_anim() void draw_startup_stats() { - Rect from_rect,to_rect,party_from = {0,0,36,28},pc_rect,frame_rect; + Rect from_rect,to_rect,party_to = {0,0,36,28},pc_rect,frame_rect; short i; Str255 str; @@ -627,11 +574,10 @@ void draw_startup_stats() OffsetRect(&pc_rect,60 + 232 * (i / 3) - 9,95 + 45 * (i % 3)); if (univ.party[i].main_status > 0) { - from_rect = party_from; - OffsetRect(&from_rect,56 * (i / 3),36 * (i % 3)); - to_rect = party_from, + from_rect = calc_rect(2 * (univ.party[i].which_graphic / 8), univ.party[i].which_graphic % 8); + to_rect = party_to, OffsetRect(&to_rect,pc_rect.left,pc_rect.top); - rect_draw_some_item(party_template_gworld,from_rect,to_rect,ul,transparent); + rect_draw_some_item(pc_gworld,from_rect,to_rect,ul,transparent); TextSize(14); OffsetRect(&pc_rect,35,0); @@ -826,39 +772,8 @@ void Set_up_win () GetFNum(fn2,&dungeon_font_num); if (dungeon_font_num == 0) GetFNum(fn3,&dungeon_font_num); - - temp_rect.bottom = (STORED_GRAPHICS / 10) * 36; - err = NewGWorld(&storage_gworld, 0 /*8*/,&temp_rect, NULL, NULL, kNativeEndianPixMap); - if (err != 0) { - SysBeep(2); - ExitToShell(); - } - // TODO: This relates to the storage gworld, and hence should be abolished - temp_gworld = load_pict("ter1.png"); - GetPortBounds(temp_gworld, &r); - rect_draw_some_item(temp_gworld,r,storage_gworld,r); - DisposeGWorld(temp_gworld); terrain_screen_gworld = load_pict("terscreen.png"); - err = NewGWorld(&party_template_gworld, 0 /*8*/,&pc_rect, NULL, NULL, kNativeEndianPixMap); - if (err != 0) - SysBeep(2); - // TODO: These should be loaded later, when a scenario is loaded. Exceptions: dialog pictures and pc graphics -// items_gworld = load_pict(901); -// tiny_obj_gworld = load_pict(900); -// fields_gworld = load_pict(821); -// roads_gworld = load_pict(822); -// boom_gworld = load_pict(823); -// missiles_gworld = load_pict(880); -// dlogpics_gworld = load_pict(850); -// -// // possibly not ideal place for this, but... -// for (i = 0; i < 11; i++) -// monst_gworld[i] = load_pict(1100 + i); -// for (i = 0; i < 7; i++) -// terrain_gworld[i] = load_pict(800 + i); -// anim_gworld = load_pict(820); -// talkfaces_gworld = load_pict(860); for (i = 0; i < 7; i++) bw_pats[i] = GetPattern(128 + i * 2); @@ -1030,38 +945,6 @@ void redraw_screen(){ } } -//void refresh_screen(short mode) -//{ -// if (overall_mode == MODE_TALKING) { -// put_background(); -// refresh_talking(); -// } -// else if (overall_mode == MODE_SHOPPING) { -// put_background(); -// refresh_shopping(); -// } -// else { -// draw_buttons(0); -// redraw_terrain(); -// if (overall_mode == MODE_COMBAT) -// draw_pcs(pc_pos[current_pc],1); -// if (overall_mode == MODE_FANCY_TARGET) -// draw_targets(center); -// draw_text_bar(1); -// } -// -// draw_text_area(0); -// ShowControl(text_sbar); -// Draw1Control(text_sbar); -// ShowControl(item_sbar); -// Draw1Control(item_sbar); -// if (overall_mode == MODE_SHOPPING) { -// ShowControl(shop_sbar); -// Draw1Control(shop_sbar); -// } -// else HideControl(shop_sbar); -//} - void put_background() { Rect bg_pict; @@ -1268,458 +1151,6 @@ void put_text_bar(char *str) rect_draw_some_item (text_bar_gworld, win_from_rects[4], win_to_rects[4],ul); } -// This is called when a new situation is entered. It figures out what graphics are needed, -// sets up which_g_stored, and loads them. -void load_area_graphics() -{ - short i; - - currently_loading_graphics = true; - - // Set all graphics as loseable - for (i = 50; i < STORED_GRAPHICS; i++) - if (storage_status[i] == 1) - storage_status[i] = 2; - for (i = 0; i < STORED_GRAPHICS; i++) - wish_list[i] = 0; - - // Build wish list - if (is_out()) - load_outdoor_graphics(); - if ((is_town()) || (is_combat())) - load_town_graphics(); - - // Reserve all in wish list not taken - for (i = 0; i < STORED_GRAPHICS; i++) - if (wish_list[i] > 49) - if (reserve_graphic_num_in_array(wish_list[i]) == true) - wish_list[i] = 0; - - // Place all graphics not found in array. - for (i = 0; i < STORED_GRAPHICS; i++) - if (wish_list[i] > 49) { - place_graphic_num_in_array(wish_list[i]); - wish_list[i] = 0; - } - - // Finally, load graphics. - put_graphics_in_template(); - - currently_loading_graphics = false; -} - -void add_to_wish_list(short which_g) -{ - short i; - - - if (which_g < 50) - return; - for (i = 0; i < STORED_GRAPHICS; i++) { - if (wish_list[i] == which_g) - return; - if (wish_list[i] == 0) { - wish_list[i] = which_g; - return; - } - } - add_string_to_buf("No room for graphic."); -} - -// Used to set up array. If graphic there, sets it to be saved, otherwise leaves. -// Returns true is already there -bool reserve_graphic_num_in_array(short which_g) -{ - short i; - - if (which_g < 50) - return true; - for (i = 50; i < STORED_GRAPHICS; i++) - if (which_g_stored[i] == which_g) { - storage_status[i] = 1; - return true; - } - return false; -} - -// Otherwise, puts in array. Note ... if graphic is alreayd here and locked (i.e. -// storage status is 1, this will add a new copy. -void place_graphic_num_in_array(short which_g) -{ - short i; - - for (i = 50; i < STORED_GRAPHICS; i++) - if ((storage_status[i] == 2) || (storage_status[i] == 0)) { - which_g_stored[i] = which_g; - storage_status[i] = 3; - return; - } - // if we get here, couldn't find a space. Time to flush excess crap. - - if (currently_loading_graphics == false) - load_area_graphics(); // calling this is nice and fast, because game won't try to reload - // graphics already there. It'll only purge the trash. - - // try again - for (i = 50; i < STORED_GRAPHICS; i++) - if ((storage_status[i] == 2) || (storage_status[i] == 0)) { - which_g_stored[i] = which_g; - storage_status[i] = 3; - return; - } - add_string_to_buf("No room for graphic."); - print_nums(0,0,which_g); -} - -void add_one_graphic(short which_g) -{ - short i; - for (i = 0; i < STORED_GRAPHICS; i++) - if (which_g_stored[i] == which_g) { - // Good. We got it. Now lock it and leave - storage_status[i] = 1; - return; - } - - // otherwise, load it in - place_graphic_num_in_array(which_g); - put_graphics_in_template(); -} - - -void add_terrain_to_wish_list(unsigned short ter)//// -{ - if (terrain_pic[ter] >= 1000) - return; - else if (terrain_pic[ter] >= 400) { - add_to_wish_list(600 + terrain_pic[ter]); - add_to_wish_list(700 + terrain_pic[ter]); - add_to_wish_list(800 + terrain_pic[ter]); - add_to_wish_list(900 + terrain_pic[ter]); - } - else switch (terrain_pic[ter]) { - - case 143: - add_to_wish_list(230); - add_to_wish_list(143); - break; - case 213: case 214: - add_to_wish_list(213); - add_to_wish_list(214); - break; - - case 215: - add_to_wish_list(215); - add_to_wish_list(218); - add_to_wish_list(219); - add_to_wish_list(220); - add_to_wish_list(221); - break; - case 216: - add_to_wish_list(216); - add_to_wish_list(222); - add_to_wish_list(223); - add_to_wish_list(224); - add_to_wish_list(225); - break; - case 68: case 69: - add_to_wish_list(68); - add_to_wish_list(69); - break; - case 86: case 87: - add_to_wish_list(86); - add_to_wish_list(87); - break; - - default: - add_to_wish_list((short) terrain_pic[ter]); - break; - } -} - -void load_outdoor_graphics() //// -{ - short l,m,i,j; - short pict; - - for (i = 0; i < 96; i++) - for (j = 0; j < 96; j++) - add_terrain_to_wish_list(univ.out[i][j]); - - for (l = 0; l < 2; l++) - for (m = 0; m < 2; m++) - for (i = 0; i < 4; i++) { - for (j = 0; j < 7; j++) - if (univ.out.outdoors[l][m].wandering[i].monst[j] != 0) { - pict = get_monst_picnum(univ.out.outdoors[l][m].wandering[i].monst[j]); - //add_monst_graphic(pict,0); - add_monst_graphic(univ.out.outdoors[l][m].wandering[i].monst[j],0); - - j = 8; - } - for (j = 0; j < 7; j++) - if (univ.out.outdoors[l][m].special_enc[i].monst[j] != 0) { - pict = get_monst_picnum(univ.out.outdoors[l][m].special_enc[i].monst[j]); - //add_monst_graphic(pict,0); - add_monst_graphic(univ.out.outdoors[l][m].special_enc[i].monst[j],0); - j = 8; - } - } - - for (i = 0; i < 10; i++) - if (univ.party.out_c[i].exists == true) - for (j = 0; j < 7; j++) - if (univ.party.out_c[i].what_monst.monst[j] != 0) { - pict = get_monst_picnum(univ.party.out_c[i].what_monst.monst[j]); - //add_monst_graphic(pict, 0); - add_monst_graphic(univ.party.out_c[i].what_monst.monst[j], 0); - j = 8; - } -} - - -void add_monst_graphic(unsigned short m,short mode)//// -// mode 0 - just put in list, 1 - actually add graphics -{ - short x,y,i,pict; - get_monst_dims(m,&x,&y); - for (i = 0; i < x * y; i++) { - pict = get_monst_picnum(m); - if (pict >= NUM_MONST_G) - return; - pict = m_pic_index[pict].i; - if (mode == 0) { - add_to_wish_list(300 + pict + i); - add_to_wish_list(600 + pict + i); - add_to_wish_list(2300 + pict + i); - add_to_wish_list(2600 + pict + i); - } - else { - add_one_graphic(300 + pict + i); - add_one_graphic(600 + pict + i); - add_one_graphic(2300 + pict + i); - add_one_graphic(2600 + pict + i); - } - } -} - -void load_town_graphics() // Setting up town monsters takes some finess, due to the flexibility - // of the situation -// This can be used for town or beginning outdoor combat -{ - short i,j; - - for (i = 0; i < univ.town->max_dim(); i++) - for (j = 0; j < univ.town->max_dim(); j++) - if (is_combat()) - add_terrain_to_wish_list(combat_terrain[i][j]); - else add_terrain_to_wish_list(univ.town->terrain(i,j)); - - for (i = 0; i < univ.town->max_monst(); i++) - if ((univ.town.monst[i].number != 0) && (univ.town.monst[i].active > 0)) - add_monst_graphic(univ.town.monst[i].number,0); - if (is_town()) - for (i = 0; i < 4; i++) - for (j = 0; j < 4; j++) { - add_monst_graphic(univ.town->wandering[i].monst[j],0); - } -} - -void update_pc_graphics() // TODO: The party_template_gworld isn't really necessary; abolish it -{ - short i; - GWorldPtr temp_gworld;//,temp_gworld2; - Rect template_rect = {0,0,36,28}; - PixMapHandle store_source, store_dest; - Rect source_rect; - GrafPtr old_port; - - if (party_in_memory == false) - return; - - GetPort(&old_port); - SetPortWindowPort(mainPtr); -// temp_gworld = load_pict(902); -// temp_gworld2 = load_pict(905); - temp_gworld = load_pict("pcs.png"); - - for (i = 0; i < 6; i++) - if (univ.party[i].main_status > 0) - if (univ.party[i].which_graphic != which_graphic_index[i]) { - template_rect.left = (i / 3) * 56; - template_rect.right = template_rect.left + 56; - template_rect.top = (i % 3) * 36; - template_rect.bottom = template_rect.top + 36; - - - store_source = GetPortPixMap(temp_gworld); - source_rect.left = (univ.party[i].which_graphic / 8) * 56; - source_rect.right = source_rect.left + 56; -// source_rect.top = (univ.party[i].which_graphic % 8) * 36; -// source_rect.bottom = template_rect.top + 36; - source_rect.top = 36 * (univ.party[i].which_graphic % 8); - source_rect.bottom = 36 * (univ.party[i].which_graphic % 8) + 36; - store_dest = GetPortPixMap(party_template_gworld); - - CopyBits ( (BitMap *) *store_source , - (BitMap *) *store_dest , - &source_rect, &template_rect, - 0 , NULL); - - OffsetRect(&source_rect,0,288); - OffsetRect(&template_rect,0,108); - CopyBits ( (BitMap *) *store_source , - (BitMap *) *store_dest , - &source_rect, &template_rect, - 0 , NULL); - - which_graphic_index[i] = univ.party[i].which_graphic; - } - DisposeGWorld (temp_gworld); - //DisposeGWorld (temp_gworld2); - - SetPort(old_port); - -} - - -// This one is complicated, but that's because it's optimized for efficiency. -// Goes through, and loads graphics for anything with storage_status of 3//// -void put_graphics_in_template() // TODO: Get rid of this! It's not necessary! Just keep everything in memory! -{ - GWorldPtr temp_gworld; - short i,j,which_position,offset; - bool this_graphic_needed = false; - Rect from_rect,to_rect; - - // First, load all terrains - for (j = 1; j < 6; j++) { - for (i = 50; i < STORED_GRAPHICS; i++) - if ((which_g_stored[i] >= j * 50) && (which_g_stored[i] < j * 50 + 50) && - (storage_status[i] == 3)) { - this_graphic_needed = true; - } - if (this_graphic_needed == true) { - temp_gworld = load_pict(800 + j); - for (i = 50; i < STORED_GRAPHICS; i++) - if ((which_g_stored[i] >= j * 50) && (which_g_stored[i] < j * 50 + 50) && - (storage_status[i] == 3)) { - which_position = which_g_stored[i] - j * 50; - from_rect = calc_rect(which_position % 10,which_position / 10); - to_rect = calc_rect(i % 10,i / 10); - - rect_draw_some_item(temp_gworld,from_rect,storage_gworld,to_rect); - storage_status[i] = 1; - } - DisposeGWorld (temp_gworld); - } - this_graphic_needed = false; - } - - // Now, load all monsters - for (j = 0; j < 10; j++) { - for (i = 50; i < STORED_GRAPHICS; i++) - if ((which_g_stored[i] >= 300 + j * 20) && (which_g_stored[i] < 300 + j * 20 + 20) && - (storage_status[i] == 3)) - this_graphic_needed = true; - for (i = 50; i < STORED_GRAPHICS; i++) - if ((which_g_stored[i] >= 600 + j * 20) && (which_g_stored[i] < 600 + j * 20 + 20) && - (storage_status[i] == 3)) - this_graphic_needed = true; - - if (this_graphic_needed == true) { - temp_gworld = load_pict(1100 + j); - for (i = 50; i < STORED_GRAPHICS; i++) - if ((which_g_stored[i] >= 300 + j * 20) && (which_g_stored[i] < 300 + j * 20 + 20) && - (storage_status[i] == 3)) { - which_position = which_g_stored[i] % 20; - from_rect = calc_rect((which_position / 10) * 2,which_position % 10); - to_rect = calc_rect(i % 10,i / 10); - - rect_draw_some_item(temp_gworld,from_rect,storage_gworld,to_rect); - - storage_status[i] = 1; - } - for (i = 50; i < STORED_GRAPHICS; i++) - if ((which_g_stored[i] >= 600 + j * 20) && (which_g_stored[i] < 600 + j * 20 + 20) && - (storage_status[i] == 3)) { - which_position = which_g_stored[i] % 20; - from_rect = calc_rect((which_position / 10) * 2 + 1,which_position % 10); - to_rect = calc_rect(i % 10,i / 10); - - rect_draw_some_item(temp_gworld,from_rect,storage_gworld,to_rect); - - storage_status[i] = 1; - } - DisposeGWorld (temp_gworld); - } - this_graphic_needed = false; - } - - // Now, load all monster combat poses - for (j = 0; j < 10; j++) { - for (i = 50; i < STORED_GRAPHICS; i++) - if ((which_g_stored[i] >= 2300 + j * 20) && (which_g_stored[i] < 2300 + j * 20 + 20) && - (storage_status[i] == 3)) - this_graphic_needed = true; - for (i = 50; i < STORED_GRAPHICS; i++) - if ((which_g_stored[i] >= 2600 + j * 20) && (which_g_stored[i] < 2600 + j * 20 + 20) && - (storage_status[i] == 3)) - this_graphic_needed = true; - - if (this_graphic_needed == true) { - temp_gworld = load_pict(1200 + j); - for (i = 50; i < STORED_GRAPHICS; i++) - if ((which_g_stored[i] >= 2300 + j * 20) && (which_g_stored[i] < 2300 + j * 20 + 20) && - (storage_status[i] == 3)) { - which_position = which_g_stored[i] % 20; - from_rect = calc_rect((which_position / 10) * 2,which_position % 10); - to_rect = calc_rect(i % 10,i / 10); - - rect_draw_some_item(temp_gworld,from_rect,storage_gworld,to_rect); - - storage_status[i] = 1; - } - for (i = 50; i < STORED_GRAPHICS; i++) - if ((which_g_stored[i] >= 2600 + j * 20) && (which_g_stored[i] < 2600 + j * 20 + 20) && - (storage_status[i] == 3)) { - which_position = which_g_stored[i] % 20; - from_rect = calc_rect((which_position / 10) * 2 + 1,which_position % 10); - to_rect = calc_rect(i % 10,i / 10); - - rect_draw_some_item(temp_gworld,from_rect,storage_gworld,to_rect); - - storage_status[i] = 1; - } - DisposeGWorld (temp_gworld); - } - this_graphic_needed = false; - } - - - // Now, anim terrains - for (i = 50; i < STORED_GRAPHICS; i++) - if ((which_g_stored[i] >= 1000) && (which_g_stored[i] < 1400) && - (storage_status[i] == 3)) - this_graphic_needed = true; - if (this_graphic_needed == true) { - temp_gworld = load_pict(820); - for (i = 50; i < STORED_GRAPHICS; i++) - if ((which_g_stored[i] >= 1000) && (which_g_stored[i] < 1400) && - (storage_status[i] == 3)) { - which_position = which_g_stored[i] % 100; - offset = (which_g_stored[i] - 1000) / 100; - from_rect = calc_rect(4 * (which_position / 5) + offset,which_position % 5); - to_rect = calc_rect(i % 10,i / 10); - - rect_draw_some_item(temp_gworld,from_rect,storage_gworld,to_rect); - - storage_status[i] = 1; - } - DisposeGWorld (temp_gworld); - } -} - // this is used for determinign whether to round off walkway corners // right now, trying a restrictive rule (just cave floor and grass, mainly) bool is_nature(char x, char y, unsigned char ground_t) @@ -1728,23 +1159,6 @@ bool is_nature(char x, char y, unsigned char ground_t) ter_type = coord_to_ter((short) x,(short) y); return ground_t == scenario.ter_types[ter_type].ground_type; -// pic = scenario.ter_types[ter_type].picture; -// if ((pic >= 0) && (pic <= 45)) -// return true; -// if ((pic >= 67) && (pic <= 73)) -// return true; -// if ((pic >= 75) && (pic <= 87)) -// return true; -// if ((pic >= 121) && (pic <= 122)) -// return true; -// if ((pic >= 179) && (pic <= 208)) -// return true; -// if ((pic >= 211) && (pic <= 212)) -// return true; -// if ((pic >= 217) && (pic <= 246)) -// return true; -// -// return false; } ter_num_t get_ground_from_ter(ter_num_t ter){ @@ -2742,37 +2156,6 @@ void FlushAndPause(unsigned long ticks) Delay(ticks,&dummy); } -void dump_gworld() -{ - Rect from_rect,to_rect; - - GetPortBounds(storage_gworld,&from_rect); - from_rect.top += 180; - to_rect = from_rect; - OffsetRect(&to_rect,0,-180); - to_rect.bottom = to_rect.top + (to_rect.bottom + to_rect.top) / 2; - rect_draw_some_item(storage_gworld,from_rect,to_rect,ul); - play_sound(0); - FlushAndPause(60); - -} - -// This tells the dialog engine to kill the dialog, and refreshes the screen -//void final_process_dialog(short which_dlog) -//{ -// GrafPtr old_port; -// -// cd_kill_dialog(which_dlog,0); -// -// GetPort(&old_port); -// SetPort(GetWindowPort(mainPtr)); -// BeginUpdate(mainPtr); -// if (in_startup_mode == false) -// refresh_screen(0); -// else draw_startup(0); -// EndUpdate(mainPtr); -// SetPort(old_port); -//} /* void HideMenuBar( void ) { diff --git a/osx/boe.graphics.h b/osx/boe.graphics.h index 31168f4f..0bba1944 100644 --- a/osx/boe.graphics.h +++ b/osx/boe.graphics.h @@ -20,25 +20,11 @@ void set_gworld_fonts(short font_num); void redraw_screen(); void put_background(); void draw_main_screen(); -//void refresh_screen(short mode); void draw_buttons(short mode); void draw_text_area(short mode); void reset_text_bar(); void draw_text_bar(short mode); void put_text_bar(char *str); -void load_area_graphics(); -void add_to_wish_list(short which_g); -bool reserve_graphic_num_in_array(short which_g); -void place_graphic_num_in_array(short which_g); -//GWorldPtr load_bmp(unsigned char *data, long length); -void add_one_graphic(short which_g); -void add_terrain_to_wish_list(unsigned short ter); -void load_outdoor_graphics(); -void add_monst_graphic(unsigned short m,short mode); -void load_town_graphics(); -void update_pc_graphics(); -void put_graphics_in_template(); -//GWorldPtr load_pict(short picture_to_get); void draw_terrain(short mode = 0); void place_trim(short q,short r,location where,ter_num_t ter_type); void draw_trim(short q,short r,short which_trim,short which_mode); @@ -55,8 +41,6 @@ void undo_clip(); void draw_targeting_line(Point where_curs); bool party_toast(); void redraw_partial_terrain(Rect redraw_rect); -void dump_gworld(); -//void final_process_dialog(short which_dlog); bool is_nature(char i, char j, unsigned char ground_t); void put_dialog_graphic(short graphic_num,short spec_g,Rect draw_rect); void draw_startup_stats(); diff --git a/osx/boe.graphutil.cpp b/osx/boe.graphutil.cpp index cf66a059..49cd6845 100644 --- a/osx/boe.graphutil.cpp +++ b/osx/boe.graphutil.cpp @@ -46,11 +46,11 @@ extern DialogPtr modeless_dialogs[18]; extern short combat_posing_monster , current_working_monster ; // 0-5 PC 100 + x - monster x //extern piles_of_stuff_dumping_type *data_store; TODO: Abolish storage_gworld -extern GWorldPtr storage_gworld,terrain_screen_gworld,party_template_gworld,items_gworld,tiny_obj_gworld; -extern GWorldPtr fields_gworld,anim_gworld,vehicle_gworld; -extern short which_g_stored[STORED_GRAPHICS]; -extern short wish_list[STORED_GRAPHICS]; -extern short storage_status[STORED_GRAPHICS]; // 0 - empty 1 - in use 2 - there, not in use +extern GWorldPtr terrain_screen_gworld,items_gworld,tiny_obj_gworld,pc_gworld,monst_gworld[NUM_MONST_SHEETS]; +extern GWorldPtr fields_gworld,anim_gworld,vehicle_gworld,terrain_gworld[NUM_TER_SHEETS]; +//extern short which_g_stored[STORED_GRAPHICS]; +//extern short wish_list[STORED_GRAPHICS]; +//extern short storage_status[STORED_GRAPHICS]; // 0 - empty 1 - in use 2 - there, not in use extern short terrain_there[9][9]; extern pending_special_type special_queue[20]; @@ -66,7 +66,6 @@ extern short display_mode; extern long anim_ticks; -extern short terrain_pic[256]; extern char spot_seen[9][9]; //extern char out_trim[96][96],town_trim[64][64]; extern short monster_index[21]; @@ -80,85 +79,6 @@ extern GWorldPtr spec_scen_g; Rect boat_rects[4] = {{0,0,36,28}, {0,28,36,56},{0,56,36,84},{0,84,36,112}}; bool gave_no_g_error = false; eAmbientSound ambient_sound; -//unsigned char m_pic_index[200] = {//// -//1,2,3,4,5,6,7,8,9,10, -//11,12,13,14,15,16,17,18,19,20, -// -//21,22,23,24,25, 26,27,28,29,30, -//31,32,33,34,35, 36,37,38,39,40, -// -//41,42,43,44,46,47,48,49,50,51, -//53,55,57,59,60,61,62,63,64,65, -// -//66,67,68,69,70, 71,72,73,74,75, -//76,77,78,79,81, 82,83,85,86,87, -// -//88,89,90,91,92, 93,94,95,96,97, -//98,99,100,101,102, 103,104,105,106,107, -// -//108,109,111,112,113, 114,116,117,118,119, //100 -//120,122,123,125,127, 128,129,130,131,135, -// -//136,137,139,140,141,142,143,144,145,146, -//147,148,149,150,151,152,152,154,155,159, -// -//160,164,166,168,170,171,172,173,174,175, -//176,177,178,179,180,181,182,183,184,185, -// -//186,187,188,189,190,191,192,193,194,195, -//196,197,198,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}; -// -//unsigned char m_pic_index_x[200] = { -// -//1,1,1,1,1,1,1,1,1,1, -//1,1,1,1,1,1,1,1,1,1, -//1,1,1,1,1,1,1,1,1,1, -//1,1,1,1,1,1,1,1,1,1, -//1,1,1,1,1,1,1,1,1,1, -//1,1,1,1,1,1,1,1,1,1, -//1,1,1,1,1,1,1,1,1,1, -//1,1,1,2,1,1,1,1,1,1, -//1,1,1,1,1,1,1,1,1,1, -//1,1,1,1,1,1,1,1,1,1, -// -//1,2,1,1,1,2,1,1,1,1, // 100 -//2,1,1,1,1,1,1,1,2,1, -//1,2,1,1,1,1,1,1,1,1, -//1,1,1,1,1,1,1,1,2,1, -// -//2,2,2,1,1,1,1,1,1,1, -//1,1,1,1,1,1,1,1,1,1, -//1,1,1,1,1,1,1,1,1,1, -//1,1,1,1,1,1,1,1,1,1, -//1,1,1,1,1,1,1,1,1,1, -//1,1,1,1,1,1,1,1,1,1}; -// -//unsigned char m_pic_index_y[200] = { -//1,1,1,1,1,1,1,1,1,1, -//1,1,1,1,1,1,1,1,1,1, -//1,1,1,1,1,1,1,1,1,1, -//1,1,1,1,1,1,1,1,1,1, -//1,1,1,1,1,1,1,1,1,2, -//2,2,2,1,1,1,1,1,1,1, -//1,1,1,1,1,1,1,1,1,1, -//1,1,1,1,1,1,2,1,1,1, -//1,1,1,1,1,1,1,1,1,1, -//1,1,1,1,1,1,1,1,1,1, -// -//1,1,1,1,1,1,1,1,1,1, -//1,1,2,2,1,1,1,1,2,1, -//1,1,1,1,1,1,1,1,1,1, -//1,1,1,1,1,1,1,1,2,1, -//2,1,1,2,1,1,1,1,1,1, -// -//1,1,1,1,1,1,1,1,1,1, -//1,1,1,1,1,1,1,1,1,1, -//1,1,1,1,1,1,1,1,1,1, -//1,1,1,1,1,1,1,1,1,1, -//1,1,1,1,1,1,1,1,1,1}; void draw_one_terrain_spot (short i,short j,short terrain_to_draw) //// //short dest; // 0 - terrain gworld 1 - screen @@ -172,65 +92,72 @@ void draw_one_terrain_spot (short i,short j,short terrain_to_draw) //// GrafPtr old_port; location l; - source_gworld = storage_gworld; - l.x = i; l.y = j; if (supressing_some_spaces && (l != ok_space[0]) && (l != ok_space[1]) && (l != ok_space[2]) && (l != ok_space[3])) return; - + where_draw = calc_rect(i,j); OffsetRect(&where_draw,13,13); if (terrain_to_draw == -1) { if ((cartoon_happening == false) && (terrain_there[i][j] == 300)) { return; - } + } terrain_there[i][j] = 300; GetPort(&old_port); SetPort(terrain_screen_gworld); PaintRect(&where_draw); SetPort(old_port); return; - } + } //// if (terrain_to_draw >= 10000) { // force using a specific graphic - if (terrain_there[i][j] == terrain_to_draw - 10000) + terrain_to_draw -= 10000; + if (terrain_there[i][j] == terrain_to_draw) return; - terrain_there[i][j] = terrain_to_draw - 10000; - source_rect = return_item_rect(terrain_to_draw - 10000); + source_gworld = terrain_gworld[terrain_to_draw / 50]; + terrain_there[i][j] = terrain_to_draw; + terrain_to_draw %= 50; + source_rect = calc_rect(terrain_to_draw % 10, terrain_to_draw / 10); anim_type = -1; + } + else if (scenario.ter_types[terrain_to_draw].picture >= 2000) { // custom + source_gworld = spec_scen_g; + source_rect = get_custom_rect(scenario.ter_types[terrain_to_draw].picture - 2000 + (anim_ticks % 4)); + anim_type = 0; + terrain_there[i][j] = -1; + } + else if (scenario.ter_types[terrain_to_draw].picture >= 1000) { // custom + source_gworld = spec_scen_g; + source_rect = get_custom_rect(scenario.ter_types[terrain_to_draw].picture - 1000); + terrain_there[i][j] = -1; + } + else if (scenario.ter_types[terrain_to_draw].picture >= 400) { // animated + source_gworld = anim_gworld; + terrain_to_draw = scenario.ter_types[terrain_to_draw].picture; + source_rect = calc_rect(4 * ((terrain_to_draw - 400) / 5) + (anim_ticks % 4),(terrain_to_draw - 400) % 5); + terrain_there[i][j] = -1; + anim_type = 0; + } + else { + if (cartoon_happening == false) { + if (terrain_there[i][j] == scenario.ter_types[terrain_to_draw].picture) { + return; + } + terrain_there[i][j] = scenario.ter_types[terrain_to_draw].picture; } - else if (terrain_pic[terrain_to_draw] >= 2000) { // custom - source_gworld = spec_scen_g; - source_rect = get_custom_rect(terrain_pic[terrain_to_draw] - 2000 + (anim_ticks % 4)); - anim_type = 0; - terrain_there[i][j] = -1; - } - else if (terrain_pic[terrain_to_draw] >= 1000) { // custom - source_gworld = spec_scen_g; - source_rect = get_custom_rect(terrain_pic[terrain_to_draw] - 1000); - terrain_there[i][j] = -1; - } - else if (terrain_pic[terrain_to_draw] >= 400) { // animated - source_rect = return_item_rect(terrain_pic[terrain_to_draw] + 600 + 100 * (anim_ticks % 4)); - terrain_there[i][j] = -1; - anim_type = 0; - } - else { - if (cartoon_happening == false) { - if (terrain_there[i][j] == terrain_pic[terrain_to_draw]) { - return; - } - terrain_there[i][j] = terrain_pic[terrain_to_draw]; - } - source_rect = return_item_rect(terrain_pic[terrain_to_draw]); - anim_type = -1; - } + terrain_to_draw = scenario.ter_types[terrain_to_draw].picture; + source_gworld = terrain_gworld[terrain_to_draw / 50]; + terrain_there[i][j] = terrain_to_draw; + terrain_to_draw %= 50; + source_rect = calc_rect(terrain_to_draw % 10, terrain_to_draw / 10); + anim_type = -1; + } - if (anim_type >= 0) - { - if ((is_town()) || (is_out())) - anim_onscreen = true; - } + if (anim_type >= 0) + { + if ((is_town()) || (is_out())) + anim_onscreen = true; + } rect_draw_some_item(source_gworld, source_rect, terrain_screen_gworld, where_draw); } @@ -259,17 +186,14 @@ void draw_monsters() //// where_draw.y = univ.party.out_c[i].m_loc.y - univ.party.p_loc.y + 4; terrain_there[where_draw.x][where_draw.y] = -1; - j = 0; - while ((univ.party.out_c[i].what_monst.monst[j] == 0) && (j < 7)) { - j++; - } + for(j = 0; univ.party.out_c[i].what_monst.monst[j] == 0 && j < 7; j++); if (j == 7) univ.party.out_c[i].exists = false; // begin watch out else { picture_wanted = get_monst_picnum(univ.party.out_c[i].what_monst.monst[j]); } // end watch out - if (univ.party.out_c[i].exists == true) { + if (univ.party.out_c[i].exists) { get_monst_dims(univ.party.out_c[i].what_monst.monst[j],&width,&height); if (picture_wanted >= 1000) { for (k = 0; k < width * height; k++) { @@ -282,11 +206,11 @@ void draw_monsters() //// } if (picture_wanted < 1000) { for (k = 0; k < width * height; k++) { - source_rect = get_monster_template_rect(univ.party.out_c[i].what_monst.monst[j], - (univ.party.out_c[i].direction < 4) ? 0 : 1,k); + pic_num_t this_monst = univ.party.out_c[i].what_monst.get(j,true,&cMonster::picture_num); + source_rect = get_monster_template_rect(this_monst,(univ.party.out_c[i].direction < 4) ? 0 : 1,k); to_rect = monst_rects[(width - 1) * 2 + height - 1][k]; OffsetRect(&to_rect,13 + 28 * where_draw.x,13 + 36 * where_draw.y); - rect_draw_some_item(storage_gworld, source_rect, terrain_screen_gworld,to_rect, transparent); + rect_draw_some_item(monst_gworld[m_pic_index[this_monst].i/20], source_rect, terrain_screen_gworld,to_rect, transparent); } } } @@ -301,7 +225,7 @@ void draw_monsters() //// where_draw.y = univ.town.monst[i].cur_loc.y - center.y + 4; get_monst_dims(univ.town.monst[i].number,&width,&height); if (point_onscreen(center,univ.town.monst[i].cur_loc) == true) - play_see_monster_str(univ.town.monst[i].number); + play_see_monster_str(univ.town.monst[i].number); // TODO: This also gets called by check_if_monst_seen! for (k = 0; k < width * height; k++) { store_loc = where_draw; @@ -312,10 +236,20 @@ void draw_monsters() //// source_rect = get_custom_rect((univ.town.monst[i].picture_num % 1000) + k + ((univ.town.monst[i].direction < 4) ? 0 : width * height) + ((combat_posing_monster == i + 100) ? (2 * width * height) : 0)); - Draw_Some_Item(spec_scen_g, source_rect, terrain_screen_gworld, store_loc, 1, 0); + ter = univ.town->terrain(univ.town.monst[i].cur_loc.x,univ.town.monst[i].cur_loc.y); + // in bed? + if ((store_loc.x >= 0) && (store_loc.x < 9) && (store_loc.y >= 0) && (store_loc.y < 9) && + (scenario.ter_types[ter].special == TER_SPEC_BED) && + ((univ.town.monst[i].m_type < 7) + && (univ.town.monst[i].m_type != 1) && (univ.town.monst[i].m_type != 2)) + && ((univ.town.monst[i].active == 1) || (univ.town.monst[i].target == 6)) && + (width == 1) && (height == 1)) //// + draw_one_terrain_spot((short) where_draw.x,(short) where_draw.y,10000 + scenario.ter_types[ter].flag1.u); + else Draw_Some_Item(spec_scen_g, source_rect, terrain_screen_gworld, store_loc, 1, 0); } if (univ.town.monst[i].picture_num < 1000) { - source_rect = get_monster_template_rect(univ.town.monst[i].number, + pic_num_t this_monst = univ.town.monst[i].picture_num; + source_rect = get_monster_template_rect(this_monst, ((univ.town.monst[i].direction < 4) ? 0 : 1) + ((combat_posing_monster == i + 100) ? 10 : 0),k); ter = univ.town->terrain(univ.town.monst[i].cur_loc.x,univ.town.monst[i].cur_loc.y); // in bed? @@ -326,7 +260,7 @@ void draw_monsters() //// && ((univ.town.monst[i].active == 1) || (univ.town.monst[i].target == 6)) && (width == 1) && (height == 1)) //// draw_one_terrain_spot((short) where_draw.x,(short) where_draw.y,10000 + scenario.ter_types[ter].flag1.u); - else Draw_Some_Item(storage_gworld, source_rect, terrain_screen_gworld, store_loc, 1, 0); + else Draw_Some_Item(monst_gworld[m_pic_index[this_monst].i/20], source_rect, terrain_screen_gworld, store_loc, 1, 0); } } } @@ -349,10 +283,19 @@ void draw_monsters() //// source_rect = get_custom_rect((univ.town.monst[i].picture_num % 1000) + k + ((univ.town.monst[i].direction < 4) ? 0 : width * height) + ((combat_posing_monster == i + 100) ? (2 * width * height) : 0)); - Draw_Some_Item(spec_scen_g, source_rect, terrain_screen_gworld, store_loc, 1, 0); + ter = univ.town->terrain(univ.town.monst[i].cur_loc.x,univ.town.monst[i].cur_loc.y); + if ((store_loc.x >= 0) && (store_loc.x < 9) && (store_loc.y >= 0) && (store_loc.y < 9) && + (scenario.ter_types[ter].special == TER_SPEC_BED) && + ((univ.town.monst[i].m_type < 7) + && (univ.town.monst[i].m_type != 1) && (univ.town.monst[i].m_type != 2)) + && ((univ.town.monst[i].active == 1) || (univ.town.monst[i].target == 6)) && + (width == 1) && (height == 1)) + draw_one_terrain_spot((short) where_draw.x,(short) where_draw.y,10000 + scenario.ter_types[ter].flag1.u); //// + else Draw_Some_Item(spec_scen_g, source_rect, terrain_screen_gworld, store_loc, 1, 0); } if (univ.town.monst[i].picture_num < 1000) { - source_rect = get_monster_template_rect(univ.town.monst[i].number, + pic_num_t this_monst = univ.town.monst[i].picture_num; + source_rect = get_monster_template_rect(this_monst, ((univ.town.monst[i].direction < 4) ? 0 : 1) + ((combat_posing_monster == i + 100) ? 10 : 0) ,k); ter = univ.town->terrain(univ.town.monst[i].cur_loc.x,univ.town.monst[i].cur_loc.y); @@ -363,7 +306,7 @@ void draw_monsters() //// && ((univ.town.monst[i].active == 1) || (univ.town.monst[i].target == 6)) && (width == 1) && (height == 1)) draw_one_terrain_spot((short) where_draw.x,(short) where_draw.y,10000 + scenario.ter_types[ter].flag1.u); //// - else Draw_Some_Item(storage_gworld, source_rect, terrain_screen_gworld, store_loc, 1, 0); + else Draw_Some_Item(monst_gworld[m_pic_index[this_monst].i/20], source_rect, terrain_screen_gworld, store_loc, 1, 0); } } } @@ -415,12 +358,14 @@ void draw_pcs(location center,short mode) ((cartoon_happening == true) || (party_can_see(pc_pos[i]) < 6))){ where_draw.x = pc_pos[i].x - center.x + 4; where_draw.y = pc_pos[i].y - center.y + 4; - source_rect = get_party_template_rect(i,(pc_dir[i] < 4) ? 0 : 1); + source_rect = calc_rect(2 * (univ.party[i].which_graphic / 8), univ.party[i].which_graphic % 8); + if(pc_dir[i] >= 4) + OffsetRect(&source_rect,28,0); if (combat_posing_monster == i) - OffsetRect(&source_rect,0,108); + OffsetRect(&source_rect,0,288); if (mode == 0) { - Draw_Some_Item(party_template_gworld, source_rect, terrain_screen_gworld, where_draw, 1, 0); + Draw_Some_Item(pc_gworld, source_rect, terrain_screen_gworld, where_draw, 1, 0); } if ((current_pc == i) && (mode == 1) && (monsters_going == false)) { @@ -440,12 +385,14 @@ void draw_pcs(location center,short mode) if ( ((point_onscreen(center, pc_pos[current_pc])) == true) && (univ.party[current_pc].main_status == 1)) { where_draw.x = pc_pos[current_pc].x - center.x + 4; where_draw.y = pc_pos[current_pc].y - center.y + 4; - source_rect = get_party_template_rect(current_pc,(pc_dir[current_pc] < 4) ? 0 : 1); - if (combat_posing_monster == current_pc) - OffsetRect(&source_rect,0,108); + source_rect = calc_rect(2 * (univ.party[current_pc].which_graphic / 8), univ.party[current_pc].which_graphic % 8); + if(pc_dir[current_pc] >= 4) + OffsetRect(&source_rect,28,0); + if (combat_posing_monster == current_pc) + OffsetRect(&source_rect,0,288); if (mode == 0) - Draw_Some_Item(party_template_gworld, source_rect, terrain_screen_gworld, where_draw, 1, 0); + Draw_Some_Item(pc_gworld, source_rect, terrain_screen_gworld, where_draw, 1, 0); } } @@ -618,12 +565,14 @@ void draw_party_symbol(short mode,location center) if ((univ.party.in_boat < 0) && (univ.party.in_horse < 0)) { i = first_active_pc(); - source_rect = get_party_template_rect(i,univ.party.direction > 3); + source_rect = calc_rect(2 * (univ.party[current_pc].which_graphic / 8), univ.party[i].which_graphic % 8); + if(pc_dir[current_pc] >= 4) + OffsetRect(&source_rect,28,0); ter_num_t ter = univ.town->terrain(univ.town.p_loc.x,univ.town.p_loc.y); // now wedge in bed graphic if ((is_town()) && (scenario.ter_types[ter].special == TER_SPEC_BED)) draw_one_terrain_spot((short) target.x,(short) target.y,10000 + scenario.ter_types[ter].flag1.u); - else Draw_Some_Item(party_template_gworld, source_rect, terrain_screen_gworld, target, 1, 0); + else Draw_Some_Item(pc_gworld, source_rect, terrain_screen_gworld, target, 1, 0); } else if (univ.party.in_boat >= 0) { //source_rect = boat_rects[dir_array[univ.party.direction]]; @@ -639,49 +588,6 @@ void draw_party_symbol(short mode,location center) } } - - -/* 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_terrain_template_rect (ter_num_t type_wanted) //// -{ - short picture_wanted; - - picture_wanted = terrain_pic[type_wanted]; - - if (picture_wanted >= 400) - return return_item_rect(picture_wanted + 700); - return return_item_rect(picture_wanted); -} - -Rect return_item_rect(short wanted)//// -{ - Rect orig_rect = {0,0,36,28}; - short i; - if (wanted < 50) { - OffsetRect(&orig_rect,28 * (wanted % 10),36 * (wanted / 10)); - return orig_rect; - } - for (i = 50; i < STORED_GRAPHICS; i++) - if (which_g_stored[i] == wanted) { - OffsetRect(&orig_rect,28 * (i % 10),36 * (i / 10)); - return orig_rect; - } - // oops it's not here. better try to add it. - add_one_graphic(wanted); - for (i = 50; i < STORED_GRAPHICS; i++) - if (which_g_stored[i] == wanted) { - OffsetRect(&orig_rect,28 * (i % 10),36 * (i / 10)); - return orig_rect; - } - // oh well. - if (gave_no_g_error == false) { - give_error("Blades of Exile doesn't have enough memory to show all the graphics needed. Some things may look like cave floor. The game can still be played safely - restarting isn't necessary.","",0); - gave_no_g_error = true; - } - return orig_rect; -} - // Give the position of the monster graphic in the picture resource // Will store monsters the same in Exile's II and III Rect get_monster_rect (unsigned short type_wanted,short mode) //// @@ -701,24 +607,22 @@ Rect get_monster_rect (unsigned short type_wanted,short mode) //// } // Give the position of the monster graphic in the template in memory -Rect get_monster_template_rect (unsigned short type_wanted,short mode,short which_part) //// +Rect get_monster_template_rect (pic_num_t picture_wanted,short mode,short which_part) //// //mode; // 0 - left 1 - right +10 - combat mode { Rect store_rect = {0,0,36,28}; - short picture_wanted; - short adj = 0; + short adj; - if (mode >= 10) {adj = 2000; mode -= 10;} - picture_wanted = get_monst_picnum(type_wanted); - if (picture_wanted >= 1000) - return store_rect; - picture_wanted = m_pic_index[picture_wanted].i + which_part; - return return_item_rect(300 + picture_wanted + (300 * mode) + adj); + if (mode >= 10) { + adj += 4; + mode -= 10; + } + if(mode == 0) adj++; + picture_wanted = (m_pic_index[picture_wanted].i + which_part) % 20; + //return return_item_rect(300 + picture_wanted + (300 * mode) + adj); + return calc_rect(2 * (picture_wanted / 10) + adj, picture_wanted % 10); } - - - // 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)//// @@ -792,75 +696,8 @@ bool is_ground(ter_num_t ter_type) // if(scenario.ter_types[ter_type].trim_type == TRIM_WALKWAY) // return false; return true; -// short pic; -// -// pic = scenario.ter_types[ter_type].picture; -// if ((pic >= 0) && (pic <= 87)) -// return true; -// if ((pic >= 121) && (pic <= 122)) -// return true; -// if ((pic >= 179) && (pic <= 208)) -// return true; -// if ((pic >= 211) && (pic <= 212)) -// return true; -// if ((pic >= 215) && (pic <= 246)) -// return true; -// -// return false; } -//void make_town_trim(short mode) -////mode; // 0 - town 1 - outdoor combat -//{ -// location where; -// eGameMode store_mode; -// -// store_mode = overall_mode; -// overall_mode = (mode == 0) ? MODE_TOWN : MODE_COMBAT; -// for (where.x = 0; where.x < univ.town->max_dim(); where.x++) -// for (where.y = 0; where.y < univ.town->max_dim(); where.y++) -// town_trim[where.x][where.y] = add_trim_to_array(where, -// (mode == 0) ? univ.town->terrain(where.x,where.y) : combat_terrain[where.x][where.y]); -// for (where.x = 0; where.x < univ.town->max_dim(); where.x++) -// for (where.y = 0; where.y < univ.town->max_dim(); where.y++) { -// if (town_trim[where.x][where.y] & 1) -// town_trim[where.x][where.y] &= 125; -// if (town_trim[where.x][where.y] & 4) -// town_trim[where.x][where.y] &= 245; -// if (town_trim[where.x][where.y] & 10) -// town_trim[where.x][where.y] &= 215; -// if (town_trim[where.x][where.y] & 64) -// town_trim[where.x][where.y] &= 95; -// } -// overall_mode = store_mode; -//} - -//void make_out_trim() -//{ -// location where; -// eGameMode store_mode; -// -// store_mode = overall_mode; -// overall_mode = MODE_OUTDOORS; -// -// for (where.x = 0; where.x < 96; where.x++) -// for (where.y = 0; where.y < 96; where.y++) -// out_trim[where.x][where.y] = add_trim_to_array(where,univ.out[where.x][where.y]); -// for (where.x = 0; where.x < 96; where.x++) -// for (where.y = 0; where.y < 96; where.y++) { -// if (out_trim[where.x][where.y] & 1) -// out_trim[where.x][where.y] &= 125; -// if (out_trim[where.x][where.y] & 4) -// out_trim[where.x][where.y] &= 245; -// if (out_trim[where.x][where.y] & 10) -// out_trim[where.x][where.y] &= 215; -// if (out_trim[where.x][where.y] & 64) -// out_trim[where.x][where.y] &= 95; -// } -// overall_mode = store_mode; -// -//} - char get_fluid_trim(location where,ter_num_t ter_type) { bool at_top = false,at_bot = false,at_left = false,at_right = false; diff --git a/osx/boe.graphutil.h b/osx/boe.graphutil.h index 58eb6474..5b9688e6 100644 --- a/osx/boe.graphutil.h +++ b/osx/boe.graphutil.h @@ -5,8 +5,6 @@ void draw_pcs(location center,short mode); void draw_outd_boats(location center); void draw_town_boat(location center) ; void draw_party_symbol(short mode,location center); -Rect get_terrain_template_rect (ter_num_t type_wanted); -Rect return_item_rect(short wanted); Rect get_monster_rect (unsigned char type_wanted,short mode) ; Rect get_monster_template_rect (unsigned short type_wanted,short mode,short which_part) ; Rect get_item_template_rect (short type_wanted); @@ -14,8 +12,6 @@ bool is_fluid(ter_num_t ter_type); bool is_shore(ter_num_t ter_type); bool is_wall(ter_num_t ter_type); bool is_ground(ter_num_t ter_type); -//void make_town_trim(short mode); -//void make_out_trim(); char get_fluid_trim(location where,ter_num_t ter_type); void check_if_monst_seen(unsigned short m_num); void adjust_monst_menu(); diff --git a/osx/boe.locutils.cpp b/osx/boe.locutils.cpp index fc77994b..ca525381 100644 --- a/osx/boe.locutils.cpp +++ b/osx/boe.locutils.cpp @@ -11,10 +11,6 @@ #include "boe.monster.h" #include "boe.fields.h" - -char terrain_blocked[256]; - - short short_can_see(); bool combat_pt_in_light(); //extern short town_size[3]; @@ -39,14 +35,14 @@ location light_locs[40]; short num_lights = 0; char d_s[60]; -//// -void set_terrain_blocked() -{ - short i; - - for (i = 0; i < 256; i++) - terrain_blocked[i] = scenario.ter_types[i].blockage; -} +// +//void set_terrain_blocked() +//{ +// short i; +// +// for (i = 0; i < 256; i++) +// terrain_blocked[i] = scenario.ter_types[i].blockage; +//} //short dist(location p1,location p2) //{ @@ -191,7 +187,7 @@ short can_see(location p1,location p2,short mode) if (p1.x > p2.x) { for (count = p2.x + 1; count < p1.x; count++) { storage = storage + get_obscurity(count, p1.y); - if (((terrain_blocked[coord_to_ter(count,p1.y)] > 2) || (is_lava(count,p1.y) == true)) && (mode == 1)) + if (((scenario.ter_types[coord_to_ter(count,p1.y)].blockage > 2) || (is_lava(count,p1.y) == true)) && (mode == 1)) return 5; } } @@ -199,7 +195,7 @@ short can_see(location p1,location p2,short mode) for (count = p1.x + 1; count < p2.x; count++) { storage = storage + get_obscurity(count, p1.y); - if (((terrain_blocked[coord_to_ter(count,p1.y)] > 2) || (is_lava(count,p1.y) == true)) && (mode == 1)) + if (((scenario.ter_types[coord_to_ter(count,p1.y)].blockage > 2) || (is_lava(count,p1.y) == true)) && (mode == 1)) return 5; } } @@ -209,14 +205,14 @@ short can_see(location p1,location p2,short mode) if (p1.y > p2.y) { for (count = p1.y - 1; count > p2.y; count--) { storage = storage + get_obscurity(p1.x, count); - if (((terrain_blocked[coord_to_ter(p1.x,count)] > 2) || (is_lava(p1.x,count) == true)) && (mode == 1)) + if (((scenario.ter_types[coord_to_ter(p1.x,count)].blockage > 2) || (is_lava(p1.x,count) == true)) && (mode == 1)) return 5; } } else { for (count = p1.y + 1; count < p2.y; count++) { storage = storage + get_obscurity(p1.x, count); - if (((terrain_blocked[coord_to_ter(p1.x,count)] > 2) || (is_lava(p1.x,count) == true)) && (mode == 1)) + if (((scenario.ter_types[coord_to_ter(p1.x,count)].blockage > 2) || (is_lava(p1.x,count) == true)) && (mode == 1)) return 5; } } @@ -229,7 +225,7 @@ short can_see(location p1,location p2,short mode) if (p2.y > p1.y) { for (count = 1; count < dy; count++) { storage = storage + get_obscurity(p1.x + (count * dx) / dy, p1.y + count); - if ( ((terrain_blocked[coord_to_ter(p1.x + (count * dx) / dy,p1.y + count)] > 2) || + if ( ((scenario.ter_types[coord_to_ter(p1.x + (count * dx) / dy,p1.y + count)].blockage > 2) || (is_lava(p1.x + (count * dx) / dy,p1.y + count) == true)) && (mode == 1)) return 5; @@ -238,7 +234,7 @@ short can_see(location p1,location p2,short mode) else { for (count = -1; count > dy; count--) { storage = storage + get_obscurity(p1.x + (count * dx) / dy, p1.y + count); - if ( ((terrain_blocked[coord_to_ter(p1.x + (count * dx) / dy, p1.y + count)] > 2) || + if ( ((scenario.ter_types[coord_to_ter(p1.x + (count * dx) / dy, p1.y + count)].blockage > 2) || (is_lava(p1.x + (count * dx) / dy, p1.y + count) == true)) && (mode == 1)) return 5; @@ -250,7 +246,7 @@ short can_see(location p1,location p2,short mode) if (p2.x > p1.x) { for (count = 1; count < dx; count++) { storage = storage + get_obscurity(p1.x + count, p1.y + (count * dy) / dx); - if (((terrain_blocked[coord_to_ter(p1.x + count,p1.y + (count * dy) / dx)] > 2) || + if (((scenario.ter_types[coord_to_ter(p1.x + count,p1.y + (count * dy) / dx)].blockage > 2) || (is_lava(p1.x + count,p1.y + (count * dy) / dx) == true)) && (mode == 1)) return 5; @@ -259,7 +255,7 @@ short can_see(location p1,location p2,short mode) else { for (count = -1; count > dx; count--) { storage = storage + get_obscurity(p1.x + count, p1.y + (count * dy) / dx); - if ( ((terrain_blocked[coord_to_ter(p1.x + count,p1.y + (count * dy) / dx)] > 2) || + if ( ((scenario.ter_types[coord_to_ter(p1.x + count,p1.y + (count * dy) / dx)].blockage > 2) || (is_lava(p1.x + count,p1.y + (count * dy) / dx) == true)) && (mode == 1)) return 5; @@ -542,7 +538,7 @@ return false; bool special_which_blocks_monst(location to_check) { - if (terrain_blocked[coord_to_ter(to_check.x,to_check.y)] == 2) + if (scenario.ter_types[coord_to_ter(to_check.x,to_check.y)].blockage == 2) return true; else return false; } @@ -555,7 +551,7 @@ bool is_special(location to_check) if (special_which_blocks_monst(to_check) == false) return false; which_ter = coord_to_ter(to_check.x,to_check.y); - if (terrain_blocked[which_ter] == 2) + if (scenario.ter_types[which_ter].blockage == 2) return true; else return false; } @@ -563,7 +559,7 @@ bool is_special(location to_check) bool outd_is_special(location to_check) { if (overall_mode == MODE_OUTDOORS) { - if (terrain_blocked[univ.out[to_check.x][to_check.y]] == 2) { + if (scenario.ter_types[univ.out[to_check.x][to_check.y]].blockage == 2) { return true; } else return false; @@ -573,7 +569,7 @@ bool outd_is_special(location to_check) bool impassable(ter_num_t terrain_to_check) { - if (terrain_blocked[terrain_to_check] > 2) + if (scenario.ter_types[terrain_to_check].blockage > 2) return true; else return false; } @@ -583,9 +579,9 @@ short get_blockage(ter_num_t terrain_type) // little kludgy in here for pits if ((terrain_type == 90) && (is_combat()) && (which_combat_type == 0)) return 5; - if ((terrain_blocked[terrain_type] == 5) || (terrain_blocked[terrain_type] == 1)) + if ((scenario.ter_types[terrain_type].blockage == 5) || (scenario.ter_types[terrain_type].blockage == 1)) return 5; - else if (terrain_blocked[terrain_type] > 3) + else if (scenario.ter_types[terrain_type].blockage > 3) return 1; else { return 0; @@ -709,7 +705,7 @@ location push_loc(location from_where,location to_where) return loc_to_try; } if ((get_obscurity((short) loc_to_try.x,(short) loc_to_try.y) > 0) || - (terrain_blocked[univ.town->terrain(loc_to_try.x,loc_to_try.y)] > 0) || + (scenario.ter_types[univ.town->terrain(loc_to_try.x,loc_to_try.y)].blockage > 0) || (loc_off_act_area(loc_to_try) == true) || (monst_there(loc_to_try) < 90) || (pc_there(loc_to_try) < 6)) @@ -724,7 +720,7 @@ bool spot_impassable(short i,short j) ter_num_t ter; ter = coord_to_ter(i,j); - if (terrain_blocked[ter] == 5) + if (scenario.ter_types[ter].blockage == 5) return true; else return false; } diff --git a/osx/boe.locutils.h b/osx/boe.locutils.h index ba345490..890a5c1c 100644 --- a/osx/boe.locutils.h +++ b/osx/boe.locutils.h @@ -1,4 +1,4 @@ -void set_terrain_blocked(); +//void set_terrain_blocked(); //short dist(location p1,location p2); //short ex_sqrt(short val); //short vdist(location p1,location p2) ; diff --git a/osx/boe.main.cpp b/osx/boe.main.cpp index 13448527..ef805c58 100644 --- a/osx/boe.main.cpp +++ b/osx/boe.main.cpp @@ -818,7 +818,6 @@ void handle_file_menu(int item_hit) draw_startup(0); } start_new_game(); - update_pc_graphics(); draw_startup(0); break; case 6: @@ -856,7 +855,6 @@ void handle_options_menu(int item_hit) choice = char_select_pc(0,0,"New graphic for who?"); if (choice < 6) pick_pc_graphic(choice,1,0); - update_pc_graphics(); draw_terrain(); break; @@ -871,7 +869,6 @@ void handle_options_menu(int item_hit) if ((i = FCD(1053,0)) == 2) kill_pc(choice,MAIN_STATUS_ABSENT); } - update_pc_graphics(); draw_terrain(); } break; @@ -1196,10 +1193,7 @@ pascal OSErr handle_open_app(AppleEvent *theAppleEvent,AppleEvent *reply,long ha return noErr; } -pascal OSErr handle_open_doc(AppleEvent *theAppleEvent,AppleEvent *reply,long handlerRefcon) -//AppleEvent *theAppleEvent,*reply; -//long handlerRefcon; -{ +pascal OSErr handle_open_doc(AppleEvent *theAppleEvent,AppleEvent *reply,long handlerRefcon){ FSSpec myFSS; AEDescList docList; OSErr myErr; @@ -1219,10 +1213,9 @@ pascal OSErr handle_open_doc(AppleEvent *theAppleEvent,AppleEvent *reply,long ha do_apple_event_open(myFSS); if ((in_startup_mode == false) && (startup_loaded == true)) end_startup(); - if (in_startup_mode == false) { + if (!in_startup_mode) { post_load(); - } - else update_pc_graphics(); + } } } diff --git a/osx/boe.monster.cpp b/osx/boe.monster.cpp index ee563e3a..5a6fe2c7 100644 --- a/osx/boe.monster.cpp +++ b/osx/boe.monster.cpp @@ -1304,10 +1304,6 @@ short place_monster(m_num_t which,location where) univ.town.monst[i].cur_loc = where; univ.town.monst[i].summoned = 0; univ.town.monst[i].target = 6; - - if (univ.town.monst[i].picture_num < 1000) { - add_monst_graphic(which,1); - } univ.town.set_crate(where.x,where.y,false); univ.town.set_barrel(where.x,where.y,false); @@ -1389,7 +1385,6 @@ void activate_monsters(short code,short attitude) //univ.town.monst[i].cur_loc = univ.town->creatures(i).start_loc; univ.town.monst[i].target = 6; - add_monst_graphic(univ.town.monst[i].number,1); univ.town.set_crate(univ.town.monst[i].cur_loc.x,univ.town.monst[i].cur_loc.y,false); univ.town.set_barrel(univ.town.monst[i].cur_loc.x,univ.town.monst[i].cur_loc.y,false); } diff --git a/osx/boe.party.cpp b/osx/boe.party.cpp index 565b1f74..09b1b4a3 100644 --- a/osx/boe.party.cpp +++ b/osx/boe.party.cpp @@ -316,7 +316,6 @@ void init_party(short mode) // NOT DEBUG build_outdoors(); - update_pc_graphics(); } @@ -499,7 +498,7 @@ void put_party_in_scen(string scen_name) FSGetCatalogInfo(&file_ref, kFSCatInfoNone, NULL, NULL, &file_spec, NULL); if (!load_scenario(file_spec)) return; - set_up_ter_pics(); + init_party_scen_data(); @@ -507,9 +506,7 @@ void put_party_in_scen(string scen_name) // graphics wise end_startup(); in_startup_mode = false; - - set_up_ter_pics(); - + load_outdoors(loc(univ.party.outdoor_corner.x + 1,univ.party.outdoor_corner.y + 1),univ.out.outdoors[1][1]); load_outdoors(loc(univ.party.outdoor_corner.x,univ.party.outdoor_corner.y + 1),univ.out.outdoors[0][1]); load_outdoors(loc(univ.party.outdoor_corner.x + 1,univ.party.outdoor_corner.y),univ.out.outdoors[1][0]); @@ -517,7 +514,6 @@ void put_party_in_scen(string scen_name) stat_screen_mode = 0; build_outdoors(); erase_out_specials(); - update_pc_graphics(); current_pc = first_active_pc(); force_town_enter(scenario.which_town_start,scenario.where_start); @@ -525,7 +521,6 @@ void put_party_in_scen(string scen_name) center = scenario.where_start; update_explored(scenario.where_start); overall_mode = MODE_TOWN; - load_area_graphics(); create_clip_region(); redraw_screen(); set_stat_window(0); @@ -608,7 +603,6 @@ bool create_pc(short spot,short parent_num) univ.party[spot].cur_sp = univ.party[spot].max_sp; } - update_pc_graphics(); return true; } @@ -2981,7 +2975,6 @@ void pc_graphic_event_filter (short item_hit) switch (item_hit) { case 1: univ.party[store_graphic_pc_num].which_graphic = store_pc_graphic; - update_pc_graphics(); if (store_graphic_mode == 0) toast_dialog(); else { @@ -2991,7 +2984,6 @@ void pc_graphic_event_filter (short item_hit) break; case 4: - update_pc_graphics(); if (store_graphic_mode == 0) { if (univ.party[store_graphic_pc_num].main_status < MAIN_STATUS_ABSENT) univ.party[store_graphic_pc_num].main_status = MAIN_STATUS_ABSENT; diff --git a/osx/boe.startup.cpp b/osx/boe.startup.cpp index cbc08eb0..b5d684bc 100644 --- a/osx/boe.startup.cpp +++ b/osx/boe.startup.cpp @@ -63,7 +63,6 @@ bool handle_startup_press(Point the_point) case STARTBTN_NEW: draw_startup(0); start_new_game(); - update_pc_graphics(); make_cursor_sword(); draw_startup(0); break; @@ -125,7 +124,6 @@ void startup_load()//// FSSpec file_to_load = nav_get_party(); if(load_party(file_to_load)){ party_in_memory = true; - update_pc_graphics(); if(univ.party.scen_name.length() > 0) in_startup_mode = false; else in_startup_mode = true; diff --git a/osx/boe.text.cpp b/osx/boe.text.cpp index b3ccbc03..d0499cef 100644 --- a/osx/boe.text.cpp +++ b/osx/boe.text.cpp @@ -71,7 +71,8 @@ extern location dest_locs[40] ; //extern piles_of_stuff_dumping_type *data_store; extern cScenario scenario; -extern GWorldPtr spec_scen_g, pc_stats_gworld, item_stats_gworld, text_area_gworld,tiny_obj_gworld,party_template_gworld,invenbtn_gworld,status_gworld; +extern GWorldPtr spec_scen_g, pc_stats_gworld, item_stats_gworld, text_area_gworld,tiny_obj_gworld,invenbtn_gworld,status_gworld; +extern GWorldPtr pc_gworld; extern short terrain_there[9][9]; // game globals @@ -548,9 +549,9 @@ void place_item_bottom_buttons() item_bottom_button_active[i] = true; to_rect = item_screen_button_rects[i]; rect_draw_some_item (invenbtn_gworld, but_from_rect, item_stats_gworld, to_rect, transparent); - pc_from_rect = get_party_template_rect(i,0); + pc_from_rect = calc_rect(2 * (univ.party[i].which_graphic / 8), univ.party[i].which_graphic % 8); InsetRect(&to_rect,2,2); - rect_draw_some_item (party_template_gworld, pc_from_rect, item_stats_gworld, to_rect, transparent); + rect_draw_some_item (pc_gworld, pc_from_rect, item_stats_gworld, to_rect, transparent); } else item_bottom_button_active[i] = false; } @@ -562,19 +563,6 @@ void place_item_bottom_buttons() rect_draw_some_item(invenbtn_gworld, help_from_rect, item_stats_gworld, to_rect, transparent); } -Rect get_party_template_rect(short pc_num,short mode) -{ - Rect source_rect; - - source_rect.top = (pc_num % 3) * BITMAP_HEIGHT; - source_rect.bottom = 36 + (pc_num % 3) * BITMAP_HEIGHT; - source_rect.left = (pc_num / 3) * BITMAP_WIDTH * 2 + ((mode == 1) ? 28 : 0); - source_rect.right = source_rect.left + BITMAP_WIDTH; - - return source_rect; -} - - void set_stat_window(short new_stat) { short i,array_pos = 0; diff --git a/osx/boe.text.h b/osx/boe.text.h index 8c554ba6..75ea8710 100644 --- a/osx/boe.text.h +++ b/osx/boe.text.h @@ -5,7 +5,7 @@ void put_pc_screen(); void place_buy_button(short position,short pc_num,short item_num); void put_item_screen(short screen_num,short suppress_buttons); void place_item_bottom_buttons(); -Rect get_party_template_rect(short pc_num,short mode); +//Rect get_party_template_rect(short pc_num,short mode); void set_stat_window(short new_stat); void place_item_button(short which_button_to_put,short which_slot,short which_button_position,short extra_val); short first_active_pc(); diff --git a/osx/boe.town.cpp b/osx/boe.town.cpp index 06cc0fb7..2e260e79 100644 --- a/osx/boe.town.cpp +++ b/osx/boe.town.cpp @@ -69,8 +69,6 @@ extern short last_attacked[6],pc_dir[6],pc_parry[6];//,pc_moves[6]; extern location hor_vert_place[14]; extern location diag_place[14]; -extern short terrain_pic[256]; -extern char terrain_blocked[256]; extern location golem_m_locs[16]; extern ModalFilterUPP main_dialog_UPP; extern cScenario scenario; @@ -520,9 +518,6 @@ void start_town_mode(short which_town, short entry_dir) erase_specials(); // make_town_trim(0); - - load_area_graphics(); - univ.town.p_loc = (entry_dir < 9) ? univ.town->start_locs[entry_dir] : town_force_loc; center = univ.town.p_loc; @@ -713,8 +708,6 @@ location end_town_mode(short switching_level,location destination) // returns n overall_mode = MODE_OUTDOORS; erase_out_specials(); - - load_area_graphics(); PSD[SDF_PARTY_STEALTHY] = 0; //PSD[SDF_PARTY_DETECT_LIFE] = 0; //Yes? No? Maybe? @@ -1636,11 +1629,11 @@ pascal void draw_map (DialogPtr the_dialog, short the_item) } else switch ((pic >= 400) ? anim_map_pats[pic - 400] : map_pats[pic]) { case 0: case 10: case 11: - if (terrain_pic[what_ter] < 400) + if (scenario.ter_types[what_ter].picture < 400) OffsetRect(&ter_temp_from, - 6 * (terrain_pic[what_ter] % 10),6 * (terrain_pic[what_ter] / 10)); + 6 * (scenario.ter_types[what_ter].picture % 10),6 * (scenario.ter_types[what_ter].picture / 10)); else OffsetRect(&ter_temp_from, - 24 * ((terrain_pic[what_ter] - 400) / 5),6 * ((terrain_pic[what_ter] - 400) % 5) + 156); + 24 * ((scenario.ter_types[what_ter].picture - 400) / 5),6 * ((scenario.ter_types[what_ter].picture - 400) % 5) + 156); rect_draw_some_item(small_ter_gworld,ter_temp_from,map_gworld,draw_rect); break; diff --git a/osx/classes.h b/osx/classes.h index 3e8328a0..a4eac2a7 100644 --- a/osx/classes.h +++ b/osx/classes.h @@ -25,3 +25,9 @@ #include "creatlist.h" #include "party.h" #include "universe.h" + +extern cScenario scenario; +template type cOutdoors::cWandering::get(m_num_t who,bool hostile,type cMonster::* what){ + if(hostile) return scenario.scen_monsters[monst[who]].*what; + return scenario.scen_monsters[friendly[who]].*what; +} diff --git a/osx/classes/monster.h b/osx/classes/monster.h index f32d63eb..6433f643 100644 --- a/osx/classes/monster.h +++ b/osx/classes/monster.h @@ -133,8 +133,8 @@ public: unsigned short radiate_2; // I THINK this is the extra field for the second ability TODO: Delete in favour of cAbility unsigned char default_attitude; unsigned char summon_type; - unsigned char default_facial_pic; - short picture_num; + pic_num_t default_facial_pic; + pic_num_t picture_num; str_num_t see_str1, see_str2; snd_num_t see_sound, ambient_sound; // ambient_sound has a chance of being played every move spec_num_t see_spec; diff --git a/osx/classes/outdoors.h b/osx/classes/outdoors.h index 3686ea7c..61090cad 100644 --- a/osx/classes/outdoors.h +++ b/osx/classes/outdoors.h @@ -32,6 +32,7 @@ public: cWandering& operator = (legacy::out_wandering_type old); void writeTo(std::ostream& file, std::string prefix = ""); void readAttrFrom(std::string cur, std::istream& sin); + template type get(m_num_t who,bool hostile,type cMonster::* what); }; class cCreature { // formerly outdoor_creature_type public: diff --git a/osx/classes/pc.h b/osx/classes/pc.h index a2096923..3ff2de63 100644 --- a/osx/classes/pc.h +++ b/osx/classes/pc.h @@ -52,7 +52,7 @@ public: bool equip[24]; bool priest_spells[62]; bool mage_spells[62]; - short which_graphic; + pic_num_t which_graphic; short weap_poisoned; //bool advan[15]; bool traits[15]; diff --git a/osx/dialogxml/button.cpp b/osx/dialogxml/button.cpp index ac6cce96..2022f625 100644 --- a/osx/dialogxml/button.cpp +++ b/osx/dialogxml/button.cpp @@ -31,9 +31,15 @@ bool cButton::triggerClickHandler(cDialog& me, std::string id, eKeyMod mods, Poi return false; } -cButton::cButton(cDialog* parent) : cControl(parent,CTRL_BTN) {} +cButton::cButton(cDialog* parent) : + cControl(parent,CTRL_BTN), + wrapLabel(false), + fromList("none") {} -cButton::cButton(cDialog* parent,eControlType t) : cControl(parent,t) {} +cButton::cButton(cDialog* parent,eControlType t) : + cControl(parent,t), + fromList("none"), + wrapLabel("true") {/* This constructor is only called for LEDs. TODO: Should wrapLabel be true for LEDs? */} bool cButton::isClickable(){ return true; @@ -163,7 +169,12 @@ void cLed::init(){ } } -cLed::cLed(cDialog* parent) : cButton(parent,CTRL_LED) {} +cLed::cLed(cDialog* parent) : + cButton(parent,CTRL_LED), + state(led_off), + textFont(SILOM), + textSize(10), + color(parent->defTextClr) {} void cLed::attachClickHandler(click_callback_t f) throw(){ onClick = f; @@ -237,7 +248,9 @@ void cLed::draw(){ SetPort(old_port); } -cLedGroup::cLedGroup(cDialog* parent) : cControl(parent,CTRL_GROUP) {} +cLedGroup::cLedGroup(cDialog* parent) : + cControl(parent,CTRL_GROUP), + fromList("none") {} cButton::~cButton() {} diff --git a/osx/dialogxml/control.cpp b/osx/dialogxml/control.cpp index 52e279d4..23d09a3c 100644 --- a/osx/dialogxml/control.cpp +++ b/osx/dialogxml/control.cpp @@ -233,7 +233,12 @@ void cControl::detachKey(){ this->key.c = 0; } -cControl::cControl(cDialog* p, eControlType t) : parent(p), type(t), visible(true) {} +cControl::cControl(cDialog* p, eControlType t) : parent(p), type(t), visible(true) { + // No key by default. + key.spec = false; + key.c = 0; + key.mod = mod_none; +} bool cControl::triggerClickHandler(cDialog& __attribute__((unused)), std::string __attribute__((unused)), eKeyMod __attribute__((unused)), Point __attribute__((unused))){ return true; diff --git a/osx/dialogxml/dialog.cpp b/osx/dialogxml/dialog.cpp index db52ca2f..bd6855bc 100644 --- a/osx/dialogxml/dialog.cpp +++ b/osx/dialogxml/dialog.cpp @@ -38,6 +38,7 @@ template<> pair cDialog::parse(Element& who /*pict*/){ Iterator attr; std::string name; bool wide = false, tall = false, custom = false; + bool foundTop = false, foundLeft = false, foundType = false, foundNum = false; // required attributes int width = 0, height = 0; p.second = new cPict(this); for(attr = attr.begin(&who); attr != attr.end(); attr++){ @@ -46,6 +47,7 @@ template<> pair cDialog::parse(Element& who /*pict*/){ attr->GetValue(&p.first); else if(name == "type"){ std::string val; + foundType = true; attr->GetValue(&val); if(val == "blank"){ p.second->picType = PIC_TER; @@ -78,7 +80,7 @@ template<> pair cDialog::parse(Element& who /*pict*/){ p.second->picType = PIC_TER_MAP; else if(val == "status") p.second->picType = PIC_STATUS; - else throw xBadVal("pict",name,val); + else throw xBadVal("pict",name,val,attr->Row(),attr->Column()); }else if(name == "custom"){ std::string val; attr->GetValue(&val); @@ -93,19 +95,31 @@ template<> pair cDialog::parse(Element& who /*pict*/){ if(val == "wide") wide = true; else if(val == "tall") tall = true; else if(val == "large") wide = tall = true; - else throw xBadVal("pict",name,val); + else throw xBadVal("pict",name,val,attr->Row(),attr->Column()); + }else if(name == "def-key"){ + std::string val; + attr->GetValue(&val); + try{ + p.second->key = parseKey(val); + }catch(int){ + throw xBadVal("pict",name,val,attr->Row(),attr->Column()); + } }else if(name == "num"){ - attr->GetValue(&p.second->picNum); + attr->GetValue(&p.second->picNum), foundNum = true; }else if(name == "top"){ - attr->GetValue(&p.second->frame.top); + attr->GetValue(&p.second->frame.top), foundTop = true; }else if(name == "left"){ - attr->GetValue(&p.second->frame.left); + attr->GetValue(&p.second->frame.left), foundLeft = true;; }else if(name == "width"){ attr->GetValue(&width); }else if(name == "height"){ attr->GetValue(&height); - }else throw xBadAttr("pict",name); + }else throw xBadAttr("pict",name,attr->Row(),attr->Column()); } + if(!foundType) throw xMissingAttr("pict","type",who.Row(),who.Column()); + if(!foundNum) throw xMissingAttr("pict","num",who.Row(),who.Column()); + if(!foundTop) throw xMissingAttr("pict","top",who.Row(),who.Column()); + if(!foundLeft) throw xMissingAttr("pict","left",who.Row(),who.Column()); if(wide && !tall && p.second->picType == PIC_MONST) p.second->picType = PIC_MONST_WIDE; else if(!wide && tall && p.second->picType == PIC_MONST) p.second->picType = PIC_MONST_TALL; else if(wide && tall){ @@ -168,6 +182,7 @@ template<> pair cDialog::parse(Element& who /*text*/){ Iterator node; string name; int width = 0, height = 0; + bool foundTop = false, foundLeft = false; // top and left are required attributes p.second = new cTextMsg(this); for(attr = attr.begin(&who); attr != attr.end(); attr++){ attr->GetName(&name); @@ -192,7 +207,7 @@ template<> pair cDialog::parse(Element& who /*text*/){ p.second->textFont = SILOM; else if(val == "maidenword") p.second->textFont = MAIDENWORD; - else throw xBadVal("text",name,val); + else throw xBadVal("text",name,val,attr->Row(),attr->Column()); }else if(name == "size"){ std::string val; attr->GetValue(&val); @@ -200,7 +215,7 @@ template<> pair cDialog::parse(Element& who /*text*/){ p.second->textSize = 12; else if(val == "small") p.second->textSize = 10; - else throw xBadVal("text",name,val); + else throw xBadVal("text",name,val,attr->Row(),attr->Column()); }else if(name == "color" || name == "colour"){ std::string val; attr->GetValue(&val); @@ -208,21 +223,31 @@ template<> pair cDialog::parse(Element& who /*text*/){ try{ clr = parseColor(val); }catch(int){ - throw xBadVal("text",name,val); + throw xBadVal("text",name,val,attr->Row(),attr->Column()); } p.second->color = clr; + }else if(name == "def-key"){ + std::string val; + attr->GetValue(&val); + try{ + p.second->key = parseKey(val); + }catch(int){ + throw xBadVal("text",name,val,attr->Row(),attr->Column()); + } }else if(name == "top"){ - attr->GetValue(&p.second->frame.top); + attr->GetValue(&p.second->frame.top), foundTop = true; }else if(name == "left"){ - attr->GetValue(&p.second->frame.left); + attr->GetValue(&p.second->frame.left), foundLeft = true; }else if(name == "width"){ attr->GetValue(&width); }else if(name == "height"){ attr->GetValue(&height); }else if(name == "fromlist"){ attr->GetValue(&p.second->fromList); - }else throw xBadAttr("pict",name); + }else throw xBadAttr("pict",name,attr->Row(),attr->Column()); } + if(!foundTop) throw xMissingAttr("text","top",who.Row(),who.Column()); + if(!foundLeft) throw xMissingAttr("text","left",who.Row(),who.Column()); p.second->frame.right = p.second->frame.left + width; p.second->frame.bottom = p.second->frame.top + height; string content; @@ -234,7 +259,7 @@ template<> pair cDialog::parse(Element& who /*text*/){ else if(type == TiXmlNode::TEXT) content += val; else{ val = '<' + val + '>'; - throw xBadVal("text","",content + val); + throw xBadVal("text","",content + val,node->Row(),node->Column()); } } p.second->lbl = content; @@ -302,6 +327,7 @@ template<> pair cDialog::parse(Element& who /*button*/){ Iterator node; string name; int width = 0, height = 0; + bool foundType = false, foundTop = false, foundLeft = false; // required attributes p.second = new cButton(this); for(attr = attr.begin(&who); attr != attr.end(); attr++){ attr->GetName(&name); @@ -313,6 +339,7 @@ template<> pair cDialog::parse(Element& who /*button*/){ if(val == "true") p.second->wrapLabel = true; }else if(name == "type"){ std::string val; + foundType = true; attr->GetValue(&val); if(val == "small") p.second->type = BTN_SM; @@ -346,20 +373,23 @@ template<> pair cDialog::parse(Element& who /*button*/){ try{ p.second->key = parseKey(val); }catch(int){ - throw xBadVal("button",name,val); + throw xBadVal("button",name,val,attr->Row(),attr->Column()); } }else if(name == "fromlist") attr->GetValue(&p.second->fromList); else if(name == "top"){ - attr->GetValue(&p.second->frame.top); + attr->GetValue(&p.second->frame.top), foundTop = true; }else if(name == "left"){ - attr->GetValue(&p.second->frame.left); + attr->GetValue(&p.second->frame.left), foundLeft = true; }else if(name == "width"){ attr->GetValue(&width); }else if(name == "height"){ attr->GetValue(&height); - }else throw xBadAttr("button",name); + }else throw xBadAttr("button",name,attr->Row(),attr->Column()); } + if(!foundType) throw xMissingAttr("button","type",who.Row(),who.Column()); + if(!foundTop) throw xMissingAttr("button","top",who.Row(),who.Column()); + if(!foundLeft) throw xMissingAttr("button","left",who.Row(),who.Column()); if(width > 0 || height > 0) { p.second->frame.right = p.second->frame.left + width; p.second->frame.bottom = p.second->frame.top + height; @@ -400,12 +430,12 @@ template<> pair cDialog::parse(Element& who /*button*/){ int type = node->Type(); node->GetValue(&val); if(type == TiXmlNode::ELEMENT && val == "key"){ - if(content.length() > 0) throw xBadVal("button","",content + val); + if(content.length() > 0) throw xBadVal("button","",content + val,node->Row(),node->Column()); p.second->labelWithKey = true; }else if(type == TiXmlNode::TEXT) content += val; else{ val = '<' + val + '>'; - throw xBadVal("text","",val); + throw xBadVal("text","",val,node->Row(),node->Column()); } } p.second->lbl = content; @@ -422,6 +452,7 @@ cKey cDialog::parseKey(string what){ key.spec = false; key.c = 0; key.mod = mod_none; + if(what == "none") return key; istringstream sin(what); string parts[4]; sin >> parts[0] >> parts[1] >> parts[2] >> parts[3]; @@ -478,6 +509,7 @@ template<> pair cDialog::parse(Element& who /*LED*/){ Iterator node; string name; int width = 0, height = 0; + bool foundTop = false, foundLeft = false; // requireds p.second = new cLed(this); p.second->type = BTN_LED; for(attr = attr.begin(&who); attr != attr.end(); attr++){ @@ -490,7 +522,7 @@ template<> pair cDialog::parse(Element& who /*LED*/){ if(val == "red") p.second->state = led_red; else if(val == "green") p.second->state = led_green; else if(val == "off") p.second->state = led_off; - else throw xBadVal("led",name,val); + else throw xBadVal("led",name,val,attr->Row(),attr->Column()); }else if(name == "fromlist") attr->GetValue(&p.second->fromList); else if(name == "font"){ @@ -504,7 +536,7 @@ template<> pair cDialog::parse(Element& who /*LED*/){ p.second->textFont = SILOM; else if(val == "maidenword") p.second->textFont = MAIDENWORD; - else throw xBadVal("text",name,val); + else throw xBadVal("text",name,val,attr->Row(),attr->Column()); }else if(name == "size"){ std::string val; attr->GetValue(&val); @@ -512,7 +544,7 @@ template<> pair cDialog::parse(Element& who /*LED*/){ p.second->textSize = 12; else if(val == "small") p.second->textSize = 10; - else throw xBadVal("text",name,val); + else throw xBadVal("text",name,val,attr->Row(),attr->Column()); }else if(name == "color" || name == "colour"){ std::string val; attr->GetValue(&val); @@ -520,19 +552,21 @@ template<> pair cDialog::parse(Element& who /*LED*/){ try{ clr = parseColor(val); }catch(int){ - throw xBadVal("text",name,val); + throw xBadVal("text",name,val,attr->Row(),attr->Column()); } p.second->color = clr; }else if(name == "top"){ - attr->GetValue(&p.second->frame.top); + attr->GetValue(&p.second->frame.top), foundTop = true; }else if(name == "left"){ - attr->GetValue(&p.second->frame.left); + attr->GetValue(&p.second->frame.left), foundLeft = true; }else if(name == "width"){ attr->GetValue(&width); }else if(name == "height"){ attr->GetValue(&height); - }else throw xBadAttr("button",name); + }else throw xBadAttr("button",name,attr->Row(),attr->Column()); } + if(!foundTop) throw xMissingAttr("led","top",who.Row(),who.Column()); + if(!foundLeft) throw xMissingAttr("led","left",who.Row(),who.Column()); if(width > 0 || height > 0) { p.second->frame.right = p.second->frame.left + width; p.second->frame.bottom = p.second->frame.top + height; @@ -548,7 +582,7 @@ template<> pair cDialog::parse(Element& who /*LED*/){ if(type == TiXmlNode::TEXT) content += val; else{ val = '<' + val + '>'; - throw xBadVal("text","",content + val); + throw xBadVal("text","",content + val,node->Row(),node->Column()); } } p.second->lbl = content; @@ -572,7 +606,7 @@ template<> pair cDialog::parse(Element& who /*group*/){ attr->GetValue(&p.first); else if(name == "fromlist") attr->GetValue(&p.second->fromList); - else throw xBadAttr("button",name); + else throw xBadAttr("button",name,attr->Row(),attr->Column()); } string content; for(node = node.begin(&who); node != node.end(); node++){ @@ -583,7 +617,7 @@ template<> pair cDialog::parse(Element& who /*group*/){ p.second->choices.insert(parse(*node)); }else{ val = '<' + val + '>'; - throw xBadVal("text","", content + val); + throw xBadVal("text","", content + val,node->Row(),node->Column()); } } p.second->lbl = content; @@ -602,6 +636,7 @@ template<> pair cDialog::parse(Element& who /*field*/){ Iterator node; string name; int width = 0, height = 0; + bool foundTop = false, foundLeft = false; // requireds p.second = new cTextField(this); for(attr = attr.begin(&who); attr != attr.end(); attr++){ attr->GetName(&name); @@ -614,17 +649,19 @@ template<> pair cDialog::parse(Element& who /*field*/){ p.second->isNumericField = true; else if(val == "text") p.second->isNumericField = false; - else throw xBadVal("field",name,val); + else throw xBadVal("field",name,val,attr->Row(),attr->Column()); }else if(name == "top"){ - attr->GetValue(&p.second->frame.top); + attr->GetValue(&p.second->frame.top), foundTop = true; }else if(name == "left"){ - attr->GetValue(&p.second->frame.left); + attr->GetValue(&p.second->frame.left), foundLeft = true; }else if(name == "width"){ attr->GetValue(&width); }else if(name == "height"){ attr->GetValue(&height); - }else throw xBadAttr("button",name); + }else throw xBadAttr("button",name,attr->Row(),attr->Column()); } + if(!foundTop) throw xMissingAttr("field","top",attr->Row(),attr->Column()); + if(!foundLeft) throw xMissingAttr("field","left",attr->Row(),attr->Column()); p.second->frame.right = p.second->frame.left + width; p.second->frame.bottom = p.second->frame.top + height; if(p.first == ""){ @@ -635,13 +672,13 @@ template<> pair cDialog::parse(Element& who /*field*/){ return p; } -cDialog::cDialog(cDialog* p) : parent(p) {} +cDialog::cDialog(cDialog* p) : parent(p), win(NULL) {} -cDialog::cDialog(std::string path) : parent(NULL){ +cDialog::cDialog(std::string path) : parent(NULL), win(NULL){ loadFromFile(path); } -cDialog::cDialog(std::string path, cDialog* p) : parent(p){ +cDialog::cDialog(std::string path, cDialog* p) : parent(p), win(NULL){ loadFromFile(path); } @@ -668,7 +705,7 @@ void cDialog::loadFromFile(std::string path){ string type, name, val; xml.FirstChildElement()->GetValue(&type); - if(type != "dialog") throw xBadNode(type); + if(type != "dialog") throw xBadNode(type,xml.FirstChildElement()->Row(),xml.FirstChildElement()->Column()); for(attr = attr.begin(xml.FirstChildElement()); attr != attr.end(); attr++){ attr->GetName(&name); attr->GetValue(&val); @@ -678,10 +715,19 @@ void cDialog::loadFromFile(std::string path){ else{ istringstream sin(val); sin >> bg; - if(sin.fail()) throw xBadVal(type,name,val); + if(sin.fail()) throw xBadVal(type,name,val,attr->Row(),attr->Column()); } + }else if(name == "fore"){ + RGBColor clr; + try{ + clr = parseColor(val); + }catch(int){ + throw xBadVal("text",name,val,attr->Row(),attr->Column()); + } + defTextClr = clr; + }else if(name != "debug") - throw xBadAttr(type,name); + throw xBadAttr(type,name,attr->Row(),attr->Column()); } for(node = node.begin(xml.FirstChildElement()); node != node.end(); node++){ @@ -701,7 +747,7 @@ void cDialog::loadFromFile(std::string path){ controls.insert(parse(*node)); else if(type == "group") controls.insert(parse(*node)); - else throw xBadNode(type); + else throw xBadNode(type,node->Row(),node->Column()); } } catch(Exception& x){ // XML processing exception printf(x.what()); @@ -715,6 +761,9 @@ void cDialog::loadFromFile(std::string path){ } catch(xBadNode& x){ // Invalid element printf(x.what()); exit(1); + } catch(xMissingAttr& x){ // Invalid element + printf(x.what()); + exit(1); } dialogNotToast = true; bg = BG_DARK; // default is dark background @@ -731,7 +780,6 @@ void cDialog::loadFromFile(std::string path){ } iter++; } - win = NewCWindow(NULL, &winRect, (unsigned char*) "", false, dBoxProc, IN_FRONT, false, 0); // TODO: Set parent } @@ -795,9 +843,14 @@ void cDialog::run(){ GrafPtr old_port; std::string itemHit = ""; dialogNotToast = true; + if(win == NULL) { + recalcRect(); + win = NewCWindow(NULL, &winRect, (unsigned char*) "", false, dBoxProc, IN_FRONT, false, 0); + } GetPort(&old_port); - ShowWindow(win); SetPortWindowPort(win); + ShowWindow(win); + SelectWindow(win); BeginAppModalStateForWindow(win); while(dialogNotToast){ if(!WaitNextEvent(everyEvent, ¤tEvent, 0, NULL))continue; @@ -964,7 +1017,11 @@ std::string cDialog::process_click(Point where, eKeyMod mods){ return ""; } -xBadNode::xBadNode(std::string t) throw() : type(t), msg(NULL) {} +xBadNode::xBadNode(std::string t, int r, int c) throw() : + type(t), + row(r), + col(c), + msg(NULL) {} const char* xBadNode::what() throw() { if(msg == NULL){ @@ -973,7 +1030,7 @@ const char* xBadNode::what() throw() { printf("Allocation of memory for error message failed, bailing out..."); abort(); } - sprintf(s,"XML Parse Error: Unknown element %s encountered.",type.c_str()); + sprintf(s,"XML Parse Error: Unknown element %s encountered (line %d, column %d).",type.c_str(),row,col); msg = s; } return msg; @@ -983,7 +1040,12 @@ xBadNode::~xBadNode() throw(){ if(msg != NULL) delete msg; } -xBadAttr::xBadAttr(std::string t, std::string n) throw() : type(t), name(n), msg(NULL) {} +xBadAttr::xBadAttr(std::string t, std::string n, int r, int c) throw() : + type(t), + name(n), + row(r), + col(c), + msg(NULL) {} const char* xBadAttr::what() throw() { if(msg == NULL){ @@ -992,7 +1054,7 @@ const char* xBadAttr::what() throw() { printf("Allocation of memory for error message failed, bailing out..."); abort(); } - sprintf(s,"XML Parse Error: Unknown attribute %s encountered on element %s.",name.c_str(),type.c_str()); + sprintf(s,"XML Parse Error: Unknown attribute %s encountered on element %s (line %d, column %d).",name.c_str(),type.c_str(),row,col); msg = s; } return msg; @@ -1002,7 +1064,37 @@ xBadAttr::~xBadAttr() throw(){ if(msg != NULL) delete msg; } -xBadVal::xBadVal(std::string t, std::string n, std::string v) throw() : type(t), name(n), val(v), msg(NULL) {} +xMissingAttr::xMissingAttr(std::string t, std::string n, int r, int c) throw() : + type(t), + name(n), + row(r), + col(c), + msg(NULL) {} + +const char* xMissingAttr::what() throw() { + if(msg == NULL){ + char* s = new (nothrow) char[100]; + if(s == NULL){ + printf("Allocation of memory for error message failed, bailing out..."); + abort(); + } + sprintf(s,"XML Parse Error: Required attribute %s missing on element %s (line %d, column %d).",name.c_str(),type.c_str(),row,col); + msg = s; + } + return msg; +} + +xMissingAttr::~xMissingAttr() throw(){ + if(msg != NULL) delete msg; +} + +xBadVal::xBadVal(std::string t, std::string n, std::string v, int r, int c) throw() : + type(t), + name(n), + val(v), + row(r), + col(c), + msg(NULL) {} const char* xBadVal::what() throw() { if(msg == NULL){ @@ -1011,7 +1103,7 @@ const char* xBadVal::what() throw() { printf("Allocation of memory for error message failed, bailing out..."); abort(); } - sprintf(s,"XML Parse Error: Invalid value %s for attribute %s encountered on element %s.",val.c_str(),name.c_str(),type.c_str()); + sprintf(s,"XML Parse Error: Invalid value %s for attribute %s encountered on element %s (line %d, column %d).",val.c_str(),name.c_str(),type.c_str(),row,col); msg = s; } return msg; diff --git a/osx/dialogxml/dialog.dtd b/osx/dialogxml/dialog.dtd index 544c4b71..4a73f2e0 100644 --- a/osx/dialogxml/dialog.dtd +++ b/osx/dialogxml/dialog.dtd @@ -7,32 +7,34 @@ + - - + + @@ -74,4 +78,7 @@ + \ No newline at end of file diff --git a/osx/dialogxml/dialog.h b/osx/dialogxml/dialog.h index 1eb039ad..07593288 100644 --- a/osx/dialogxml/dialog.h +++ b/osx/dialogxml/dialog.h @@ -74,27 +74,40 @@ private: class xBadNode : std::exception { std::string type; + int row, col; const char* msg; public: - xBadNode(std::string t) throw(); + xBadNode(std::string t, int r, int c) throw(); ~xBadNode() throw(); const char* what() throw(); }; class xBadAttr : std::exception { std::string type, name; + int row, col; const char* msg; public: - xBadAttr(std::string t,std::string n) throw(); + xBadAttr(std::string t,std::string n, int r, int c) throw(); ~xBadAttr() throw(); const char* what() throw(); }; +class xMissingAttr : std::exception { + std::string type, name; + int row, col; + const char* msg; +public: + xMissingAttr(std::string t,std::string n, int r, int c) throw(); + ~xMissingAttr() throw(); + const char* what() throw(); +}; + class xBadVal : std::exception { std::string type, name, val; + int row, col; const char* msg; public: - xBadVal(std::string t,std::string n,std::string v) throw(); + xBadVal(std::string t,std::string n,std::string v, int r, int c) throw(); ~xBadVal() throw(); const char* what() throw(); }; diff --git a/osx/dialogxml/dialog.xsl b/osx/dialogxml/dialog.xsl index 468fdd45..2e666c65 100644 --- a/osx/dialogxml/dialog.xsl +++ b/osx/dialogxml/dialog.xsl @@ -86,7 +86,7 @@ background-image: url('bg/.png'); debug - color: ; + color: ; font-family: Geneva @@ -108,7 +108,7 @@ background-image: url('bg/.png'); debug - color: ; + color: ; font-family: Geneva @@ -133,7 +133,7 @@ background-image: url('bg/.png'); debug - color: ; + color: ; font-family: ; left: px; top: px; width: px; height: px; diff --git a/osx/dialogxml/edit-terrain.xml b/osx/dialogxml/edit-terrain.xml index 1df0b702..d633131f 100644 --- a/osx/dialogxml/edit-terrain.xml +++ b/osx/dialogxml/edit-terrain.xml @@ -1,7 +1,7 @@ - + Edit Terrain Type Terrain number: diff --git a/osx/dialogxml/field.cpp b/osx/dialogxml/field.cpp index f2d3ba7f..d26c2889 100644 --- a/osx/dialogxml/field.cpp +++ b/osx/dialogxml/field.cpp @@ -51,7 +51,9 @@ bool cTextField::isClickable(){ return false; } -cTextField::cTextField(cDialog* parent) : cControl(parent,CTRL_FIELD) { +cTextField::cTextField(cDialog* parent) : + cControl(parent,CTRL_FIELD), + isNumericField(false) { OSStatus err; err = CreateEditTextControl(parent->win,&frame,NULL,false,true/*useInlineInput*/,NULL,&theField); } diff --git a/osx/dialogxml/message.cpp b/osx/dialogxml/message.cpp index 59fa9695..80e130b3 100644 --- a/osx/dialogxml/message.cpp +++ b/osx/dialogxml/message.cpp @@ -93,7 +93,14 @@ short cTextMsg::getFormat(eFormat prop) throw(xUnsupportedProp){ return 0; } -cTextMsg::cTextMsg(cDialog* parent) : cControl(parent,CTRL_TEXT), drawFramed(true), textFont(SILOM), textSize(10) {} +cTextMsg::cTextMsg(cDialog* parent) : + cControl(parent,CTRL_TEXT), + drawFramed(true), + textFont(SILOM), + textSize(10), + color(parent->defTextClr), + clickable(false), + fromList("none") {} bool cTextMsg::isClickable(){ return clickable; diff --git a/osx/dialogxml/pict.cpp b/osx/dialogxml/pict.cpp index a8fdc016..1d1ddcc5 100644 --- a/osx/dialogxml/pict.cpp +++ b/osx/dialogxml/pict.cpp @@ -250,7 +250,9 @@ ePicType cPict::getPicType(){ return picType; } -cPict::cPict(cDialog* parent) : cControl(parent,CTRL_PICT) {} +cPict::cPict(cDialog* parent) : + cControl(parent,CTRL_PICT), + clickable(false) {} bool cPict::isClickable(){ return clickable; @@ -580,7 +582,7 @@ void cPict::drawPresetMonstSm(short num, Rect to_rect){ if(!isSheetSet(SHEET_MONST,m_start_pic / 20)) throw xMissingSheet(SHEET_MONST,m_start_pic / 20); GWorldPtr from_gw = monst[m_start_pic / 20]; m_start_pic = m_start_pic % 20; - Rect from_rect = calcDefMonstRect(num, animFrame); + Rect from_rect = calcDefMonstRect(m_start_pic, animFrame); to_rect.right = to_rect.left + 28; to_rect.bottom = to_rect.top + 36; PaintRect(&to_rect);