Files
oboe/Win32/Scenarios Editor/DLOGTOOL.CPP
Chokboyz 6070ed2e05 *Uploaded Ormus boesounds DLL code.
*Classic Blades of Exile changes :

Game :

Bug Fixes :

- Giant Strength ability and Skill ability now use the ability strength rather than the item level to calculate effect.
- Won't take damage when moving boats over damaging terrains (fire, cold, magic, poison, disease) anymore.
- Won't take damage when horses refuses to enter a damaging terrain (fire, cold, magic) anymore.
- Horses won't enter damaging terrains (fire, cold, magic) or "horse blocking" terrains when outdoors anymore.
- Boom effects won't be displayed at random places when being damaged outdoors anymore.
- Damage won't be displayed in boom animation when attacking invulnerable monsters, when they are, in fact, unharmed ...
- The first pc won't become active with 0 AP anymore when a pc get killed by backshots.

Changes :

- All terrains and monsters sheets now loaded in memory to bypass storage sheet. That should speed up the game and fix some graphical oddities. Mac and Windows graphics can now be swapped on the fly (i.e without restarting the game). That also removes any graphical limitation in the game.
- In the same way, PC graphics will now be drawn directly to the game gworld.

Scenario Editor :

- Dumping functions won't change current town/outdoor section anymore.
- Finished porting the file IO functions to 32 bits.
- Added a rudimentary custom intro picture behavior : if the intro picture is set to 100, the first icon on the custom sheet will be displayed in the scenario selection menu. Scenario intro pics must be drawn on the same scale as talk icons.
- Whenever the “Place Random Items” function is used, the editor will inform the user that it could not place all items because the town item # limit has been reached, regardless of how many items are actually in the town. That has been fixed (the message now displays only if the max number of items is indeed reached).
- Cleaned the ressources (smaller executable).

git-svn-id: http://openexile.googlecode.com/svn/trunk@93 4ebdad44-0ea0-11de-aab3-ff745001d230
2009-06-10 21:23:33 +00:00

1983 lines
57 KiB
C++

