I also added a ghost mode (shift-G) which allows you to pass through walls. In the Windows code, I added three small things: - the "&*()" Easter egg - typing ? should now give shopping and talking help as well - the Return to Start debug option shouldn't work when you're on a horse git-svn-id: http://openexile.googlecode.com/svn/trunk@101 4ebdad44-0ea0-11de-aab3-ff745001d230
352 lines
10 KiB
C++
352 lines
10 KiB
C++
/*
|
|
* dlgutil.cpp
|
|
* BoE
|
|
*
|
|
* Created by Celtic Minstrel on 22/04/09.
|
|
*
|
|
*/
|
|
|
|
#include <Carbon/Carbon.h>
|
|
#include "location.h"
|
|
#include "dlgconsts.h"
|
|
#include "dlgtool.h"
|
|
#include "dlgutil.h"
|
|
#include "soundtool.h"
|
|
#include "dlglowlevel.h"
|
|
#include "graphtool.h"
|
|
#include "mathutil.h"
|
|
|
|
extern char text_long_str[10][256];
|
|
extern char text_short_str[140][40];
|
|
extern dlg_t dlgs[ND];
|
|
extern dlg_item_t items[NI];
|
|
extern short available_dlog_buttons[NUM_DLOG_B];
|
|
extern btn_t buttons[];
|
|
extern short current_key;
|
|
|
|
short cd_create_custom_dialog(WindowPtr parent, Str255 strs[6],short pic_num,short btns[3]){
|
|
|
|
short i,j,free_slot = -1,free_item = -1,str_width,cur_but_right = 0;
|
|
WindowPtr dlg;
|
|
short total_len = 0;
|
|
|
|
|
|
short cur_item = 1;
|
|
short but_items[3] = {-1,-1,-1};
|
|
Rect pic_rect = {8,8,44,44},cur_text_rect = {2,50,0,0};
|
|
short win_width = 100, win_height = 100;
|
|
|
|
//store_parent = parent;
|
|
for (i = 0; i < ND; i++) {
|
|
if ((dlgs[i].key >= 0) && (dlgs[i].type == 900))
|
|
return -1;
|
|
}
|
|
for (i = 0; i < ND; i++) {
|
|
if (dlgs[i].key < 0) {
|
|
free_slot = i;
|
|
i = 500;
|
|
}
|
|
}
|
|
if (free_slot < 0)
|
|
return -2;
|
|
|
|
// quick check, to make sure there's at least 1 button
|
|
if ((btns[0] < 0) && (btns[1] < 0) && (btns[2] < 0))
|
|
btns[0] = 1;
|
|
current_key++;
|
|
dlgs[free_slot].key = current_key;
|
|
dlgs[free_slot].type = 900;
|
|
dlgs[free_slot].highest_item = 1;
|
|
dlgs[free_slot].draw_ready = false;
|
|
dlgs[free_slot].win = NULL;
|
|
|
|
// first, create dummy dlog
|
|
dlg = GetDialogWindow(GetNewDialog (900, NULL, IN_FRONT));
|
|
dlgs[free_slot].win = dlg;
|
|
if (dlgs[free_slot].win == NULL) {
|
|
play_sound(3);
|
|
return -3;
|
|
}
|
|
|
|
dlgs[free_slot].parent = parent;
|
|
|
|
//process_new_window (dlgs[free_slot]);
|
|
// instead of this, custom make items
|
|
free_item = -1;
|
|
|
|
// first, do 1-3 buttons
|
|
for (i = 0; i < 3; i++)
|
|
if (btns[i] >= 0) {// buttons
|
|
for (j = 150; j < NI; j++)
|
|
if (items[j].dlg < 0) {
|
|
free_item = j;
|
|
j = NI + 1;
|
|
}
|
|
items[free_item].dlg = 900;
|
|
items[free_item].type = (i == 0) ? 1 : 0;
|
|
items[free_item].number = cur_item;
|
|
//items[free_item].rect = get_item_rect(hDlg,i + 1);
|
|
|
|
items[free_item].flag = available_dlog_buttons[btns[i]];
|
|
items[free_item].active = 1;
|
|
items[free_item].label = 0;
|
|
items[free_item].label_loc = -1;
|
|
items[free_item].key = buttons[available_dlog_buttons[btns[i]]].def_key;
|
|
if (i == 0)
|
|
items[free_item].key = 31;
|
|
but_items[i] = free_item; // remember this to set item rect later
|
|
cur_item++;
|
|
}
|
|
// next, the upper left picture (always there)
|
|
for (j = 150; j < NI; j++)
|
|
if (items[j].dlg < 0) {
|
|
free_item = j;
|
|
j = NI + 1;
|
|
}
|
|
items[free_item].dlg = 900;
|
|
items[free_item].type = 5;
|
|
items[free_item].number = cur_item;
|
|
items[free_item].rect = pic_rect;
|
|
|
|
if (pic_num < 0) {
|
|
items[free_item].flag = pic_num * -1;
|
|
}
|
|
else //if (pic_num < 1000)
|
|
items[free_item].flag = pic_num;
|
|
// else items[free_item].flag = (pic_num % 1000) + 2400;
|
|
// if (pic_num >= 2000)
|
|
// items[free_item].flag += 300;
|
|
items[free_item].active = 1;
|
|
items[free_item].label = 0;
|
|
items[free_item].label_loc = -1;
|
|
items[free_item].key = 0;
|
|
cur_item++;
|
|
|
|
// finally, 0-6 text, first do preprocessing to find out how much room we need
|
|
for (i = 0; i < 6; i++)
|
|
total_len += string_length((char *) strs[i]);
|
|
total_len = total_len * 12;
|
|
str_width = s_sqrt(total_len) + 20;
|
|
//print_nums(0,total_len,str_width);
|
|
if (str_width < 340)
|
|
str_width = 340;
|
|
cur_text_rect.right = cur_text_rect.left + str_width;
|
|
// finally, 0-6 text, then create the items
|
|
for (i = 0; i < 6; i++)
|
|
if (strlen((char *) strs[i]) > 0) {// text
|
|
for (j = 0; j < 10; j++)
|
|
if (items[j].dlg < 0) {
|
|
free_item = j;
|
|
j = NI + 1;
|
|
}
|
|
items[free_item].dlg = 900;
|
|
items[free_item].type = 9;
|
|
items[free_item].number = cur_item;
|
|
items[free_item].rect = cur_text_rect;
|
|
items[free_item].rect.bottom = items[free_item].rect.top +
|
|
((string_length((char *) strs[i]) + 60) / str_width) * 12 + 16;
|
|
items[free_item].rect.right += 20;
|
|
|
|
//print_nums(i,string_length((char *) strs[i]),str_width);
|
|
cur_text_rect.top = items[free_item].rect.bottom + 8;
|
|
items[free_item].flag = 0;
|
|
items[free_item].active = 1;
|
|
items[free_item].label = 0;
|
|
items[free_item].label_loc = -1;
|
|
items[free_item].key = 0;
|
|
sprintf(text_long_str[free_item],"%s",
|
|
(char *) strs[i]);
|
|
cur_item++;
|
|
}
|
|
|
|
dlgs[free_slot].highest_item = cur_item - 1;
|
|
|
|
// finally, do button rects
|
|
cur_but_right = cur_text_rect.right + 30;
|
|
//cur_text_rect.top += 8;
|
|
for (i = 0; i < 3; i++)
|
|
if (btns[i] >= 0) {
|
|
items[but_items[i]].rect.right = cur_but_right;
|
|
items[but_items[i]].rect.top = cur_text_rect.top;
|
|
items[but_items[i]].rect.bottom = items[but_items[i]].rect.top + 23;
|
|
if (buttons[available_dlog_buttons[btns[i]]].type == 1)
|
|
items[but_items[i]].rect.left = items[but_items[i]].rect.right - 63;
|
|
else items[but_items[i]].rect.left = items[but_items[i]].rect.right - 110;
|
|
cur_but_right = items[but_items[i]].rect.left - 4;
|
|
if (i == 0) {
|
|
win_width = items[but_items[i]].rect.right + 6;
|
|
win_height = items[but_items[i]].rect.bottom + 6;
|
|
}
|
|
}
|
|
|
|
//MoveWindow(dlgs[free_slot].win,(windRect.right - win_width) / 2,(windRect.bottom - win_width) / 2 + 20,false);
|
|
SizeWindow(dlgs[free_slot].win,win_width,win_height,false);
|
|
|
|
ShowWindow(dlgs[free_slot].win);
|
|
SetPort(GetWindowPort(dlgs[free_slot].win));
|
|
TextFont(geneva_font_num);
|
|
TextFace(bold);
|
|
TextSize(10);
|
|
ForeColor(blackColor);
|
|
BackColor(whiteColor);
|
|
untoast_dialog();
|
|
|
|
return 0;
|
|
}
|
|
|
|
void oops_error(short error, short code, short mode){ // mode is 0 for scened, 1 for game, 2 for pced
|
|
Str255 error_str1, error_str2;
|
|
static const char* progname[3] = {"the scenario editor", "Blades of Exile", "the PC editor"};
|
|
static const char* filetname[3] = {"scenario", "game", "game"};
|
|
|
|
SysBeep(50);
|
|
SysBeep(50);
|
|
SysBeep(50);
|
|
sprintf((char*)error_str1,"The program encountered an error while loading/saving/creating the %s. To prevent future problems, the program will now terminate. Trying again may solve the problem.", filetname[mode]);
|
|
sprintf((char *) error_str2,"Giving %s more memory might also help. Be sure to back your %s up often. Error number: %d.",progname[mode],filetname[mode],error);
|
|
if(code != 0)
|
|
sprintf((char*) error_str2,"%s Result code: %i.",error_str2,code);
|
|
give_error((char*) error_str1,(char *) error_str2,0);
|
|
ExitToShell();
|
|
}
|
|
|
|
void give_error(char *text1, char *text2,short parent_num){
|
|
display_strings(text1,text2,"Error!",57,/*7*/16,PICT_DLG,parent_num);
|
|
}
|
|
|
|
short store_str_label_1, store_str_label_2, store_str_label_1b, store_str_label_2b;
|
|
// str_label_1 & str_label_2 uysed for saving button for journal
|
|
// 1000 + x scen 2000 + x out 3000 + x town
|
|
void display_strings(const char *text1, const char *text2,short str_label_1,short str_label_2,short str_label_1b,
|
|
short str_label_2b,
|
|
const char *title,short sound_num,short graphic_num,short graphic_type,short parent_num){
|
|
|
|
short item_hit;
|
|
|
|
set_cursor(sword_curs);
|
|
|
|
store_str_label_1 = str_label_1;
|
|
store_str_label_2 = str_label_2;
|
|
store_str_label_1b = str_label_1b;
|
|
store_str_label_2b = str_label_2b;
|
|
// store_str1a = str1a;
|
|
// store_str1b = str1b;
|
|
// store_str2a = str2a;
|
|
// store_str2b = str2b;
|
|
|
|
// if ((str1a <= 0) || (str1b <= 0))
|
|
// return;
|
|
short which_string_dlog = 970;
|
|
if (strlen(title) > 0)
|
|
which_string_dlog += 2;
|
|
if ((text2 != NULL) && (text2[0] != 0))
|
|
which_string_dlog++;
|
|
cd_create_dialog_parent_num(which_string_dlog,parent_num);
|
|
|
|
csp(which_string_dlog,which_string_dlog,graphic_num,graphic_type);
|
|
|
|
csit(which_string_dlog,4,(char *) text1);
|
|
if (text2 != NULL) {
|
|
csit(which_string_dlog,5,(char *) text2);
|
|
}
|
|
if (strlen(title) > 0)
|
|
csit(which_string_dlog,6,title);
|
|
csp(which_string_dlog,3,graphic_num,graphic_type);
|
|
if (sound_num >= 0)
|
|
play_sound(sound_num);
|
|
|
|
if ((str_label_1 < 0) && (str_label_2 < 0))
|
|
cd_activate_item(which_string_dlog,2,0);
|
|
|
|
item_hit = cd_run_dialog();
|
|
cd_kill_dialog(which_string_dlog);
|
|
//final_process_dialog(which_string_dlog);
|
|
}
|
|
|
|
void display_strings(short a1,short a2, short b1, short b2,
|
|
const char *title,short sound_num,short graphic_num,short graphic_type,short parent_num){
|
|
Str255 str1 = "", str2 = "";
|
|
|
|
if ((a1 > 0) && (a2 > 0))
|
|
get_str(str1,a1,a2);
|
|
if ((b1 > 0) && (b2 > 0))
|
|
get_str(str2,b1,b2);
|
|
display_strings((char *) str1,(char *) str2,-1,-1,-1,-1,
|
|
title, sound_num, graphic_num, graphic_type, parent_num);
|
|
}
|
|
|
|
extern void record_display_strings();
|
|
void display_strings_event_filter (short item_hit){
|
|
switch (item_hit) {
|
|
case 1:
|
|
toast_dialog();
|
|
break;
|
|
case 2:
|
|
record_display_strings();
|
|
break;
|
|
}
|
|
}
|
|
|
|
short dialog_answer;
|
|
void fancy_choice_dialog_event_filter (short item_hit)
|
|
{
|
|
toast_dialog();
|
|
dialog_answer = item_hit;
|
|
}
|
|
|
|
short fancy_choice_dialog(short which_dlog,short parent)
|
|
// ignore parent in Mac version
|
|
{
|
|
short item_hit,i,store_dialog_answer;
|
|
|
|
store_dialog_answer = dialog_answer;
|
|
//make_cursor_sword();
|
|
|
|
cd_create_dialog_parent_num(which_dlog,parent);
|
|
|
|
item_hit = cd_run_dialog();
|
|
|
|
cd_kill_dialog(which_dlog);
|
|
|
|
|
|
i = dialog_answer;
|
|
dialog_answer = store_dialog_answer;
|
|
|
|
return i;
|
|
}
|
|
|
|
void display_strings(const char *text1, const char *text2,
|
|
const char *title,short sound_num,short graphic_num,short graphic_type,short parent_num){
|
|
|
|
short item_hit;
|
|
location view_loc;
|
|
|
|
//make_cursor_sword();
|
|
|
|
if ((text1 == NULL) && (text2 == NULL))
|
|
return;
|
|
short which_string_dlog = 970;
|
|
if (strlen(title) > 0)
|
|
which_string_dlog += 2;
|
|
if ((text2 != NULL) && (text2[0] != 0))
|
|
which_string_dlog++;
|
|
cd_create_dialog_parent_num(which_string_dlog,parent_num);
|
|
|
|
csp(which_string_dlog,which_string_dlog,graphic_num,graphic_type);
|
|
|
|
csit(which_string_dlog,4,(char *) text1);
|
|
if (text2 != NULL) {
|
|
csit(which_string_dlog,5,(char *) text2);
|
|
}
|
|
if (strlen(title) > 0)
|
|
csit(which_string_dlog,6,title);
|
|
csp(which_string_dlog,3,graphic_num,graphic_type);
|
|
//if (sound_num >= 0)
|
|
// play_sound(sound_num);
|
|
|
|
item_hit = cd_run_dialog();
|
|
|
|
cd_kill_dialog(which_string_dlog);
|
|
}
|
|
|