Files
oboe/Scenario Editor/BLSCENED.CPP
Sylae Corell f94b8c6735 Commited for Ishad Nha:
Changes for this version of the Blades of Exile 2009 Scenario Editor:

Fixed message about deleting towns when you want to create Scenario Text.txt.
I updated the Editor to include an outdoor zone report. 
I added the four scenario flags to the Scenario Object Report, because they reveal whether a scenario is Mac or Windows. Reports may crash if the scenario is Mac.
I introduced the repeat print of last file, it automatically prints a new version of the last report file to be printed. It is activated by Ctrl + P and accompanied by a message in the text area. 
Town report now lists all special nodes and dialog nodes. along with the relevant text messages. Irrelevant lines have been removed. The special nodes listings can be extended to scenario and outdoor reports.
Scenario and town timers have been added to reports.
Tables have been included in scenario, outdoor and town reports showing the lengths of the relevant strings. (For some reason the last 40 outdoor strings caused a crash of the Editor.)
Now all three types of report show the full details for special nodes.
Ctrl + (Number) shortcuts have been introduced for Town and Outdoor menus.
Area Rectangles now show the lower right coordinates too.
All menus now have hot keys for each item.


git-svn-id: http://openexile.googlecode.com/svn/trunk@133 4ebdad44-0ea0-11de-aab3-ff745001d230
2009-10-28 19:23:13 +00:00

1167 lines
31 KiB
C++

// Blades of Exile Scenario Editor
#include <windows.h>
#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 custom_pic;
extern BOOL play_anim;
/* 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";
short 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()
{
char tmp[] = "?";
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;
long 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 i,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 BoE Scenario Editor 1.0",
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;
}
long CALLBACK WndProc (HWND hwnd, UINT message,WPARAM wParam, LPARAM lParam)
{
HDC hdc;
PAINTSTRUCT ps;
RECT rect;
//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;
RECT wind_rect;
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){
// old_setting = custom_pic;
custom_pic = 5;
csp(813,14,store_ter.picture - 2000);
// custom_pic = old_setting;
}
else if (store_ter.picture >= 400 && store_ter.picture < 1000){
csp(813,14,store_ter.picture - 100);
}
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:
hdc = 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,j;
Boolean to_return = FALSE;
short item_hit;
Boolean need_redraw = FALSE;
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
if (last_file_printed == 0) {
set_string("File Repeat Printing:","Scenario Data");
start_data_dump();
}
if (last_file_printed == 1) {
set_string("File Repeat Printing:","Scenario Text");
scen_text_dump();
}
if (last_file_printed == 2) {
set_string("File Repeat Printing:","Scenario Shopping");
start_shopping_data_dump();
}
if (last_file_printed == 3) {
set_string("File Repeat Printing:","Monstdata");
start_monst_data_dump();
}
if (last_file_printed == 4) {
set_string("File Repeat Printing:","Specdata");
start_spec_data_dump();
}
if (last_file_printed == 5) {
set_string("File Repeat Printing:","Concise Town Report");
start_town_data_dump();
}
if (last_file_printed == 6) {
set_string("File Repeat Printing:","Concise Outdoor Report");
start_outdoor_data_dump();
}
if (last_file_printed == 7) {
set_string("File Repeat Printing:","Scenario Object Data");
object_scenario_data_dump();
}
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;
}