#include <windows.h>
#define ND 15
#define NI 500
#define NL 100
#include "string.h"
#include "global.h"
#include "graphutl.h"
#include "stdio.h"
#include "graphics.h"
#include "edsound.h"
#include "dlogtool.h"
#include "keydlgs.h"
extern Boolean play_sounds,cursor_shown,dialog_not_toast,block_erase,mouse_button_held;
extern HBITMAP title_gworld,dlogpics_gworld,items_gworld,tiny_obj_gworld;
extern HBITMAP dlg_buttons_gworld,mixed_gworld,monst_gworld[10],talkfaces_gworld;
extern HFONT font,italic_font,underline_font,bold_font,tiny_font,small_bold_font;
extern HWND mainPtr;
extern HDC main_dc;
extern HINSTANCE store_hInstance;
long CALLBACK WndProc (HWND, UINT, WPARAM, LPARAM);
extern short terrain_pic[256];
extern unsigned char m_pic_index[200];
extern unsigned char m_pic_index_x[200];
extern unsigned char m_pic_index_y[200];
extern unsigned long anim_ticks;
extern terrain_type_type store_ter;
extern short custom_pic;
extern HBITMAP spec_scen_g;
extern HACCEL accel;
short current_key = 0;
short dlg_keys[ND];
short dlg_types[ND];
HWND dlgs[ND];
HWND dlg_parent[ND];
short dlg_highest_item[ND];
Boolean dlg_draw_ready[ND];
short item_dlg[NI];
short item_number[NI];
char item_type[NI];
RECT item_rect[NI];
short item_flag[NI];
char item_active[NI];
char item_key[NI];
short item_label[NI];
short item_label_loc[NI];
char text_long_str[10][256];
char text_short_str[140][40];
char labels[NL][25];
Boolean label_taken[NL];
HWND edit_box[80];
HWND store_edit_parent[80];
short store_edit_parent_num[80];
short store_edit_item[80]; // kludgy
FARPROC edit_proc,old_edit_proc[80];
HDC dlg_force_dc = NULL; // save HDCs when dealing with dlogs
short store_free_slot,store_dlog_num;
HWND store_parent;
short available_dlog_buttons[NUM_DLOG_B] = {0,63,64,65,1,4,5,8,
128,
9,10,11,12,13,
14,15,16,17,29, 51,60,61,62,
66,69,70, 71,72,73,74,79,
80,83,86,87,88, 91,92,93,99,100,
101,102,104, 129,130,131,132,133,
134,135,136,137};
short button_type[140] = {1,1,4,5,1,1,0,0,1,1,
1,1,1,1,1,1,1,1,8,8,
9,9,9,1,1,2,1,6,7,1,
1,12,1,1,2,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,
0,1,1,1,2,1,1,1,2,2, // 50
1,1,1,1,1,1,2,3,1,1,
1,1,1,1,2,2,2,2,2,1,
1,1,1,1,2,2,1,1,1,2,
0,1,1,1,14,13,12,12,12,1,
1,1,1,2,1,2,2,2,2,1, // 100
2,2,2,2,2,2,2,2,2,2,
2,2,2,2,2,2,2,2,0,0,
1,1,1,1,1,1,0,0,0,0};
char *button_strs[140] = {"Done ","Ask"," "," ","Keep", "Cancel","+","-","Buy","Leave",
"Get","1","2","3","4","5","6","Cast"," "," ",
" "," "," ","Buy","Sell","Other Spells","Buy x10"," "," ","Save",
"Race","Train","Items","Spells","Heal Party","1","2","3","4","5",
"6","7","8","9","10","11","12","13","14","15",
/*50*/ "16","Take","Create","Delete","Race/Special","Skill","Name","Graphic","Bash Door","Pick Lock",
"Leave","Steal","Attack","OK","Yes","No","Step In"," ","Record","Climb",
"Flee","Onward","Answer","Drink","Approach","Mage Spells","Priest Spells","Advantages","New Game","Land",
"Under","Restore","Restart","Quit","Save First","Just Quit","Rest","Read","Pull","Alchemy",
"17","Push","Pray","Wait","","","Delete","Graphic","Create","Give",
/*100*/ "Destroy","Pay","Free","Next Tip","Touch", "Select Icon","Create/Edit","Clear Special","Edit Abilities","Choose",
"Go Back","Create New","General","One Shots","Affect PCs","If-Thens","Town Specs","Out Specs","Advanced","Weapon Abil",
"General Abil.","NonSpell Use","Spell Usable","Reagents","Missiles","Abilities","Pick Picture","Animated","Enter","Burn",
"Insert","Remove","Accept","Refuse","Open","Close","Sit","Stand","",""};
short button_left_adj[140] = {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,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,0,0,0,0,0,0, // 50
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,0,0,0,
0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0, // 100
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,0,0,0,
};
char button_def_key[140] = {0,0,20,21,'k', 24,0,0,0,0,
'g','1','2','3','4', '5','6',0,0,0,
0,0,0,0,0,' ',0,22,23,0,
0,0,0,0,0,'1','2','3','4','5',
'6','7','8','9','a', 'b','c','d','e','f',
'g',0,0,0,0,0,0,0,0,0,
0,0,0,0,'y','n',0,'?','r',0,
0,0,0,0,0,0,0,0,0, 0,
0,0,0,0,0,0,0,0,0,0,
'g',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,0,0,
0,0,0,0,0,0,0,0,0,0,
0,0,0,0,'o',0,0,0,0,0
};
// specials ... 20 - <- 21 - -> 22 up 23 down 24 esc
// 25-30 ctrl 1-6 31 - return\
short button_ul_x[15] = {0,46,0,126,0, 0,126,126,126,138, 166,0,0,126,172};
short button_ul_y[15] = {0,0,132,23,46, 69,46,69,36,36, 36,23,92,92,0};
short button_width[15] = {23,63,102,16,63, 63,63,63,6,14, 14,63,63,63,30};
short button_height[15] = {23,23,23,13,23, 23,23,23,6,10,10,23,40,40,30};
BOOL CALLBACK dummy_dialog_proc (HWND hDlg, UINT message, WPARAM wparam, LPARAM lparam);
long CALLBACK fresh_edit_proc(HWND hwnd, UINT message, WPARAM wparam, LPARAM lparam);
FARPROC d_proc;
extern char szAppName[];
extern char szWinName[];
void cd_init_dialogs()
{
short i;
for (i = 0; i < ND; i++) {
dlg_keys[i] = -1;
dlg_types[i] = 0;
dlgs[i] = NULL;
dlg_highest_item[i] = 0;
}
for (i = 0; i < NI; i++) {
item_dlg[i] = -1;
}
for (i = 0; i < NL; i++) {
label_taken[i] = FALSE;
}
for (i = 0; i < 80; i++) {
edit_box[i] = NULL;
store_edit_parent[i] = NULL;
store_edit_parent_num[i] = -1;
store_edit_item[i] = -1 ;
}
d_proc = (FARPROC) dummy_dialog_proc;
edit_proc = (FARPROC) fresh_edit_proc;
}
long CALLBACK fresh_edit_proc(HWND hwnd, UINT message, UINT wParam, LONG lParam)
{
short i,cur_box = -1,cur_item_num,item_for_focus = -1,first_edit_box = -1;
for (i = 0; i < 80; i++)
if (edit_box[i] == hwnd) {
cur_box = i;
cur_item_num = store_edit_item[i];
}
if (cur_box >= 0) {
switch (message) {
case WM_CHAR:
if ((char) (wParam) == 9) {
return TRUE;
}
break;
case WM_KEYDOWN:
if (wParam == VK_RETURN)
SendMessage(store_edit_parent[cur_box],WM_KEYDOWN,wParam,lParam);
if (wParam == VK_ESCAPE)
SendMessage(store_edit_parent[cur_box],WM_KEYDOWN,wParam,lParam);
if (wParam == VK_TAB) {
//play_sound(1);
for (i = 0; i < 80; i++) {
if ((store_edit_parent[i] == store_edit_parent[cur_box]) &&
(store_edit_item[i] == cur_item_num + 1))
item_for_focus = i;
if ((store_edit_parent[i] == store_edit_parent[cur_box]) &&
(store_edit_item[i] == 2))
first_edit_box = i;
}
if (item_for_focus >= 0)
SetFocus(edit_box[item_for_focus]);
else if (first_edit_box >= 0)
SetFocus(edit_box[first_edit_box]);
return TRUE;
}
break;
}
return CallWindowProc((WNDPROC) old_edit_proc[cur_box],hwnd,message,wParam,lParam);
}
return 0;
}
short cd_create_dialog_parent_num(short dlog_num,short parent)
{
short i;
if ((parent == 0) || (parent == 1))
return cd_create_dialog(dlog_num,mainPtr);
i = cd_get_dlg_index(parent);
if (i < 0)
return -1;
return cd_create_dialog(dlog_num,dlgs[i]);
}
short cd_create_dialog(short dlog_num,HWND parent)
{
short i,j,free_slot = -1,free_item = -1;
HWND dlg;
char item_str[256];
short type,flag;
HDC win_dc;
if (parent != NULL) {
if (IsWindowEnabled(parent) == 0)
return -1;
}
mouse_button_held = FALSE;
store_dlog_num = dlog_num;
store_parent = parent;
for (i = 0; i < ND; i++) {
if ((dlg_keys[i] >= 0) && (dlg_types[i] == dlog_num))
return -1;
}
for (i = 0; i < ND; i++) {
if (dlg_keys[i] < 0) {
free_slot = i;
i = 500;
}
}
if (free_slot < 0)
return -2;
current_key++;
dlg_keys[free_slot] = current_key;
dlg_types[free_slot] = dlog_num;
dlg_highest_item[free_slot] = 1;
dlg_draw_ready[free_slot] = FALSE;
dlgs[free_slot] = NULL;
// first, create dummy dlog
store_free_slot = free_slot;
dlg = CreateDialog(store_hInstance,MAKEINTRESOURCE(dlog_num),0,(DLGPROC)d_proc);
if (dlgs[free_slot] == NULL) {
play_sound(3);
return -3;
}
center_window(dlgs[free_slot]);
dlg_parent[free_slot] = parent;
SetWindowText(dlgs[free_slot],"Blades of Exile Scenario Editor");
ShowWindow(dlgs[free_slot],SW_SHOW);
DestroyWindow(dlg); //Necesary? Dunno.
if (dlg_parent[free_slot] != NULL) {
EnableWindow(dlg_parent[free_slot],FALSE);
}
dialog_not_toast = TRUE;
set_cursor(0);
return 0;
}
BOOL CALLBACK dummy_dialog_proc (HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
{
short i,j,k,l,free_slot = -1,free_item = -1,type,flag;
char item_str[256];
Boolean str_stored = FALSE,focus_set = FALSE;
RECT dlg_rect;
short win_height = 0, win_width = 0, num_text_boxes = 0;
short str_offset = 1;
free_slot = store_free_slot;
switch (message)
{
case WM_INITDIALOG:
// now, make a window, matching dialog
GetWindowRect(hDlg,&dlg_rect);
dlgs[store_free_slot] = CreateWindow (szWinName,
"BoE for Win32 Dialog",
0,// was visible
0,
0,
dlg_rect.right - dlg_rect.left,
dlg_rect.bottom - dlg_rect.top,
NULL,
NULL,
store_hInstance,
NULL);
// Now, give the window its items
for (i = 0; i < 200; i++)
if (GetDlgItem(hDlg,i) != NULL)
{
GetDlgItemText(hDlg,i,item_str,256);
str_offset = 1;
dlg_highest_item[free_slot] = i;
str_stored = FALSE;
if (strlen((char *)item_str) == 0)
{
sprintf((char *) item_str, "+");
type = 3;
flag = 0;
str_stored = TRUE;
}
else if (item_str[0] == '+') { // default is framed text
type = 3;
flag = 1;
str_stored = TRUE;
}
else if (item_str[0] == '*') {
type = 3;
flag = 0;
str_stored = TRUE;
}
else if (item_str[0] == '~') {
type = 7;
flag = 0;
str_stored = TRUE;
}
else if (item_str[0] == '!') {
type = 4;
flag = 0;
str_stored = TRUE;
}
else if (item_str[0] == '=') {
type = 9;
flag = 1;
str_stored = TRUE;
}
else if (((item_str[0] >= 65) && (item_str[0] <= 122)) || (item_str[0] == '"')) {
type = 9;
flag = 0;
str_offset = 0;
str_stored = TRUE;
}
else if ((item_str[0] == '^') || (item_str[0] == '&')) {
type = (item_str[0] == '^') ? 10 : 11;
flag = 1;
str_stored = TRUE;
}
else
{
//sscanf(item_str,"%d_%d",&type,&flag);
type = atoi(item_str);
flag = atoi(item_str+2);
}
free_item = -1;
// find free item
switch (type)
{
case 0: case 1: case 2: case 5: case 6:
for (j = 150; j < NI; j++)
if (item_dlg[j] < 0) {
free_item = j;
j = NI + 1;
}
break;
default:
if ((type == 9) ||
((str_stored == TRUE) && (strlen((char *) item_str) > 35))) {
for (j = 0; j < 10; j++)
if (item_dlg[j] < 0) {
free_item = j;
j = NI + 1;
}
}
else {
for (j = 10; j < 140; j++)
if (item_dlg[j] < 0) {
free_item = j;
j = NI + 1;
}
}
break;
}
if (free_item >= 0)
{
item_dlg[free_item] = store_dlog_num;
item_type[free_item] = type;
item_number[free_item] = i;
item_rect[free_item] = get_item_rect(hDlg,i);
item_rect[free_item].top = item_rect[free_item].top / 2;
item_rect[free_item].left = item_rect[free_item].left / 2;
item_rect[free_item].bottom = item_rect[free_item].bottom / 2;
item_rect[free_item].right = item_rect[free_item].right / 2;
item_flag[free_item] = flag;
item_active[free_item] = 1;
item_label[free_item] = 0;
item_label_loc[free_item] = -1;
item_key[free_item] = 0;
switch (type) {
case 0: case 1:
item_rect[free_item].right = item_rect[free_item].left + button_width[button_type[flag]];
item_rect[free_item].bottom = item_rect[free_item].top + button_height[button_type[flag]];
if ((store_dlog_num >= 2000) || (store_dlog_num == 986))
OffsetRect(&item_rect[free_item],20,0);
item_key[free_item] = button_def_key[flag];
if (type == 1)
item_key[free_item] = 31;
break;
case 2:
item_rect[free_item].right = item_rect[free_item].left + 14;
item_rect[free_item].bottom = item_rect[free_item].top + 10;
item_key[free_item] = 255;
break;
case 3: case 4: case 7: case 8: case 9: case 10: case 11:
sprintf(((free_item < 10) ? text_long_str[free_item] : text_short_str[free_item - 10]),"");
if (str_stored == TRUE) {
if (free_item < 10) {
sprintf(text_long_str[free_item],"%s",
(char *) (item_str + str_offset));
for (k = 0; k < 256; k++) {
if (text_long_str[free_item][k] == '|')
text_long_str[free_item][k] = 13;
if (text_long_str[free_item][k] == '_')
text_long_str[free_item][k] = '"';
}
// give text a little extra room
if ((store_dlog_num >= 2000) || (store_dlog_num == 986))
item_rect[free_item].right += 20;
}
else {
sprintf(text_short_str[free_item - 10],"%-34s",
(char *) (item_str + str_offset));
for (k = 0; k < 35; k++) {
if (text_short_str[free_item][k] == '|')
text_short_str[free_item][k] = 13;
if (text_short_str[free_item][k] == '_')
text_short_str[free_item][k] = '"';
}
}
}
item_key[free_item] = 255;
break;
case 6:
for (l = 0; l < 80; l++)
if (store_edit_parent[l] == NULL)
{
if (item_rect[free_item].bottom - item_rect[free_item].top < 24)
item_rect[free_item].top -= 2;
if (item_rect[free_item].bottom - item_rect[free_item].top <= 22)
edit_box[l] = CreateWindow("edit",NULL,WS_CHILD | WS_BORDER | WS_VISIBLE | ES_AUTOVSCROLL,
item_rect[free_item].left,item_rect[free_item].top,
item_rect[free_item].right - item_rect[free_item].left,
max(22,item_rect[free_item].bottom - item_rect[free_item].top),
dlgs[free_slot],(HMENU)150,store_hInstance,NULL);
else edit_box[l] = CreateWindow("edit",NULL,WS_CHILD | WS_BORDER | WS_VISIBLE | ES_MULTILINE | ES_AUTOVSCROLL,
item_rect[free_item].left,item_rect[free_item].top,
item_rect[free_item].right - item_rect[free_item].left,
max(22,item_rect[free_item].bottom - item_rect[free_item].top),
dlgs[free_slot],(HMENU)150,store_hInstance,NULL);
num_text_boxes++;
store_edit_parent[l] = dlgs[free_slot];
store_edit_parent_num[l] = store_dlog_num;
store_edit_item[l] = i;
old_edit_proc[l] = (FARPROC) GetWindowLong(edit_box[l],GWL_WNDPROC);
SetWindowLong(edit_box[l],GWL_WNDPROC,(LONG) edit_proc);
if (focus_set == FALSE)
{
SetFocus(edit_box[l]);
focus_set = TRUE;
}
l = 80;
}
break;
}
win_height = max(win_height, item_rect[free_item].bottom + 28);
win_width = max(win_width, item_rect[free_item].right + 11);
}
} /* end of for-if */
MoveWindow(dlgs[free_slot],0,0,win_width,win_height,FALSE);
EndDialog(hDlg, 0);
return TRUE;
} /* end of switch(message) */
return TRUE;
}
void cd_set_edit_focus(short which_win)
{
short i;
for (i = 0; i < 80; i++)
if (store_edit_parent_num[i] == which_win) {
if (edit_box[i] != NULL)
SetFocus(edit_box[i]);
return;
}
}
short cd_kill_dialog(short dlog_num,short parent_message)
{
short i,j,which_dlg = -1;
for (i = 0; i < ND; i++)
if ((dlg_keys[i] >= 0) && (dlg_types[i] == dlog_num))
which_dlg = i;
if (which_dlg < 0)
return -1;
for (i = 0; i < NI; i++)
if (item_dlg[i] == dlog_num) {
if (item_type[i] == 6) {
for (j = 0; j < 80; j++)
if ((store_edit_parent_num[j] == dlog_num) && (store_edit_item[j] == item_number[i])) {
DestroyWindow(edit_box[j]);
store_edit_parent[j] = NULL;
edit_box[j] = NULL;
}
}
if (item_label[i] > 0)
label_taken[item_label_loc[i]] = FALSE;
item_dlg[i] = -1;
}
if (dlg_parent[which_dlg] != NULL) {
EnableWindow(dlg_parent[which_dlg],TRUE);
SetFocus(dlg_parent[which_dlg]);
SetWindowPos(dlg_parent[which_dlg],HWND_TOP,0,0,100,100,
SWP_NOMOVE | SWP_NOSIZE | SWP_NOREDRAW);
cd_set_edit_focus((short)dlg_parent[which_dlg]);
}
if (parent_message > 0)
SendMessage(dlg_parent[which_dlg],WM_COMMAND,parent_message,0);
DestroyWindow(dlgs[which_dlg]);
dlg_keys[which_dlg] = -1;
dialog_not_toast = TRUE;
block_erase = TRUE;
return 0;
}
short cd_process_click(HWND window,POINT the_point, WPARAM wparam, LPARAM lparam,short *item)
{
short i,which_dlg,dlg_num,item_id;
short dlog_key;
if ((which_dlg = cd_find_dlog(window,&dlg_num,&dlog_key)) < 0)
return -1;
for (i = 0; i < dlg_highest_item[which_dlg] + 1; i++)
if ((item_id = cd_get_item_id(dlg_num,i)) >= 0) {
if ((PtInRect(&item_rect[item_id],the_point)) && (item_active[item_id] > 0)
&& ((item_type[item_id] < 3) || (item_type[item_id] == 8)
|| (item_type[item_id] == 10)|| (item_type[item_id] == 11))) {
*item = i;
if (MK_CONTROL & wparam)
*item += 100;
if (item_type[item_id] != 8)
cd_press_button(dlg_num,i);
return dlg_num;
}
}
return -1;
}
short cd_process_syskeystroke(HWND window,WPARAM wparam, LPARAM lparam,short *item)
{
short i,which_dlg,dlg_num,dlg_key,item_id;
char char_hit;
if ((which_dlg = cd_find_dlog(window,&dlg_num,&dlg_key)) < 0)
return -1;
// specials ... 20 - <- 21 - -> 22 up 23 down 24 esc
// 25-30 ctrl 1-6
switch (wparam) {
case VK_ESCAPE:
char_hit = 24;
break;
//case VK_SPACE:
// char_hit = ' ';
// break;
case VK_LEFT:
char_hit = 20;
break;
case VK_UP:
char_hit = 22;
break;
case VK_RIGHT:
char_hit = 21;
break;
case VK_DOWN:
char_hit = 23;
break;
case VK_RETURN:
char_hit = 31;
break;
default:
return -1;
}
for (i = 0; i < dlg_highest_item[which_dlg] + 1; i++)
if ((item_id = cd_get_item_id(dlg_num,i)) >= 0) {
if ((item_key[item_id] == char_hit) && (item_active[item_id] > 0)
&& ((item_type[item_id] < 3) || (item_type[item_id] == 8))) {
*item = i;
if (item_type[item_id] != 8)
cd_press_button(dlg_num,i);
return dlg_num;
}
}
// kludgy. If you get an escape and is isn't processed, make it an enter
if (wparam == VK_ESCAPE) {
char_hit = 31;
for (i = 0; i < dlg_highest_item[which_dlg] + 1; i++)
if ((item_id = cd_get_item_id(dlg_num,i)) >= 0) {
if ((item_key[item_id] == char_hit) && (item_active[item_id] > 0)
&& ((item_type[item_id] < 3) || (item_type[item_id] == 8))) {
*item = i;
if (item_type[item_id] != 8)
cd_press_button(dlg_num,i);
return dlg_num;
}
}
}
return -1;
}
short cd_process_keystroke(HWND window,WPARAM wparam, LPARAM lparam,short *item)
{
short i,which_dlg,dlg_num,dlg_key,item_id;
char char_hit;
if ((which_dlg = cd_find_dlog(window,&dlg_num,&dlg_key)) < 0)
return -1;
// specials ... 20 - <- 21 - -> 22 up 23 down 24 esc
// 25-30 ctrl 1-6
char_hit = (char) wparam;
for (i = 0; i < dlg_highest_item[which_dlg] + 1; i++)
if ((item_id = cd_get_item_id(dlg_num,i)) >= 0) {
if ((item_key[item_id] == char_hit) && (item_active[item_id] > 0)
&& ((item_type[item_id] < 3) || (item_type[item_id] == 8))) {
*item = i;
if (item_type[item_id] != 8)
cd_press_button(dlg_num,i);
return dlg_num;
}
}
return -1;
}
void cd_attach_key(short dlog_num,short item_num,char key)
{
short dlg_index,item_index;
if (cd_get_indices(dlog_num,item_num,&dlg_index,&item_index) < 0)
return;
if ((item_type[item_index] > 2) && (item_type[item_index] != 8)) {
beep();
return;
}
item_key[item_index] = key;
}
void cd_set_pict(short dlog_num, short item_num, short pict_num)
{
short dlg_index,item_index;
if (cd_get_indices(dlog_num,item_num,&dlg_index,&item_index) < 0)
return;
if (item_type[item_index] != 5) {
beep();
return;
}
item_flag[item_index] = pict_num;
if (pict_num == -1)
cd_erase_item(dlog_num,item_num);
else cd_draw_item(dlog_num,item_num);
}
void cd_activate_item(short dlog_num, short item_num, short status)
{
short dlg_index,item_index;
if (cd_get_indices(dlog_num,item_num,&dlg_index,&item_index) < 0)
return;
item_active[item_index] = status;
cd_draw_item(dlog_num,item_num);
}
short cd_get_active(short dlog_num, short item_num)
{
short dlg_index,item_index;
if (cd_get_indices(dlog_num,item_num,&dlg_index,&item_index) < 0)
return -1;
return item_active[item_index];
}
void cd_get_item_text(short dlog_num, short item_num, char *str)
{
short dlg_index,item_index,i;
if (cd_get_indices(dlog_num,item_num,&dlg_index,&item_index) < 0)
return ;
if (item_type[item_index] == 6) {
sprintf(str,"");
for (i = 0; i < 80; i++)
if ((store_edit_parent_num[i] == dlog_num) && (store_edit_item[i] = item_num)
&& (edit_box[i] != NULL))
GetWindowText(edit_box[i],str,255);
return;
}
if (item_index >= 150) {
beep();
return;
}
if (item_index < 10)
sprintf(str,"%s",text_long_str[item_index]);
else sprintf(str,"%s",text_short_str[item_index - 10]);
}
void cd_retrieve_text_edit_str(short dlog_num, short item_num, char *str)
{
short dlg_index,item_index,i;
short the_type;
RECT the_rect;
for (i = 0; i < 80; i++)
if ((store_edit_parent_num[i] == dlog_num) && (store_edit_item[i] == item_num)
&& (edit_box[i] != NULL)) {
GetWindowText(edit_box[i],str,255);
return;
}
}
short cd_retrieve_text_edit_num(short dlog_num, short item_num)
{
short dlg_index,item_index,i;
short the_type,num_given;
RECT the_rect;
char str[256];
for (i = 0; i < 80; i++)
if ((store_edit_parent_num[i] == dlog_num) && (store_edit_item[i] == item_num)
&& (edit_box[i] != NULL)) {
GetWindowText(edit_box[i],str,255);
sscanf(str,"%d",&num_given);
return (short) num_given;
}
return -1;
}
// NOTE!!! Expects a c string
void cd_set_text_edit_str(short dlog_num, short item_num, char *str)
{
short dlg_index,item_index,i;
short the_type;
RECT the_rect;
for (i = 0; i < 80; i++)
if ((store_edit_parent_num[i] == dlog_num) && (store_edit_item[i] == item_num)
&& (edit_box[i] != NULL))
SetWindowText(edit_box[i],str);
}
// NOTE!!! Expects a c string
void cd_set_text_edit_num(short dlog_num, short item_num, short num)
{
short dlg_index,item_index,i;
short the_type;
RECT the_rect;
char store_ptr[256];
sprintf(store_ptr,"%d",num);
for (i = 0; i < 80; i++)
if ((store_edit_parent_num[i] == dlog_num) && (store_edit_item[i] == item_num)
&& (edit_box[i] != NULL))
SetWindowText(edit_box[i],store_ptr);
}
void cdsin(short dlog_num, short item_num, short num)
{
cd_set_item_num( dlog_num, item_num, num);
}
void csit(short dlog_num, short item_num, char *str)
{
cd_set_item_text( dlog_num, item_num, str);
}
void csp(short dlog_num, short item_num, short pict_num)
{
cd_set_pict( dlog_num, item_num, pict_num);
}
void cd_set_item_text(short dlog_num, short item_num, char *str)
{
short dlg_index,item_index,i;
if (cd_get_indices(dlog_num,item_num,&dlg_index,&item_index) < 0)
return ;
if (item_type[item_index] == 6) {
for (i = 0; i < 80; i++)
if ((store_edit_parent_num[i] == dlog_num) && (store_edit_item[i] = item_num)
&& (edit_box[i] != NULL))
SetWindowText(edit_box[i],str);
return;
}
if (item_index >= 150) {
beep();
return;
}
if (item_index < 10)
sprintf(text_long_str[item_index],"%s",str);
else sprintf(text_short_str[item_index - 10],"%-34s",str);
cd_draw_item( dlog_num,item_num);
}
void cd_set_item_num(short dlog_num, short item_num, short num)
{
short dlg_index,item_index;
if (cd_get_indices(dlog_num,item_num,&dlg_index,&item_index) < 0)
return ;
if (item_index >= 150) {
beep();
return;
}
if (item_index < 10)
sprintf(text_long_str[item_index],"%d",num);
else sprintf(text_short_str[item_index - 10],"%d",num);
cd_draw_item( dlog_num,item_num);
}
void cd_set_led(short dlog_num,short item_num,short state)
{
short dlg_index,item_index;
if (cd_get_indices(dlog_num,item_num,&dlg_index,&item_index) < 0)
return;
if (item_type[item_index] != 2) {
beep();
return;
}
item_flag[item_index] = state;
cd_draw_item(dlog_num,item_num);
}
short cd_get_led(short dlog_num,short item_num)
{
short dlg_index,item_index;
if (cd_get_indices(dlog_num,item_num,&dlg_index,&item_index) < 0)
return 0;
if (item_type[item_index] != 2) {
beep();
return 0;
}
return item_flag[item_index];
}
// Use when checking for events ... if item hit matches item num, this led was
// hit, and flip it to other thing.
void cd_flip_led(short dlog_num,short item_num,short item_hit)
{
if (item_hit != item_num)
return;
if (cd_get_led(dlog_num,item_num) > 0)
cd_set_led(dlog_num,item_num,0);
else cd_set_led(dlog_num,item_num,1);
}
void cd_set_led_range(short dlog_num,short first_led,short last_led,short which_to_set)
{
short i;
for (i = first_led; i <= last_led; i++) {
if (i - first_led == which_to_set)
cd_set_led(dlog_num,i,1);
else cd_set_led(dlog_num,i,0);
}
}
// Use when someone presses something in the range, to light up the right button
// Also has an error check ... if which_to_set is outside range, do nothing
void cd_hit_led_range(short dlog_num,short first_led,short last_led,short which_to_set)
{
short i;
if ((which_to_set < first_led) || (which_to_set > last_led))
return;
for (i = first_led; i <= last_led; i++) {
if (i == which_to_set)
cd_set_led(dlog_num,i,1);
else cd_set_led(dlog_num,i,0);
}
}
short cd_get_led_range(short dlog_num,short first_led,short last_led)
{
short i;
for (i = first_led; i <= last_led; i++) {
if (cd_get_led(dlog_num,i) == 1)
return i - first_led;
}
return 0;
}
void cd_add_label(short dlog_num, short item_num, char *label, short label_flag)
{
short dlg_index,item_index,label_loc = -1;
short i;
if (cd_get_indices(dlog_num,item_num,&dlg_index,&item_index) < 0)
return;
if (item_label_loc[item_index] < 0) {
item_label[item_index] = label_flag;
for (i = 0; i < 100; i++)
if (label_taken[i] == FALSE) {
label_loc = i;
label_taken[i] = TRUE;
i = 100;
}
if (label_loc < 0) {
beep();
return;
}
item_label_loc[item_index] = label_loc;
}
else cd_erase_item(dlog_num,item_num + 100);
label_loc = item_label_loc[item_index];
sprintf((char *) labels[label_loc],"%-24s",label);
if (item_active[item_index] > 0)
cd_draw_item(dlog_num,item_num);
}
void cd_draw_item(short dlog_num,short item_num)
{
short dlg_index,item_index,store_label;
HDC win_dc;
COLORREF colors[4] = {RGB(0,0,0),RGB(255,0,0),RGB(0,0,112),RGB(255,255,255)};
RECT from_rect,to_rect;
HFONT old_font;
if (cd_get_indices(dlog_num,item_num,&dlg_index,&item_index) < 0)
return;
if (dlg_draw_ready[dlg_index] == FALSE)
return;
win_dc = cd_get_dlog_dc(dlg_index);
old_font = (HFONT) SelectObject(win_dc,small_bold_font);
dlg_force_dc = win_dc;
if (item_active[item_index] == 0) {
cd_erase_item(dlog_num,item_num);
cd_erase_item(dlog_num,item_num + 100);
}
else {
switch (item_type[item_index]) {
case 0: case 1: case 10: case 11:
from_rect.top = button_ul_y[button_type[item_flag[item_index]]];
from_rect.left = button_ul_x[button_type[item_flag[item_index]]];
from_rect.bottom = from_rect.top + button_height[button_type[item_flag[item_index]]];
from_rect.right = from_rect.left + button_width[button_type[item_flag[item_index]]];
rect_draw_some_item(dlg_buttons_gworld,from_rect,(HBITMAP)win_dc,item_rect[item_index],0,2);
SelectObject(win_dc,bold_font);
SetTextColor(win_dc,colors[2]);
if (item_type[item_index] < 2)
OffsetRect(&item_rect[item_index],-1 * button_left_adj[item_flag[item_index]],0);
if (item_type[item_index] < 2) {
char_win_draw_string(win_dc,item_rect[item_index],
(char *) (button_strs[item_flag[item_index]]),1,8);
}
else {
char_win_draw_string(win_dc,item_rect[item_index],
(char *) ((item_index < 10) ? text_long_str[item_index] :
text_short_str[item_index - 10]),1,8);
}
if (item_type[item_index] < 2)
OffsetRect(&item_rect[item_index],button_left_adj[item_flag[item_index]],0);
SetTextColor(win_dc,colors[0]);
break;
case 2:
switch (item_flag[item_index]) {
case 0: from_rect.left = 166; from_rect.top = 36; break;
case 1: from_rect.left = 152; from_rect.top = 36; break;
case 2: from_rect.left = 138; from_rect.top = 36; break;
}
from_rect.right = from_rect.left + 14;
from_rect.bottom = from_rect.top + 10;
rect_draw_some_item( dlg_buttons_gworld,from_rect,(HBITMAP) win_dc,item_rect[item_index],0,2); break;
break;
case 3: case 4: case 7: case 8: case 9:
cd_erase_item(dlog_num,item_num);
SetTextColor(win_dc,colors[3]);
if ((item_type[item_index] == 3) || (item_type[item_index] == 9))
SelectObject(win_dc,small_bold_font);
if (item_type[item_index] == 4)
SelectObject(win_dc,tiny_font);
if (item_type[item_index] == 7)
SelectObject(win_dc,bold_font);
if (item_flag[item_index] % 10 == 1)
cd_frame_item(dlog_num,item_num,2);
if (item_flag[item_index] >= 10) {
SetTextColor(win_dc,colors[1]);
}
if (item_rect[item_index].bottom - item_rect[item_index].top < 20) {
item_rect[item_index].left += 3;
DrawText(win_dc,(char *) ((item_index < 10) ? text_long_str[item_index] :
text_short_str[item_index - 10]), -1, &item_rect[item_index],
DT_LEFT | DT_SINGLELINE | DT_VCENTER | DT_NOCLIP);
item_rect[item_index].left -= 3;
}
else {
InflateRect(&item_rect[item_index],-4,-4);
DrawText(win_dc,(char *) ((item_index < 10) ? text_long_str[item_index] :
text_short_str[item_index - 10]), -1, &item_rect[item_index],
DT_LEFT | DT_WORDBREAK | DT_NOCLIP);
InflateRect(&item_rect[item_index],4,4);
}
SetTextColor(win_dc,colors[0]);
break;
case 5:
if (item_flag[item_index] == -1)
cd_erase_item(dlog_num,item_num);
else if(custom_pic > 0){
draw_custom_dialog_graphic(dlgs[dlg_index], item_rect[item_index],
item_flag[item_index], TRUE,0);
}
else draw_dialog_graphic(dlgs[dlg_index], item_rect[item_index],
item_flag[item_index],(item_flag[item_index] >= 2000) ? FALSE : TRUE,0);
break;
}
}
if ( item_label[item_index] != 0) {
store_label = item_label[item_index];
if (store_label >= 1000) {
store_label -= 1000;
SelectObject(win_dc,bold_font);
}
else SelectObject(win_dc,tiny_font);
to_rect = item_rect[item_index];
switch (store_label / 100) {
case 0:
to_rect.right = to_rect.left;
to_rect.left -= 2 * (store_label % 100);
break;
case 1:
to_rect.bottom = to_rect.top;
to_rect.top -= 2 * (store_label % 100);
break;
case 2:
to_rect.left = to_rect.right;
to_rect.right += 2 * (store_label % 100);
break;
case 3:
to_rect.top = to_rect.bottom;
to_rect.bottom += 2 * (store_label % 100);
break;
}
if (to_rect.bottom - to_rect.top < 14) {
to_rect.bottom += (14 - (to_rect.bottom - to_rect.top)) / 2 + 1;
to_rect.top -= (14 - (to_rect.bottom - to_rect.top)) / 2 + 1;
}
if (item_active[item_index] != 0) {
SetTextColor(win_dc,colors[3]);
DrawText(win_dc, (char *) labels[item_label_loc[item_index]],
-1, &to_rect, DT_LEFT | DT_SINGLELINE | DT_VCENTER);
SetTextColor(win_dc,colors[0]);
}
}
SelectObject(win_dc,old_font);
cd_kill_dc(dlg_index,win_dc);
dlg_force_dc = NULL;
}
void cd_initial_draw(short dlog_num)
{
short i,which_dlg = -1;
for (i = 0; i < ND; i++)
if ((dlg_keys[i] >= 0) && (dlg_types[i] == dlog_num))
which_dlg = i;
if (which_dlg < 0)
return;
dlg_draw_ready[which_dlg] = TRUE;
cd_erase_item(dlog_num, 0);
cd_draw(dlog_num);
}
void cd_draw(short dlog_num)
{
short i,which_dlg = -1;
for (i = 0; i < ND; i++)
if ((dlg_keys[i] >= 0) && (dlg_types[i] == dlog_num))
which_dlg = i;
if (which_dlg < 0)
return;
for (i = 0; i < dlg_highest_item[which_dlg] + 1; i++) {
cd_draw_item(dlog_num,i);
}
}
void cd_redraw(HWND window)
{
short which_dlg,dlg_num,dlg_key;
short i;
if ((which_dlg = cd_find_dlog(window,&dlg_num,&dlg_key)) < 0)
return;
dlg_draw_ready[which_dlg] = TRUE;
cd_initial_draw(dlg_num);
for (i = 0; i < 80; i++)
if ((store_edit_parent[i] != NULL) &&
(store_edit_parent_num[i] == dlg_num)) {
RedrawWindow(edit_box[i],NULL,NULL,RDW_INVALIDATE | RDW_UPDATENOW);
}
}
void cd_frame_item(short dlog_num, short item_num, short width)
{
short dlg_index,item_index;
if (cd_get_indices(dlog_num,item_num,&dlg_index,&item_index) < 0)
return;
frame_dlog_rect(dlgs[dlg_index], item_rect[item_index], width);
}
void cd_erase_item(short dlog_num, short item_num)
// if item_num is 0, nail whole window
// item_num + 100 just erase label
{
short i,dlg_index,item_index,store_label;
RECT to_fry;
HDC win_dc;
HBRUSH old_brush;
HPEN old_pen;
Boolean just_label = FALSE;
if (item_num >= 100) {
item_num -= 100;
just_label = TRUE;
}
if (item_num == 0) {
for (i = 0; i < ND; i++)
if ((dlg_keys[i] >= 0) && (dlg_types[i] == dlog_num))
dlg_index = i;
GetWindowRect(dlgs[dlg_index],&to_fry);
OffsetRect(&to_fry,-1 * to_fry.left,-1 * to_fry.top);
}
else {
if (cd_get_indices(dlog_num,item_num,&dlg_index,&item_index) < 0)
return;
to_fry = item_rect[item_index];
if (just_label == TRUE) {
if (item_label[item_index] != 0) {
store_label = item_label[item_index];
if (store_label >= 1000)
store_label -= 1000;
switch (store_label / 100) {
case 0:
to_fry.right = to_fry.left;
to_fry.left -= 2 * (store_label % 100);
break;
case 1:
to_fry.bottom = to_fry.top;
to_fry.top -= 2 * (store_label % 100);
break;
case 2:
to_fry.left = to_fry.right;
to_fry.right += 2 * (store_label % 100);
break;
case 3:
to_fry.top = to_fry.bottom;
to_fry.bottom += 2 * (store_label % 100);
break;
}
if ((i = 12 - (to_fry.bottom - to_fry.top)) > 0) {
// adjust rect ... but doesn't work for bold letters
to_fry.bottom += i / 2;
to_fry.bottom++; // extra pixel to get dangly letters
to_fry.top -= i / 2;
}
}
}
InflateRect(&to_fry,1,1);
}
if (dlg_draw_ready[dlg_index] == FALSE)
return;
win_dc = cd_get_dlog_dc(dlg_index);
paint_pattern((HBITMAP)win_dc,2,to_fry,0);
cd_kill_dc(dlg_index,win_dc);
}
void cd_press_button(short dlog_num, short item_num)
{
short dlg_index,item_index;
long dummy;
HDC win_dc;
RECT from_rect,to_rect;
COLORREF colors[3] = {RGB(0,0,0),RGB(0,0,112),RGB(0,255,255)};
if (cd_get_indices(dlog_num,item_num,&dlg_index,&item_index) < 0)
return;
// no press action for redio buttons
if (item_type[item_index] == 2) {
play_sound(34);
return;
}
win_dc = cd_get_dlog_dc(dlg_index);
from_rect.top = button_ul_y[button_type[item_flag[item_index]]];
from_rect.left = button_ul_x[button_type[item_flag[item_index]]];
from_rect.bottom = from_rect.top + button_height[button_type[item_flag[item_index]]];
from_rect.right = from_rect.left + button_width[button_type[item_flag[item_index]]];
OffsetRect(&from_rect,button_width[button_type[item_flag[item_index]]],0);
rect_draw_some_item(dlg_buttons_gworld,from_rect,(HBITMAP)win_dc,item_rect[item_index],0,2);
SelectObject(win_dc,bold_font);
SetTextColor(win_dc,colors[2]);
if (item_type[item_index] < 2)
OffsetRect(&item_rect[item_index],-1 * button_left_adj[item_flag[item_index]],0);
if (item_type[item_index] < 2) {
char_win_draw_string(win_dc,item_rect[item_index],
(char *) (button_strs[item_flag[item_index]]),1,8);
}
else {
char_win_draw_string(win_dc,item_rect[item_index],
(char *) ((item_index < 10) ? text_long_str[item_index] :
text_short_str[item_index - 10]),1,8);
}
if (item_type[item_index] < 2)
OffsetRect(&item_rect[item_index],button_left_adj[item_flag[item_index]],0);
if (play_sounds == TRUE) {
play_sound(37);
Delay(6,&dummy);
}
OffsetRect(&from_rect,-1 * button_width[button_type[item_flag[item_index]]],0);
rect_draw_some_item(dlg_buttons_gworld,from_rect,(HBITMAP)win_dc,item_rect[item_index],0,2);
SelectObject(win_dc,bold_font);
SetTextColor(win_dc,colors[1]);
if (item_type[item_index] < 2)
OffsetRect(&item_rect[item_index],-1 * button_left_adj[item_flag[item_index]],0);
if (item_type[item_index] < 2) {
char_win_draw_string(win_dc,item_rect[item_index],
(char *) (button_strs[item_flag[item_index]]),1,8);
}
else {
char_win_draw_string(win_dc,item_rect[item_index],
(char *) ((item_index < 10) ? text_long_str[item_index] :
text_short_str[item_index - 10]),1,8);
}
if (item_type[item_index] < 2)
OffsetRect(&item_rect[item_index],button_left_adj[item_flag[item_index]],0);
SelectObject(win_dc,font);
SetTextColor(win_dc,colors[0]);
cd_kill_dc(dlg_index,win_dc);
}
// LOW LEVEL
short cd_get_indices(short dlg_num, short item_num, short *dlg_index, short *item_index)
{
if ((*dlg_index = cd_get_dlg_index(dlg_num)) < 0) {
return -1;
}
if ((*item_index = cd_get_item_id(dlg_num,item_num)) < 0) {
return -1;
}
return 0;
}
short cd_get_dlg_index(short dlog_num)
{
short i;
for (i = 0; i < ND; i++)
if ((dlg_keys[i] >= 0) && (dlg_types[i] == dlog_num))
return i;
return -1;
}
short cd_find_dlog(HWND window, short *dlg_num, short *dlg_key)
{
short i;
for (i = 0; i < ND; i++)
if ((dlg_keys[i] >= 0) && (dlgs[i] == window)) {
*dlg_num = dlg_types[i];
*dlg_key = dlg_keys[i];
return i;
}
return -1;
}
short cd_get_item_id(short dlg_num, short item_num)
{
short i;
for (i = 0; i < NI; i++)
if ((item_dlg[i] == dlg_num) && (item_number[i] == item_num))
return i;
return -1;
}
HDC cd_get_dlog_dc(short which_slot)
{
HDC win_dc;
win_dc = GetDC(dlgs[which_slot]);
SetBkMode(win_dc,TRANSPARENT);
return win_dc;
}
void cd_kill_dc(short which_slot,HDC hdc)
{
fry_dc(dlgs[which_slot],hdc);
}
// External graphics tools (huh huh huh ... tool ... huh huh huh)
void center_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 = wind_rect.right - wind_rect.left;
height = wind_rect.bottom - wind_rect.top;
MoveWindow(window,((main_rect.right - main_rect.left) - width) / 2,
((main_rect.bottom - main_rect.top) - height) / 2,width,height,TRUE);
}
RECT get_item_rect(HWND hDlg, short item_num)
{
HWND item;
RECT big_rect,small_rect;
item = GetDlgItem(hDlg, item_num);
GetWindowRect(hDlg,&big_rect);
GetWindowRect(item,&small_rect);
OffsetRect(&small_rect, -1 * big_rect.left - 7, -1 * big_rect.top - 7);
small_rect.right += 2;
small_rect.bottom += 2;
return small_rect;
}
void frame_dlog_rect(HWND hDlg, RECT rect, short val)
{
HDC hdc;
HPEN dpen,lpen,old_pen;
COLORREF x = RGB(0,204,255),y = RGB(0,204,255);//y = RGB(119,119,119);
UINT c;
Boolean keep_dc = FALSE;
InflateRect(&rect,val,val);
if (hDlg == mainPtr) {
keep_dc = TRUE;
hdc = main_dc;
}
else if (dlg_force_dc != NULL) {
hdc = dlg_force_dc;
keep_dc = TRUE;
}
else hdc = GetDC(hDlg);
if (hdc == NULL) {
beep();
return;
}
dpen = CreatePen(PS_SOLID,1,y);
if (hDlg != mainPtr)
lpen = CreatePen(PS_SOLID,1,x);
else lpen = CreatePen(PS_SOLID,1,y);
old_pen = (HPEN) SelectObject(hdc,dpen);
MoveToEx(hdc,rect.left,rect.top,NULL);
LineTo(hdc,rect.right,rect.top);
SelectObject(hdc,lpen);
LineTo(hdc,rect.right,rect.bottom);
LineTo(hdc,rect.left,rect.bottom);
SelectObject(hdc,dpen);
LineTo(hdc,rect.left,rect.top);
SelectObject(hdc,old_pen);
if (keep_dc == FALSE)
fry_dc(hDlg,hdc);
DeleteObject(dpen);
DeleteObject(lpen);
}
void draw_custom_dialog_graphic(HWND hDlg, RECT rect, short which_g, Boolean do_frame,short win_or_gworld){
short picnum;
RECT from1 = {0,0,36,28},from2 = {0,0,36,36},from3 = {0,0,72,72},tiny_obj_rect = {0,0,18,18};
RECT from_rect = {0,0,28, 36};
RECT face_from = {0,0,32,32};
RECT death_to = {6,6,78,78};
RECT to_rect = {6,6,42,42};
RECT m_to_rect = {10,6,38,42};
RECT pc_info_from = {0,127,106,157};
RECT item_info_from = {174,0,312,112};
RECT stat_symbols_from = {0,0,386,94}; /**/
HBITMAP from_gworld;
short draw_dest = 2,m_start_pic;
HDC hdc;
HBRUSH old_brush;
RECT small_monst_rect = {0,0,14,18};
if (win_or_gworld == 1)
draw_dest = 0;
if (which_g < 0)
return;
if (win_or_gworld == 0) {
if (dlg_force_dc != NULL)
hdc = dlg_force_dc;
else hdc = GetDC(hDlg);
}
switch(custom_pic){
case 1: // custom terrain, item or 1x1 monster
from_gworld = spec_scen_g;
from_rect = calc_rect(which_g % 10, which_g / 10);
if (rect.right - rect.left != 28) {
rect.left += 1;
rect.right = rect.left + 28;
}
rect_draw_some_item(from_gworld,from_rect,(HBITMAP) ((win_or_gworld == 1) ? (HBITMAP) (hDlg): (HBITMAP)hdc)
,rect,0,draw_dest);
break;
case 2: //custom 2x1 monster
rect.right = rect.left + 28; rect.bottom = rect.top + 36;
if (win_or_gworld == 0) {
old_brush = (HBRUSH)SelectObject(hdc,GetStockObject(BLACK_BRUSH));
Rectangle(hdc,rect.left,rect.top,rect.right,rect.bottom);
SelectObject(hdc,old_brush);
}
from_gworld = spec_scen_g;
m_start_pic = which_g;
from_rect = calc_rect(m_start_pic % 10, m_start_pic / 10);
OffsetRect(&small_monst_rect,rect.left,rect.top + 7);
if (win_or_gworld == 1)
rect_draw_some_item(from_gworld,from_rect,(HBITMAP) hDlg,small_monst_rect,0,0);
else rect_draw_some_item(from_gworld,from_rect,(HBITMAP)hdc,small_monst_rect,0,draw_dest);
m_start_pic = which_g + 1;
from_gworld = spec_scen_g;
// m_start_pic = m_start_pic % 20;
from_rect = calc_rect(m_start_pic % 10, m_start_pic / 10);
OffsetRect(&small_monst_rect,14,0);
if (win_or_gworld == 1)
rect_draw_some_item(from_gworld,from_rect,(HBITMAP) hDlg,small_monst_rect,0,0);
else rect_draw_some_item(from_gworld,from_rect,(HBITMAP)hdc,small_monst_rect,0,draw_dest);
break;
case 3: //custom 1x2 monster
rect.right = rect.left + 28; rect.bottom = rect.top + 36;
if (win_or_gworld == 0) {
old_brush = (HBRUSH) SelectObject(hdc,GetStockObject(BLACK_BRUSH));
Rectangle(hdc,rect.left,rect.top,rect.right,rect.bottom);
SelectObject(hdc,old_brush);
}
from_gworld = spec_scen_g;
m_start_pic = which_g;
from_rect = calc_rect(m_start_pic % 10, m_start_pic / 10);
OffsetRect(&small_monst_rect,rect.left + 7,rect.top);
if (win_or_gworld == 1)
rect_draw_some_item(from_gworld,from_rect,(HBITMAP) hDlg,small_monst_rect,0,0);
else rect_draw_some_item(from_gworld,from_rect,(HBITMAP)hdc,small_monst_rect,0,draw_dest);
m_start_pic = which_g + 1;
from_gworld = spec_scen_g;
from_rect = calc_rect(m_start_pic % 10, m_start_pic / 10);
OffsetRect(&small_monst_rect,0,18);
if (win_or_gworld == 1)
rect_draw_some_item(from_gworld,from_rect,(HBITMAP) hDlg,small_monst_rect,0,0);
else rect_draw_some_item(from_gworld,from_rect,(HBITMAP)hdc,small_monst_rect,0,draw_dest);
break;
case 4: //custom 2x2 monster
rect.right = rect.left + 28; rect.bottom = rect.top + 36;
if (win_or_gworld == 0) {
old_brush = (HBRUSH)SelectObject(hdc,GetStockObject(BLACK_BRUSH));
Rectangle(hdc,rect.left,rect.top,rect.right,rect.bottom);
SelectObject(hdc,old_brush);
}
from_gworld = spec_scen_g;
m_start_pic = which_g;
from_rect = calc_rect(m_start_pic % 10, m_start_pic / 10);
OffsetRect(&small_monst_rect,rect.left,rect.top);
if (win_or_gworld == 1)
rect_draw_some_item(from_gworld,from_rect,(HBITMAP) hDlg,small_monst_rect,0,0);
else rect_draw_some_item(from_gworld,from_rect,(HBITMAP)hdc,small_monst_rect,0,draw_dest);
m_start_pic = which_g + 1;
from_gworld = spec_scen_g;
from_rect = calc_rect(m_start_pic % 10, m_start_pic / 10);
OffsetRect(&small_monst_rect,14,0);
if (win_or_gworld == 1)
rect_draw_some_item(from_gworld,from_rect,(HBITMAP) hDlg,small_monst_rect,0,0);
else rect_draw_some_item(from_gworld,from_rect,(HBITMAP)hdc,small_monst_rect,0,draw_dest);
m_start_pic = which_g + 2;
from_gworld = spec_scen_g;
from_rect = calc_rect(m_start_pic % 10, m_start_pic / 10);
OffsetRect(&small_monst_rect,-14,18);
if (win_or_gworld == 1)
rect_draw_some_item(from_gworld,from_rect,(HBITMAP) hDlg,small_monst_rect,0,0);
else rect_draw_some_item(from_gworld,from_rect,(HBITMAP)hdc,small_monst_rect,0,draw_dest);
m_start_pic = which_g + 3;
from_gworld = spec_scen_g;
from_rect = calc_rect(m_start_pic % 10, m_start_pic / 10);
OffsetRect(&small_monst_rect,14,0);
if (win_or_gworld == 1)
rect_draw_some_item(from_gworld,from_rect,(HBITMAP) hDlg,small_monst_rect,0,0);
else rect_draw_some_item(from_gworld,from_rect,(HBITMAP)hdc,small_monst_rect,0,draw_dest);
break;
case 5: // animated custom terrain
from_gworld = spec_scen_g;
from_rect = calc_rect(which_g % 10, which_g /10);
if (rect.right - rect.left != 28) {
rect.left += 1;
rect.right = rect.left + 28;
}
from_rect.left += 28 * ((anim_ticks / 20) % 4);
from_rect.right = from_rect.left + 28;
rect_draw_some_item(from_gworld,from_rect,(HBITMAP) ((win_or_gworld == 1) ? (HBITMAP)hDlg: (HBITMAP)hdc)
,rect,0,draw_dest);
break;
}
if ((win_or_gworld == 0) && (dlg_force_dc == NULL))
fry_dc(hDlg, hdc);
if ((win_or_gworld == 0) && (do_frame == TRUE)) {
rect.right--; rect.bottom--;
frame_dlog_rect(hDlg,rect,3);
}
custom_pic = 0;
}
void draw_dialog_graphic(HWND hDlg, RECT rect, short which_g, Boolean do_frame,short win_or_gworld)
// win_or_gworld: 0 - window 1 - an HBITMAP
// 1 means hDlg is actually an HBITMAP variable!
// 0 - 300 number of terrain graphic
// 400 + x - monster graphic num
// 600 + x item graphic
// 700 + x dlog graphic
// 800 + x pc graphic
// 900 + x B&W graphic
// 950 null item
// 1000 + x Talking face
// 1100 - item info help
// 1200 - pc screen help
// 1300 - combat ap
// 1400-1402 - button help
// 1500 - stat symbols help
// 1600 + x - B&W maps
// 1700 + x - anim graphic
{
short picnum;
RECT from1 = {0,0,36,28},from2 = {0,0,36,36},from3 = {0,0,72,72},tiny_obj_rect = {0,0,18,18};
RECT from_rect = {0,0,28, 36};
RECT face_from = {0,0,32,32};
RECT death_to = {6,6,78,78};
RECT to_rect = {6,6,42,42};
RECT m_to_rect = {10,6,38,42};
RECT pc_info_from = {0,127,106,157};
RECT item_info_from = {174,0,312,112};
RECT stat_symbols_from = {0,0,386,94}; /**/
HBITMAP from_gworld;
short draw_dest = 2,m_start_pic;
HDC hdc;
HBRUSH old_brush;
RECT small_monst_rect = {0,0,14,18};
if (win_or_gworld == 1)
draw_dest = 0;
if (which_g < 0)
return;
if (which_g >= 2000)
do_frame = FALSE;
which_g = which_g % 2000;
if (win_or_gworld == 0) {
if (dlg_force_dc != NULL)
hdc = dlg_force_dc;
else hdc = GetDC(hDlg);
}
if (which_g == 950) { // Empty. Maybe clear space.
if (win_or_gworld == 0) {
rect.left -= 3;
rect.top -= 3;
rect.right += 3;
rect.bottom += 4;
paint_pattern((HBITMAP)hdc,2,rect,0);
}
//FillCRect(&rect,bg[5]); // don't forget to nail dc!!!
if (dlg_force_dc == NULL)
fry_dc(hDlg, hdc);
return;
}
switch (which_g / 100) {
case 0: case 1: case 2: // terrain
from_gworld = load_pict(800 + which_g / 50);
which_g = which_g % 50;
from_rect = calc_rect(which_g % 10, which_g / 10);
if (rect.right - rect.left != 28) {
rect.left += 1;
rect.right = rect.left + 28;
}
rect_draw_some_item(from_gworld,from_rect,(HBITMAP) ((win_or_gworld == 1) ? (HBITMAP) (hDlg): (HBITMAP)hdc)
,rect,0,draw_dest);
DeleteObject(from_gworld);
break;
case 3: // animated terrain
which_g -= 300;
if (rect.right - rect.left != 28) {
rect.left += 1;
rect.right = rect.left + 28;
}
from_gworld = load_pict(820);
// from_rect = calc_rect(4 * (which_g / 5), which_g % 5);
from_rect.left = 112 * (which_g / 5)+ 28 * ((anim_ticks / 20) % 4);
from_rect.right = from_rect.left + 28;
from_rect.top = 36 * (which_g % 5);
from_rect.bottom = from_rect.top + 36;
rect_draw_some_item(from_gworld,from_rect,(HBITMAP) ((win_or_gworld == 1) ? (HBITMAP)hDlg: (HBITMAP)hdc)
,rect,0,draw_dest);
DeleteObject(from_gworld);
break;
case 4: case 5: // monster
// There are 4 different ways to draw, depending on size of monster
which_g -= 400;
m_start_pic = m_pic_index[which_g];
if ((m_pic_index_x[which_g] == 1) && (m_pic_index_y[which_g] == 1)) {
from_gworld = monst_gworld[m_start_pic / 20];
m_start_pic = m_start_pic % 20;
from_rect = calc_rect(2 * (m_start_pic / 10), m_start_pic % 10);
rect.right = rect.left + 28; rect.bottom = rect.top + 36;
if (win_or_gworld == 0) {
old_brush = (HBRUSH)SelectObject(hdc,GetStockObject(BLACK_BRUSH));
Rectangle(hdc,rect.left,rect.top,rect.right,rect.bottom);
SelectObject(hdc,old_brush);
}
if (win_or_gworld == 1)
rect_draw_some_item(from_gworld,from_rect,(HBITMAP) hDlg,rect,0,0);
else rect_draw_some_item(from_gworld,from_rect,(HBITMAP)hdc,rect,0,draw_dest);
}
if ((m_pic_index_x[which_g] == 2) && (m_pic_index_y[which_g] == 1)) {
rect.right = rect.left + 28; rect.bottom = rect.top + 36;
if (win_or_gworld == 0) {
old_brush = (HBRUSH)SelectObject(hdc,GetStockObject(BLACK_BRUSH));
Rectangle(hdc,rect.left,rect.top,rect.right,rect.bottom);
SelectObject(hdc,old_brush);
}
from_gworld = monst_gworld[m_start_pic / 20];
m_start_pic = m_start_pic % 20;
from_rect = calc_rect(2 * (m_start_pic / 10), m_start_pic % 10);
OffsetRect(&small_monst_rect,rect.left,rect.top + 7);
if (win_or_gworld == 1)
rect_draw_some_item(from_gworld,from_rect,(HBITMAP) hDlg,small_monst_rect,0,0);
else rect_draw_some_item(from_gworld,from_rect,(HBITMAP)hdc,small_monst_rect,0,draw_dest);
m_start_pic = m_pic_index[which_g] + 1;
from_gworld = monst_gworld[m_start_pic / 20];
m_start_pic = m_start_pic % 20;
from_rect = calc_rect(2 * (m_start_pic / 10), m_start_pic % 10);
OffsetRect(&small_monst_rect,14,0);
if (win_or_gworld == 1)
rect_draw_some_item(from_gworld,from_rect,(HBITMAP) hDlg,small_monst_rect,0,0);
else rect_draw_some_item(from_gworld,from_rect,(HBITMAP)hdc,small_monst_rect,0,draw_dest);
}
if ((m_pic_index_x[which_g] == 1) && (m_pic_index_y[which_g] == 2)) {
rect.right = rect.left + 28; rect.bottom = rect.top + 36;
if (win_or_gworld == 0) {
old_brush = (HBRUSH) SelectObject(hdc,GetStockObject(BLACK_BRUSH));
Rectangle(hdc,rect.left,rect.top,rect.right,rect.bottom);
SelectObject(hdc,old_brush);
}
from_gworld = monst_gworld[m_start_pic / 20];
m_start_pic = m_start_pic % 20;
from_rect = calc_rect(2 * (m_start_pic / 10), m_start_pic % 10);
OffsetRect(&small_monst_rect,rect.left + 7,rect.top);
if (win_or_gworld == 1)
rect_draw_some_item(from_gworld,from_rect,(HBITMAP) hDlg,small_monst_rect,0,0);
else rect_draw_some_item(from_gworld,from_rect,(HBITMAP)hdc,small_monst_rect,0,draw_dest);
m_start_pic = m_pic_index[which_g] + 1;
from_gworld = monst_gworld[m_start_pic / 20];
m_start_pic = m_start_pic % 20;
from_rect = calc_rect(2 * (m_start_pic / 10), m_start_pic % 10);
OffsetRect(&small_monst_rect,0,18);
if (win_or_gworld == 1)
rect_draw_some_item(from_gworld,from_rect,(HBITMAP) hDlg,small_monst_rect,0,0);
else rect_draw_some_item(from_gworld,from_rect,(HBITMAP)hdc,small_monst_rect,0,draw_dest);
}
if ((m_pic_index_x[which_g] == 2) && (m_pic_index_y[which_g] == 2)) {
rect.right = rect.left + 28; rect.bottom = rect.top + 36;
if (win_or_gworld == 0) {
old_brush = (HBRUSH)SelectObject(hdc,GetStockObject(BLACK_BRUSH));
Rectangle(hdc,rect.left,rect.top,rect.right,rect.bottom);
SelectObject(hdc,old_brush);
}
from_gworld = monst_gworld[m_start_pic / 20];
m_start_pic = m_start_pic % 20;
from_rect = calc_rect(2 * (m_start_pic / 10), m_start_pic % 10);
OffsetRect(&small_monst_rect,rect.left,rect.top);
if (win_or_gworld == 1)
rect_draw_some_item(from_gworld,from_rect,(HBITMAP) hDlg,small_monst_rect,0,0);
else rect_draw_some_item(from_gworld,from_rect,(HBITMAP)hdc,small_monst_rect,0,draw_dest);
m_start_pic = m_pic_index[which_g] + 1;
from_gworld = monst_gworld[m_start_pic / 20];
m_start_pic = m_start_pic % 20;
from_rect = calc_rect(2 * (m_start_pic / 10), m_start_pic % 10);
OffsetRect(&small_monst_rect,14,0);
if (win_or_gworld == 1)
rect_draw_some_item(from_gworld,from_rect,(HBITMAP) hDlg,small_monst_rect,0,0);
else rect_draw_some_item(from_gworld,from_rect,(HBITMAP)hdc,small_monst_rect,0,draw_dest);
m_start_pic = m_pic_index[which_g] + 2;
from_gworld = monst_gworld[m_start_pic / 20];
m_start_pic = m_start_pic % 20;
from_rect = calc_rect(2 * (m_start_pic / 10), m_start_pic % 10);
OffsetRect(&small_monst_rect,-14,18);
if (win_or_gworld == 1)
rect_draw_some_item(from_gworld,from_rect,(HBITMAP) hDlg,small_monst_rect,0,0);
else rect_draw_some_item(from_gworld,from_rect,(HBITMAP)hdc,small_monst_rect,0,draw_dest);
m_start_pic = m_pic_index[which_g] + 3;
from_gworld = monst_gworld[m_start_pic / 20];
m_start_pic = m_start_pic % 20;
from_rect = calc_rect(2 * (m_start_pic / 10), m_start_pic % 10);
OffsetRect(&small_monst_rect,14,0);
if (win_or_gworld == 1)
rect_draw_some_item(from_gworld,from_rect,(HBITMAP) hDlg,small_monst_rect,0,0);
else rect_draw_some_item(from_gworld,from_rect,(HBITMAP)hdc,small_monst_rect,0,draw_dest);
}
break;
case 18: case 19: // item
which_g -= 1800;
if (rect.right - rect.left != 28) {
rect.left += 1;
rect.right = rect.left + 28;
}
if (win_or_gworld == 0) {
old_brush = (HBRUSH) SelectObject(hdc,GetStockObject(WHITE_BRUSH));
Rectangle(hdc,rect.left,rect.top,rect.right,rect.bottom);
SelectObject(hdc,old_brush);
}
to_rect = rect;
if (which_g < 45) {
from_gworld = items_gworld;
from_rect = calc_rect(which_g % 5, which_g / 5);
}
else {
from_gworld = tiny_obj_gworld;
to_rect.top += 9;
to_rect.left += 5;
to_rect.right = to_rect.left + 18;
to_rect.bottom = to_rect.top + 18;
from_rect = tiny_obj_rect;
OffsetRect(&from_rect,18 * (which_g % 10), 18 * (which_g / 10));
}
rect_draw_some_item(from_gworld,from_rect,(HBITMAP) ((win_or_gworld == 1) ? (HBITMAP)hDlg: (HBITMAP)hdc)
,to_rect,1,draw_dest);
break;
case 7: // dialog
which_g -= 700;
from_gworld = dlogpics_gworld;
OffsetRect(&from2,36 * (which_g % 4),36 * (which_g / 4));
rect_draw_some_item(from_gworld,from2,(HBITMAP) ((win_or_gworld == 1) ? (HBITMAP)hDlg: (HBITMAP)hdc)
,rect,0,draw_dest);
break;
case 10: // talk face
which_g -= 1000;
from_gworld = talkfaces_gworld;
from_rect = face_from;
OffsetRect(&from_rect,32 * ((which_g - 1) % 10),32 * ((which_g - 1) / 10));
if (win_or_gworld == 1)
rect_draw_some_item(from_gworld,from_rect,(HBITMAP) hDlg,rect,0,0);
else rect_draw_some_item(from_gworld,from_rect,(HBITMAP)hdc,rect,0,draw_dest);
break;
case 11: // item info help
from_rect = item_info_from;
rect.right = rect.left + from_rect.right - from_rect.left;
rect.bottom = rect.top + from_rect.bottom - from_rect.top;
rect_draw_some_item(mixed_gworld,from_rect,(HBITMAP) ((win_or_gworld == 1) ? (HBITMAP)hDlg: (HBITMAP)hdc)
,rect,0,draw_dest);
break;
case 12: // item info help
from_rect = pc_info_from;
rect.right = rect.left + pc_info_from.right - pc_info_from.left;
rect.bottom = rect.top + pc_info_from.bottom - pc_info_from.top;
rect_draw_some_item(mixed_gworld,from_rect,(HBITMAP) ((win_or_gworld == 1) ? (HBITMAP)hDlg: (HBITMAP)hdc)
,rect,0,draw_dest);
break;
case 16:
which_g -= 1600;
from_gworld = load_pict(851);
from_rect.right = 32;
from_rect.bottom = 32;
OffsetRect(&from_rect,32 * (which_g % 5),32 * (which_g / 5));
rect.right = rect.left + 32;
rect.bottom = rect.top + 32;
rect_draw_some_item(from_gworld,from_rect,(HBITMAP) ((win_or_gworld == 1) ? (HBITMAP)hDlg: (HBITMAP)hdc)
,rect,0,draw_dest);
DeleteObject(from_gworld);
break;
}
if ((win_or_gworld == 0) && (dlg_force_dc == NULL))
fry_dc(hDlg, hdc);
if ((win_or_gworld == 0) && (do_frame == TRUE)) {
rect.right--; rect.bottom--;
frame_dlog_rect(hDlg,rect,3);
}
}
void showcursor(Boolean a)
{
short i;
i = ShowCursor(a);
if (a == FALSE)
while (i >= 0)
i = ShowCursor(FALSE);
if (a == TRUE)
while (i < 0)
i = ShowCursor(TRUE);
}
void ModalDialog()
{
MSG msg;
while ((dialog_not_toast == TRUE) && (GetMessage(&msg,NULL,0,0))) {
if (!TranslateAccelerator(mainPtr, accel, &msg)) {
TranslateMessage(&msg);
DispatchMessage(&msg);
}
}
}
RECT calc_rect(short i, short j)
{
RECT base_rect = {0,0,28,36};
OffsetRect(&base_rect,i * 28, j * 36);
return base_rect;
}
void InsetRect(RECT *rect,short x, short y)
{
InflateRect(rect,-1 * x, -1 * y);
}