// Blades of Exile Scenario Editor #include #include "stdlib.h" #include "string.h" #include "stdio.h" #include "math.h" #include "global.h" #include "graphics.h" #include "tactions.h" #include "tfileio.h" #include "dlogtool.h" #include "buttonmg.h" #include "edsound.h" #include "townout.h" #include "scenario.h" #include "keydlgs.h" #include "graphutl.h" void check_game_done(); void check_colors(); bool need_redraw = FALSE; void cursor_stay(); Boolean verify_restore_quit(short mode); void max_window(HWND window); short check_cd_event(HWND hwnd,UINT message,WPARAM wparam, LPARAM lparam); short cur_viewing_mode = 0; extern unsigned long anim_ticks; extern terrain_type_type store_ter; extern BOOL do_choose_anim; extern BOOL play_anim; extern short custom_type[500]; /* Mac stuff globals */ Boolean All_Done = FALSE; Boolean in_startup_mode = TRUE,mouse_button_held = FALSE; Boolean play_sounds = TRUE; Boolean palette_suspect = FALSE,window_in_front = TRUE; Boolean change_made = FALSE; HWND right_sbar; short cur_town; location cur_out; short mode_count = 0; /* Display globals */ short give_delays = 0; Boolean dialog_not_toast = TRUE; short dialog_answer; char file_path_name[256]; /* Windoze stuff globals */ Boolean cursor_shown = TRUE; short ulx = 0, uly = 0; HWND mainPtr; HFONT font,small_bold_font,italic_font,underline_font,bold_font,tiny_font; HDC main_dc,main_dc2,main_dc3; HINSTANCE store_hInstance; HACCEL accel; BOOL event_handled; scenario_data_type scenario; piles_of_stuff_dumping_type *data_store; RECT right_sbar_rect; town_record_type town; big_tr_type t_d; outdoor_record_type current_terrain; talking_record_type talking; short overall_mode = 61; scen_item_data_type scen_item_list; char scen_strs[160][256]; char scen_strs2[110][256]; char talk_strs[170][256]; char town_strs[180][256]; unsigned char borders[4][50]; short max_dim[3] = {64,48,32}; short cen_x, cen_y; Boolean editing_town = FALSE; short town_type = 0; // 0 - big 1 - ave 2 - small char szWinName[] = "BoE for Win32 dialogs"; char szAppName[] = "Classic BoE Scenario Editor"; char last_file_printed = 0; char szBladBase[128]; void loadSettingsFromFile() { const int BUFFER_LEN = 64; char buffer[BUFFER_LEN]; const char * iniFile = "./blades.ini"; const char * section = "Scenario Editor"; GetPrivateProfileString(section, "bladbase.exs", "bladbase.exs", szBladBase, 126, iniFile); szBladBase[127] = 0; GetPrivateProfileString(section, "play_sounds", "1", buffer, BUFFER_LEN, iniFile); play_sounds = (atoi(buffer))? TRUE : FALSE; GetPrivateProfileString(section, "play_animations", "1", buffer, BUFFER_LEN, iniFile); play_anim = (atoi(buffer))? TRUE : FALSE; if(play_anim == TRUE){//if option is active, check the menu item HMENU menu,big_menu; big_menu = GetMenu(mainPtr); menu = GetSubMenu(big_menu,4); CheckMenuItem(menu,411,MF_BYCOMMAND | MF_CHECKED); } } void saveSettingsToFile() { const char * iniFile = "./blades.ini"; const char * section = "Scenario Editor"; WritePrivateProfileString(section, "bladbase.exs", szBladBase, iniFile); WritePrivateProfileString(section, "play_sounds", (play_sounds)? "1" : "0", iniFile); WritePrivateProfileString(section, "play_animations", (play_anim) ? "1" : "0", iniFile); } Boolean block_erase = FALSE; RECT windRect; LRESULT CALLBACK WndProc (HWND, UINT, WPARAM, LPARAM); Boolean handle_menu (short, HMENU); int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance,LPSTR, int nCmdShow) { MSG msg; WNDCLASS wndclass,wndclass2; short seed; if (!hPrevInstance) { wndclass.style = CS_HREDRAW | CS_VREDRAW | CS_BYTEALIGNWINDOW; wndclass.lpfnWndProc = WndProc; wndclass.cbClsExtra = 0; wndclass.cbWndExtra = 0; wndclass.hInstance = hInstance; wndclass.hIcon = LoadIcon(hInstance,MAKEINTRESOURCE(10)); wndclass.hCursor = NULL; wndclass.hbrBackground = (HBRUSH) GetStockObject(WHITE_BRUSH); wndclass.lpszMenuName = MAKEINTRESOURCE(1); wndclass.lpszClassName = szAppName; RegisterClass(&wndclass); wndclass2.style = CS_HREDRAW | CS_VREDRAW | CS_BYTEALIGNWINDOW; wndclass2.lpfnWndProc = WndProc; wndclass2.cbClsExtra = 0; wndclass2.cbWndExtra = 0; wndclass2.hInstance = hInstance; wndclass2.hIcon = LoadIcon(hInstance,MAKEINTRESOURCE(10)); wndclass2.hCursor = NULL; wndclass2.hbrBackground = (HBRUSH) GetStockObject(WHITE_BRUSH); wndclass2.lpszMenuName = NULL; wndclass2.lpszClassName = szWinName; RegisterClass(&wndclass2); } mainPtr = CreateWindow (szAppName, "Classic Blades of Exile Scenario Editor", WS_OVERLAPPEDWINDOW | WS_CLIPCHILDREN, 0, 0, 536, 478, NULL, NULL, hInstance, NULL); if (!hPrevInstance) { // initialize //center_window(mainPtr); Get_Path(file_path_name); store_hInstance = hInstance; accel = LoadAccelerators(hInstance, MAKEINTRESOURCE(1)); loadSettingsFromFile(); seed = (short) GetCurrentTime(); srand(seed); data_store = new piles_of_stuff_dumping_type; max_window(mainPtr); GetWindowRect(mainPtr,&windRect); SetTimer(mainPtr,1,20,NULL); ShowWindow(mainPtr,nCmdShow); Set_up_win (); init_lb(); init_rb(); init_town(1); init_out(); init_scenario(); font = CreateFont(12,0,0,0,0, 0,0,0, 0,0, 0,0,0,"MS Sans Serif"); small_bold_font = CreateFont(12,0,0,0,700, 0,0,0, 0,0, 0,0,0,"MS Sans Serif"); italic_font = CreateFont(12,0,0,0,0, 1,0,0, 0,0, 0,0,0,"MS Sans Serif"); underline_font = CreateFont(12,0,0,0,0, 0,1,0, 0,0, 0,0,0,"MS Sans Serif"); bold_font = CreateFont(14,0,0,0,700, 0,0,0, 0,0, 0,0,0,"MS Sans Serif"); tiny_font = font; load_sounds(); right_sbar_rect.top = RIGHT_AREA_UL_Y; right_sbar_rect.left = RIGHT_AREA_UL_X + RIGHT_AREA_WIDTH - 16 ; right_sbar_rect.bottom = RIGHT_AREA_UL_Y + RIGHT_AREA_HEIGHT; right_sbar_rect.right = RIGHT_AREA_UL_X + RIGHT_AREA_WIDTH ; right_sbar = CreateWindow("scrollbar",NULL, WS_CHILD | WS_TABSTOP | SBS_VERT, right_sbar_rect.left + ulx,right_sbar_rect.top + uly, right_sbar_rect.right - right_sbar_rect.left, right_sbar_rect.bottom - right_sbar_rect.top, mainPtr,(HMENU) 1,store_hInstance,NULL); init_screen_locs(); set_up_start_screen(); file_initialize(); check_colors(); cursor_stay(); update_item_menu(); shut_down_menus(0); cd_init_dialogs(); } event_handled = FALSE; while(GetMessage(&msg,NULL,0,0)) { if (event_handled == FALSE) { if (!TranslateAccelerator(mainPtr, accel, &msg)) { TranslateMessage(&msg); DispatchMessage(&msg); } } } delete data_store; saveSettingsToFile(); return msg.wParam; } LRESULT CALLBACK WndProc (HWND hwnd, UINT message,WPARAM wParam, LPARAM lParam) { PAINTSTRUCT ps; //RECT s_rect = {0,0,30,30},d_rect = {0,0,30,30},d2 = {0,0,420,216},s2 = {0,0,420,216}; POINT press; short handled = 0,sbar_pos = 0,old_setting; long which_sbar; int min = 0, max = 0; HMENU menu; POINT p; RECT r; switch (message) { case WM_KEYDOWN: if (hwnd != mainPtr) { check_cd_event(hwnd,message,wParam,lParam); } else { All_Done = handle_syskeystroke(wParam,lParam,&handled); } return 0; break; case WM_CHAR: if (hwnd != mainPtr) check_cd_event(hwnd,message,wParam,lParam); else { All_Done = handle_keystroke(wParam,lParam); } return 0; break; case WM_LBUTTONDOWN: cursor_stay(); if (hwnd != mainPtr) check_cd_event(hwnd,message,wParam,lParam); else { SetFocus(hwnd); press = MAKEPOINT(lParam); All_Done = handle_action(press, wParam,lParam); check_game_done(); } return 0; break; case WM_LBUTTONUP: mouse_button_held = FALSE; break; case WM_RBUTTONDOWN: mouse_button_held = FALSE; cursor_stay(); if (hwnd != mainPtr) check_cd_event(hwnd,message,wParam,lParam); else { SetFocus(hwnd); press = MAKEPOINT(lParam); All_Done = handle_action(press, wParam,-2); check_game_done(); } return 0; break; case WM_TIMER: // first, mouse held? if ((wParam == 1) && (mouse_button_held == TRUE)) { GetCursorPos(&p); ScreenToClient(mainPtr,&p); All_Done = handle_action(p, 0,0); } // second, refresh cursor? if ((wParam == 1) && (overall_mode < 60) && (GetFocus() == mainPtr)) { GetCursorPos(&p); ScreenToClient(mainPtr,&p); GetClientRect(mainPtr,&r); if (PtInRect(&r,p)) restore_cursor(); } if(play_anim == TRUE){ anim_ticks++; if(overall_mode < 60){ draw_terrain(); } if(overall_mode == 62){ if(store_ter.picture >= 2000) csp(813,14,store_ter.picture - 2000, 5); else if (store_ter.picture >= 400 && store_ter.picture < 1000) csp(813,14,store_ter.picture - 100, 0); if(do_choose_anim == TRUE){ put_choice_pics(); } } } break; case WM_PALETTECHANGED: palette_suspect = TRUE; return 0; case WM_ACTIVATE: if (hwnd == mainPtr) { if (((wParam == WA_ACTIVE) ||(wParam == WA_CLICKACTIVE)) && (palette_suspect == TRUE)) { palette_suspect = FALSE; } if ((wParam == WA_ACTIVE) ||(wParam == WA_CLICKACTIVE)) { window_in_front = TRUE; } if (wParam == WA_INACTIVE) { window_in_front = FALSE; } } return 0; case WM_MOUSEMOVE: if ((mouse_button_held == TRUE) && (hwnd == mainPtr)) { press = MAKEPOINT(lParam); All_Done = handle_action(press, wParam,lParam); } restore_cursor(); return 0; case WM_PAINT: BeginPaint(hwnd,&ps); EndPaint(hwnd,&ps); if (hwnd != mainPtr) check_cd_event(hwnd,message,wParam,lParam); else redraw_screen(); return 0; case WM_VSCROLL: which_sbar = GetWindowLong((HWND) lParam, GWL_ID); switch (which_sbar) { case 1: sbar_pos = GetScrollPos(right_sbar,SB_CTL); old_setting = sbar_pos; GetScrollRange(right_sbar,SB_CTL,&min,&max); switch (LOWORD(wParam)) { case SB_PAGEDOWN: sbar_pos += NRSONPAGE - 1; break; case SB_LINEDOWN: sbar_pos++; break; case SB_PAGEUP: sbar_pos -= NRSONPAGE - 1; break; case SB_LINEUP: sbar_pos--; break; case SB_TOP: sbar_pos = 0; break; case SB_BOTTOM: sbar_pos = max; break; case SB_THUMBPOSITION: case SB_THUMBTRACK: sbar_pos = HIWORD(wParam); break; } if (sbar_pos < 0) sbar_pos = 0; if (sbar_pos > max) sbar_pos = max; lpsi.fMask = SIF_POS; lpsi.nPos = sbar_pos; SetScrollInfo(right_sbar,SB_CTL,&lpsi,TRUE); // SetScrollPos(right_sbar,SB_CTL,sbar_pos,TRUE); if (sbar_pos != old_setting) draw_rb(); break; } SetFocus(mainPtr); return 0; case WM_COMMAND: if (hwnd == mainPtr) { menu = GetMenu(mainPtr); handle_menu((short) wParam, menu); check_game_done(); } else { check_cd_event(hwnd,message,wParam,lParam); } return 0; case WM_DESTROY: case WM_CLOSE: if (hwnd == mainPtr) { discard_graphics(); PostQuitMessage(0); } return 0; case WM_QUIT: if (hwnd == mainPtr) discard_graphics(); break; } return DefWindowProc(hwnd,message,wParam,lParam); } void check_game_done() { if (All_Done == TRUE) { discard_graphics(); PostQuitMessage(0); } } Boolean handle_menu (short item, HMENU menu) { short i; Boolean to_return = FALSE; short item_hit; item_hit = item; switch (item) { case -1: break; case 1: // open load_scenario(); if (overall_mode == 60) { update_item_menu(); set_up_main_screen(); } break; case 2: // save modify_lists(); save_scenario(); break; case 3: // new scen build_scenario(); if (overall_mode == 60) set_up_main_screen(); break; case 5: // quit if (save_check(869) == FALSE) break; discard_graphics(); PostQuitMessage(0); break; // Scenario Menu case 101: if (change_made == TRUE) { give_error("You need to save the changes made to your scenario before you can add a new town.", "",0); return to_return; } if (scenario.num_towns >= 200) { give_error("You have reached the limit of 200 towns you can have in one scenario.", "",0); return to_return; } if (new_town(scenario.num_towns) == TRUE) set_up_main_screen(); break; case 103: edit_scen_details(); break; case 104: edit_scen_intro(); break; case 105: set_starting_loc(); break; case 106: overall_mode = 47; set_string("Select party starting location.",""); break; case 109: lpsi.fMask = SIF_POS; lpsi.nPos = 0; SetScrollInfo(right_sbar,SB_CTL,&lpsi,TRUE); //SetScrollPos(right_sbar,SB_CTL,0,TRUE); start_special_editing(0,0); break; case 110: lpsi.fMask = SIF_POS; lpsi.nPos = 0; SetScrollInfo(right_sbar,SB_CTL,&lpsi,TRUE); //SetScrollPos(right_sbar,SB_CTL,0,TRUE); start_string_editing(0,0); break; case 111: if (change_made == TRUE) { give_error("You need to save the changes made to your scenario before you can add a new town.", "",0); return to_return; } i = pick_import_town(841,0); if (i >= 0) { import_town(i); change_made = TRUE; redraw_screen(); } break; case 112: edit_save_rects(); break; case 113: edit_horses(); break; case 114: edit_boats(); break; case 115: edit_add_town(); break; case 116: edit_scenario_events(); break; case 117: edit_item_placement(); break; case 118: if (change_made == TRUE) { give_error("You need to save the changes made to your scenario before you can delete a town.", "",0); return to_return; } if (scenario.num_towns == 1) { give_error("You can't delete the last town in a scenario. All scenarios must have at least 1 town.", "",0); return to_return; } if (scenario.num_towns - 1 == cur_town) { give_error("You can't delete the last town in a scenario while you're working on it. Load a different town, and try this again.", "",0); return to_return; } if (scenario.num_towns - 1 == scenario.which_town_start) { give_error("You can't delete the last town in a scenario while it's the town the party starts the scenario in. Change the parties starting point and try this again.", "",0); return to_return; } if (fancy_choice_dialog(865,0) == 1) delete_last_town(); break; case 119: if (fancy_choice_dialog(866,0) == 1) { last_file_printed = 0; start_data_dump(); } break; case 120: if (change_made == TRUE) { give_error("You need to save the changes made to your scenario before you can print the file Scenario Text.", "",0); return to_return; } if (fancy_choice_dialog(871,0) == 1) { last_file_printed = 1; scen_text_dump(); redraw_screen(); } break; case 121: if (fancy_choice_dialog(867,0) == 1) { last_file_printed = 2; start_shopping_data_dump(); } break; case 122: if (fancy_choice_dialog(868,0) == 1) { last_file_printed = 3; start_monst_data_dump(); } break; case 123: if (fancy_choice_dialog(890,0) == 1) { last_file_printed = 4; start_spec_data_dump(); } break; case 124: if (fancy_choice_dialog(878,0) == 1) { last_file_printed = 7; object_scenario_data_dump(); } break; // Town Menu case 201: edit_town_details(); break; case 202: edit_town_wand(); break; case 203: overall_mode = 9; mode_count = 2; set_cursor(5); set_string("Set town boundary","Select upper left corner"); break; case 204: frill_up_terrain(); break; case 205: unfrill_terrain(); break; case 206: edit_town_strs(); break; case 208: if (fancy_choice_dialog(863,0) == 2) // add random break; place_items_in_town(); break; case 209: for (i = 0; i < 64; i++) // set not prop town.preset_items[i].property = 0; fancy_choice_dialog(861,0); draw_terrain(); break; case 210: if (fancy_choice_dialog(862,0) == 2) // clear all items break; for (i = 0; i < 64; i++) town.preset_items[i].item_code = -1; draw_terrain(); break; case 213: lpsi.fMask = SIF_POS; lpsi.nPos = 0; SetScrollInfo(right_sbar,SB_CTL,&lpsi,TRUE); //SetScrollPos(right_sbar,SB_CTL,0,TRUE); start_special_editing(2,0); break; case 214: lpsi.fMask = SIF_POS; lpsi.nPos = 0; SetScrollInfo(right_sbar,SB_CTL,&lpsi,TRUE); //SetScrollPos(right_sbar,SB_CTL,0,TRUE); start_string_editing(2,0); break; case 215: edit_advanced_town(); break; case 216: edit_town_events(); break; case 217: if (fancy_choice_dialog(872,0) == 2) // clear all monsters break; for (i = 0; i < 60; i++) { t_d.creatures[i].number = 0; t_d.creatures[i].start_loc.x = 0; t_d.creatures[i].start_loc.y = 0; t_d.creatures[i].spec_enc_code = 0; t_d.creatures[i].time_flag = 0; t_d.creatures[i].spec1 = -1; t_d.creatures[i].spec2 = -1; } break; case 218: if (fancy_choice_dialog(873,0) == 2) // clear all special encounters break; for (i = 0; i < 50; i++) { town.special_locs[i].x = 100; town.special_locs[i].y = 0; town.spec_id[i] = 255; } break; case 219: if (fancy_choice_dialog(874,0) == 2) // clear all fields break; for (i = 0; i < 50; i++) if ((town.preset_fields[i].field_type >= 0) && (town.preset_fields[i].field_type < 9)) { town.preset_fields[i].field_type = 0; town.preset_fields[i].field_loc.x = 0; town.preset_fields[i].field_loc.y = 0; } break; case 220: if (fancy_choice_dialog(876,0) == 2) // clear all stains break; for (i = 0; i < 50; i++) if ((town.preset_fields[i].field_type > 13) && (town.preset_fields[i].field_type < 22)) { town.preset_fields[i].field_type = 0; town.preset_fields[i].field_loc.x = 0; town.preset_fields[i].field_loc.y = 0; } break; case 221: if (fancy_choice_dialog(877,0) == 1) { // make concise town report last_file_printed = 5; start_town_data_dump(); } break; case 222: start_dialogue_editing(0); break; // Outdoor Menu case 301: outdoor_details(); break; case 302: edit_out_wand(0); break; case 303: edit_out_wand(1); break; case 304: frill_up_terrain(); break; case 305: unfrill_terrain(); break; case 306: edit_out_strs(); break; case 307: if (fancy_choice_dialog(875,0) == 2) // clear all special encounters break; for (i = 0; i < 18; i++) { current_terrain.special_locs[i].x = 100; current_terrain.special_locs[i].y = 0; current_terrain.special_id[i] = 255; } case 311: lpsi.fMask = SIF_POS; lpsi.nPos = 0; SetScrollInfo(right_sbar,SB_CTL,&lpsi,TRUE); //SetScrollPos(right_sbar,SB_CTL,0,TRUE); start_special_editing(1,0); break; case 312: lpsi.fMask = SIF_POS; lpsi.nPos = 0; SetScrollInfo(right_sbar,SB_CTL,&lpsi,TRUE); //SetScrollPos(right_sbar,SB_CTL,0,TRUE); start_string_editing(1,0); break; break; case 313: if (fancy_choice_dialog(879,0) == 1) { last_file_printed = 6; start_outdoor_data_dump(); } break; case 401: start_town_edit(); break; case 402: start_out_edit(); break; case 403: short x, y; location spot_hit; if (editing_town == false) { if (change_made == TRUE) { if (save_check(859) == FALSE) break; } x = pick_out(cur_out); if (x >= 0) { spot_hit.x = x / 100; spot_hit.y = x % 100; load_outdoors(spot_hit,0); augment_terrain(spot_hit); start_out_edit(); } } else { if (change_made == TRUE) { if (save_check(859) == FALSE) break; } x = pick_town_num(855,cur_town); if (x >= 0) { load_town(x); start_town_edit(); } } break; case 404: set_up_main_screen(); start_terrain_editing(); break; case 405: set_up_main_screen(); start_monster_editing(0); break; case 406: start_item_editing(0); break; case 407: set_up_main_screen(); break; case 408: // switch view cur_viewing_mode = 1 - cur_viewing_mode; need_redraw = TRUE; draw_main_screen(); draw_terrain(); break; case 409: // load previous town/outdoor zone if (editing_town == true) { if (cur_town == 0) load_town(scenario.num_towns - 1); else load_town(cur_town - 1); start_town_edit(); } else { if (cur_out.x > 0) { x = cur_out.x - 1; y = cur_out.y; } if ((cur_out.x == 0) && (cur_out.y > 0)) { x = scenario.out_width - 1; y = cur_out.y - 1; } if ((cur_out.x == 0) && (cur_out.y == 0)) { x = scenario.out_width - 1; y = scenario.out_height - 1; } spot_hit.x = x; spot_hit.y = y; load_outdoors(spot_hit,0); augment_terrain(spot_hit); start_out_edit(); } break; case 410: // load next town/outdoor zone if (editing_town == true) { if (cur_town + 1 == scenario.num_towns) load_town(0); else load_town(cur_town + 1); start_town_edit(); } else { if ((cur_out.x < (scenario.out_width - 1)) && (cur_out.y <= (scenario.out_height - 1))) { x = cur_out.x + 1; y = cur_out.y; } if ((cur_out.x == (scenario.out_width - 1)) && (cur_out.y < (scenario.out_height - 1))) { x = 0; y = cur_out.y + 1; } if ((cur_out.x == (scenario.out_width - 1)) && (cur_out.y == (scenario.out_height - 1))) { x = 0; y = 0; } spot_hit.x = x; spot_hit.y = y; load_outdoors(spot_hit,0); augment_terrain(spot_hit); start_out_edit(); } break; case 411: // MENUITEM "Terrain Animations Play", 411 HMENU menu,big_menu; big_menu = GetMenu(mainPtr); menu = GetSubMenu(big_menu,4); if(play_anim == FALSE){ play_anim = TRUE; CheckMenuItem(menu,411,MF_BYCOMMAND | MF_CHECKED); } else{ play_anim = FALSE; CheckMenuItem(menu,411,MF_BYCOMMAND | MF_UNCHECKED); } break; case 412: // load outdoor zone above if (editing_town) break; if (cur_out.y > 0) { x = cur_out.x; y = cur_out.y - 1; } else { x = cur_out.x; y = scenario.out_height - 1; } spot_hit.x = x; spot_hit.y = y; load_outdoors(spot_hit,0); augment_terrain(spot_hit); start_out_edit(); break; case 413: // load outdoor zone below if (editing_town) break; if (cur_out.y == scenario.out_height - 1) { x = cur_out.x; y = 0; } else { x = cur_out.x; y = cur_out.y + 1; } spot_hit.x = x; spot_hit.y = y; load_outdoors(spot_hit,0); augment_terrain(spot_hit); start_out_edit(); break; case 414: // Repeat print of last file printed switch (last_file_printed){ case 0: start_data_dump(); break; case 1: scen_text_dump(); break; case 2: start_shopping_data_dump(); break; case 3: start_monst_data_dump(); break; case 4: start_spec_data_dump(); break; case 5: start_town_data_dump(); break; case 6: start_outdoor_data_dump(); break; case 7: object_scenario_data_dump(); break; } break; // Extra Help case 801: // help file WinHelp(mainPtr,"Scenario Editor.hlp",HELP_CONTENTS,0L); break; case 802: fancy_choice_dialog(986,0); break; // started case 803: fancy_choice_dialog(1000,0); break; // testing case 804: fancy_choice_dialog(1001,0); break; // distributing case 805: fancy_choice_dialog(1062,0); break; default: if ((overall_mode >= 60) || (editing_town == FALSE)) { give_error("You can only place items and individual monsters in town sections, not outdoors.","",0); break; } if ((item_hit >= 600) && (item_hit < 1000)) { item_hit -= 600; if (scen_item_list.scen_items[item_hit].variety == 0) { give_error("This item has its Variety set to No Item. You can only place items with a Variety set to an actual item type.","",0); return to_return; } overall_mode = 4; set_string("Place the item.","Select item location"); mode_count = item_hit; } // skip the type 0 monster, it is non-existent if ((item_hit >= 1001) && (item_hit <= 1255)) { // 1,255? overall_mode = 28; item_hit -= 1000; set_string("Place the monster.","Select monster location"); mode_count = item_hit; } /* if ((item_hit >= 1256) && (item_hit <= 1455)) { item_hit -= 1256; mode_count = item_hit; load_town(item_hit); start_town_edit(); // set_string("Loading the indicated town."," "); } */ break; } if ((item >= 100) && (item < 200) && (item != 118) && (item != 119)) change_made = TRUE; return to_return; } void check_colors() { short a,b; a = GetDeviceCaps(main_dc,BITSPIXEL); b = GetDeviceCaps(main_dc,PLANES); if (a * b < 8) { MessageBox(mainPtr,"The Blades of Exile editor is designed for 256 colors. The current graphics device is set for less. Exile is playable with less colors, but will look somewhat odd." , "Not 256 colors!",MB_OK | MB_ICONEXCLAMATION); MessageBox(mainPtr,"For tips on how to get 256 colors, hit F1 for help, and then select 'Getting 256 Colors' from the table of contents." , "Not 256 colors!",MB_OK | MB_ICONEXCLAMATION); } } void cursor_stay() { if ((cursor_shown == FALSE) || (in_startup_mode == TRUE)) { cursor_shown = TRUE; showcursor(TRUE); } } void max_window(HWND window) { RECT main_rect,wind_rect; short width,height; cursor_shown = TRUE; showcursor(TRUE); GetWindowRect(GetDesktopWindow(),&main_rect); GetWindowRect(window,&wind_rect); width = main_rect.right - main_rect.left; height = main_rect.bottom - main_rect.top; MoveWindow(window,0,0,width,height,TRUE); } short check_cd_event(HWND hwnd, UINT message, WPARAM wparam,LPARAM lparam) { POINT press; short wind_hit = -1,item_hit = -1; switch (message) { case WM_COMMAND: if ((LOWORD(wparam) >= 150) && (LOWORD(wparam) <= 250)) { if (HIWORD(wparam) == EN_ERRSPACE) play_sound(0); return 0; } cd_find_dlog(hwnd,&wind_hit,&item_hit); // item_hit is dummy item_hit = (short) wparam; break; case WM_KEYDOWN: if ((wparam >= 150) && (wparam <= 250)) { return -1; } wind_hit = cd_process_syskeystroke(hwnd, wparam, lparam,&item_hit); break; case WM_CHAR: wind_hit = cd_process_keystroke(hwnd, wparam, lparam,&item_hit); break; case WM_LBUTTONDOWN: press = MAKEPOINT(lparam); wind_hit = cd_process_click(hwnd,press, wparam, lparam,&item_hit); break; case WM_RBUTTONDOWN: press = MAKEPOINT(lparam); wparam = wparam | MK_CONTROL; wind_hit = cd_process_click(hwnd,press, wparam, lparam,&item_hit); break; case WM_MOUSEMOVE: restore_cursor(); break; case WM_PAINT: cd_redraw(hwnd); break; } if (wind_hit < 0) return 0; switch (wind_hit) { case -1: break; case 970: case 971: case 972: case 973: display_strings_event_filter(item_hit); break; case 800: edit_make_scen_1_event_filter(item_hit); break; case 801: edit_make_scen_2_event_filter(item_hit); break; case 803: edit_scen_details_event_filter(item_hit); break; case 804: edit_scen_intro_event_filter(item_hit); break; case 805: set_starting_loc_filter(item_hit); break; case 806: edit_spec_item_event_filter(item_hit); break; case 807: edit_save_rects_event_filter(item_hit); break; case 808: edit_horses_event_filter(item_hit); break; case 809: edit_boats_event_filter(item_hit); break; case 810: edit_add_town_event_filter(item_hit); break; case 811: edit_scenario_events_event_filter(item_hit); break; case 812: edit_item_placement_event_filter(item_hit); break; case 813: edit_ter_type_event_filter(item_hit); break; case 814: edit_monst_type_event_filter(item_hit); break; case 815: edit_monst_abil_event_filter(item_hit); break; case 816: edit_text_event_filter(item_hit); break; case 817: edit_talk_node_event_filter(item_hit); break; case 818: edit_item_type_event_filter(item_hit); break; case 819: choose_graphic_event_filter(item_hit); break; case 820: choose_text_res_event_filter(item_hit); break; case 821: edit_basic_dlog_event_filter(item_hit); break; case 822: edit_spec_enc_event_filter(item_hit); break; case 824: edit_item_abil_event_filter(item_hit); break; case 825: edit_special_num_event_filter(item_hit); break; case 826: edit_spec_text_event_filter(item_hit); break; case 830: new_town_event_filter(item_hit); break; case 831: edit_sign_event_filter(item_hit); break; case 832: edit_town_details_event_filter(item_hit); break; case 833: edit_town_events_event_filter(item_hit); break; case 834: edit_advanced_town_event_filter(item_hit); break; case 835: edit_town_wand_event_filter(item_hit); break; case 836: edit_placed_item_event_filter(item_hit); break; case 837: edit_placed_monst_event_filter(item_hit); break; case 838: edit_placed_monst_adv_event_filter(item_hit); break; case 839: edit_town_strs_event_filter(item_hit); break; case 840: edit_area_rect_event_filter(item_hit); break; case 841: pick_import_town_event_filter(item_hit); break; case 842: edit_dialog_text_event_filter(item_hit); break; case 850: edit_out_strs_event_filter(item_hit); break; case 851: outdoor_details_event_filter(item_hit); break; case 852: edit_out_wand_event_filter(item_hit); break; case 854: pick_out_event_filter(item_hit); break; case 855: case 856: pick_town_num_event_filter(item_hit); break; case 857: change_ter_event_filter(item_hit); break; default: fancy_choice_dialog_event_filter (item_hit); break; } return 0; }