1 line
24 KiB
C
Executable File
1 line
24 KiB
C
Executable File
/*
|
||
Blades of Exile Game/Scenario Editor/Character Editor
|
||
Copyright (C) 1998-2007, Jeff Vogel
|
||
http://www.spiderwebsoftware.com, spidweb@spiderwebsoftware.com
|
||
|
||
This program is free software; you can redistribute it and/or modify
|
||
it under the terms of the GNU General Public License as published by
|
||
the Free Software Foundation; either version 2 of the License, or
|
||
(at your option) any later version.
|
||
|
||
This program is distributed in the hope that it will be useful,
|
||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||
GNU General Public License for more details.
|
||
|
||
You should have received a copy of the GNU General Public License along
|
||
with this program; if not, write to the Free Software Foundation, Inc.,
|
||
51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
|
||
*/
|
||
|
||
#include <Memory.h>
|
||
#include <Quickdraw.h>
|
||
#include <QuickdrawText.h>
|
||
|
||
#include <Fonts.h>
|
||
#include <Events.h>
|
||
#include <Menus.h>
|
||
#include <Windows.h>
|
||
#include <TextEdit.h>
|
||
#include <Dialogs.h>
|
||
#include <OSUtils.h>
|
||
#include <ToolUtils.h>
|
||
#include <stdio.h>
|
||
#include <Gestalt.h>
|
||
#include <Palettes.h>
|
||
#include <AppleEvents.h>
|
||
#include <Files.h>
|
||
#include <StandardFile.h>
|
||
#include <QDOffscreen.h>
|
||
|
||
#include "string.h"
|
||
#include "ed.global.h"
|
||
#include "ed.graphics.h"
|
||
#include "ed.editors.h"
|
||
#include "ed.action.h"
|
||
#include "ed.fileio.h"
|
||
#include "ed.sound.h"
|
||
#include "dlogtool.h"
|
||
|
||
Rect pc_area_buttons[6][4] ; // 0 - whole 1 - pic 2 - name 3 - stat strs 4,5 - later
|
||
Rect item_string_rects[24][4]; // 0 - name 1 - drop 2 - id 3 -
|
||
Rect pc_info_rect; // Frame that holds a pc's basic info and items
|
||
Rect name_rect; //Holds pc name inside pc_info_rect
|
||
Rect info_area_rect;
|
||
Rect hp_sp_rect; // Holds hit points and spells points for pc
|
||
Rect skill_rect; // Holds "Skills:" string
|
||
Rect pc_skills_rect[19]; //Holds current pc's skill levels
|
||
Rect status_rect; //Holds the string "Status:"
|
||
Rect pc_status_rect[10]; //Holds first 8 effects on pc
|
||
Rect traits_rect; //Holds the string "Traits:"
|
||
Rect pc_traits_rect[16]; //Holds pc traits
|
||
Rect pc_race_rect; //Holds current pc's race
|
||
Rect edit_rect[5][2]; //Buttons that bring up pc edit dialog boxs
|
||
|
||
|
||
|
||
short current_active_pc = 0;
|
||
short dialog_answer;
|
||
|
||
/* Mac stuff globals */
|
||
Rect windRect, Drag_Rect;
|
||
Boolean Multifinder_Present, All_Done = FALSE,diff_depth_ok = FALSE;
|
||
EventRecord event;
|
||
WindowPtr mainPtr;
|
||
Handle menu_bar_handle;
|
||
MenuHandle apple_menu,file_menu,reg_menu,extra_menu,edit_menu,items_menu[4];
|
||
Boolean gInBackground = FALSE,play_sounds = TRUE,file_in_mem = FALSE,save_blocked = FALSE;
|
||
long start_time;
|
||
Boolean dialog_not_toast = TRUE,party_in_scen = FALSE;
|
||
|
||
// Cursors
|
||
short current_cursor = 120;
|
||
CursHandle sword_curs, boot_curs, key_curs, target_curs;
|
||
|
||
// Shareware globals
|
||
Boolean registered = FALSE,ed_reg = TRUE;
|
||
long register_flag = 0;
|
||
long ed_flag = 0,ed_key = 0,stored_key = 0;
|
||
|
||
/* Adventure globals */
|
||
party_record_type party;
|
||
pc_record_type adven[6];
|
||
outdoor_record_type outdoors[2][2];
|
||
current_town_type c_town;
|
||
big_tr_type t_d;
|
||
town_item_list t_i;
|
||
unsigned char out[96][96],out_e[96][96];
|
||
setup_save_type setup_save;
|
||
unsigned char misc_i[64][64],sfx[64][64];
|
||
unsigned char template_terrain[64][64];
|
||
stored_town_maps_type town_maps;
|
||
stored_outdoor_maps_type o_maps;
|
||
|
||
short store_flags[3];
|
||
|
||
town_record_type anim_town;
|
||
tiny_tr_type anim_t_d;
|
||
|
||
stored_items_list_type stored_items[3];
|
||
stored_town_maps_type maps;
|
||
stored_outdoor_maps_type o_maps;
|
||
|
||
|
||
/* Display globals */
|
||
Boolean sys_7_avail;
|
||
|
||
|
||
/* Prototypes */
|
||
void main(void);
|
||
void Initialize(void);
|
||
void Set_Window_Drag_Bdry();
|
||
void Handle_One_Event();
|
||
void Handle_Activate();
|
||
Boolean handle_dialog_event() ;
|
||
void Handle_Update();
|
||
void Mouse_Pressed();
|
||
void handle_menu_choice(long choice);
|
||
void handle_apple_menu(int item_hit);
|
||
void handle_file_menu(int item_hit);
|
||
void handle_reg_menu(int item_hit);
|
||
void handle_extra_menu(int item_hit);
|
||
void handle_edit_menu(int item_hit);
|
||
void update_item_menu();
|
||
void load_cursors();
|
||
void set_cursor(CursHandle which_curs);
|
||
void find_quickdraw();
|
||
void check_sys_7();
|
||
pascal OSErr handle_open_app(AppleEvent *theAppleEvent,AppleEvent *reply,long handlerRefcon);
|
||
pascal OSErr handle_open_doc(AppleEvent *theAppleEvent,AppleEvent *reply,long handlerRefcon);
|
||
pascal OSErr handle_quit(AppleEvent *theAppleEvent,AppleEvent *reply,long handlerRefcon);
|
||
Boolean verify_restore_quit(short mode);
|
||
void set_up_apple_events();
|
||
pascal Boolean cd_event_filter (DialogPtr hDlg, EventRecord *event, short *dummy_item_hit);
|
||
void set_pixel_depth();
|
||
void handle_item_menu(int item_hit);
|
||
item_record_type convert_item (short_item_record_type s_item);
|
||
|
||
// File io
|
||
short specials_res_id;
|
||
Str255 start_name;
|
||
short start_volume,data_volume;
|
||
long start_dir,data_dir;
|
||
|
||
#include "item_data.h"
|
||
|
||
//
|
||
// Main body of program Exile
|
||
//
|
||
|
||
//MW specified argument and return type.
|
||
void main(void)
|
||
{
|
||
short error;
|
||
MenuHandle cur_menu;
|
||
|
||
start_time = TickCount();
|
||
|
||
check_sys_7();
|
||
|
||
Initialize();
|
||
|
||
HGetVol((StringPtr) start_name,&start_volume,&start_dir);
|
||
error = HOpenResFile(start_volume,start_dir,"\p:Scenario Editor:Blades of Exile Graphics",1);
|
||
if (ResError() != 0) {
|
||
Alert(984,NIL);
|
||
ExitToShell();
|
||
}
|
||
error = HOpenResFile(start_volume,start_dir,"\p:Scenario Editor:Blades of Exile Sounds",1);
|
||
if (ResError() != 0) {
|
||
Alert(984,NIL);
|
||
ExitToShell();
|
||
}
|
||
init_main_buttons();
|
||
|
||
Set_up_win();
|
||
|
||
load_cursors();
|
||
|
||
find_quickdraw();
|
||
set_pixel_depth();
|
||
|
||
Set_Window_Drag_Bdry();
|
||
|
||
|
||
// init_buf();
|
||
|
||
// register_flag = get_reg_data();
|
||
load_sounds();
|
||
if (sys_7_avail == TRUE) {
|
||
set_up_apple_events();
|
||
}
|
||
|
||
menu_bar_handle = GetNewMBar(128);
|
||
if (menu_bar_handle == NIL) {
|
||
SysBeep(2);
|
||
ExitToShell();
|
||
}
|
||
SetMenuBar(menu_bar_handle);
|
||
DisposHandle(menu_bar_handle);
|
||
|
||
apple_menu = GetMHandle(500);
|
||
file_menu = GetMHandle(550);
|
||
reg_menu = GetMHandle(600);
|
||
extra_menu = GetMHandle(650);
|
||
edit_menu = GetMHandle(700);
|
||
items_menu[0] = GetMHandle(750);
|
||
items_menu[1] = GetMHandle(751);
|
||
items_menu[2] = GetMHandle(752);
|
||
items_menu[3] = GetMHandle(753);
|
||
|
||
//init_fonts();
|
||
|
||
AddResMenu(apple_menu, 'DRVR');
|
||
DrawMenuBar();
|
||
update_item_menu();
|
||
|
||
cd_init_dialogs();
|
||
|
||
Multifinder_Present = (NGetTrapAddress(_WaitNextEvent, ToolTrap) !=
|
||
NGetTrapAddress(_Unimplemented, ToolTrap));
|
||
|
||
|
||
while (All_Done == FALSE)
|
||
Handle_One_Event();
|
||
}
|
||
|
||
|
||
|
||
//
|
||
// Initialize everything for the program, make sure we can run
|
||
//
|
||
|
||
//MW specified argument and return type.
|
||
void Initialize(void)
|
||
{
|
||
|
||
OSErr error;
|
||
SysEnvRec theWorld;
|
||
|
||
//
|
||
// Test the computer to be sure we can do color.
|
||
// If not we would crash, which would be bad.
|
||
// If we can<61>t run, just beep and exit.
|
||
//
|
||
|
||
error = SysEnvirons(1, &theWorld);
|
||
if (theWorld.hasColorQD == false) {
|
||
SysBeep(50);
|
||
ExitToShell(); /* If no color QD, we must leave. */
|
||
}
|
||
|
||
/* Initialize all the needed managers. */
|
||
InitGraf(&qd.thePort);
|
||
InitFonts();
|
||
InitWindows();
|
||
InitMenus();
|
||
TEInit();
|
||
InitDialogs(nil);
|
||
InitCursor();
|
||
|
||
//
|
||
// To make the Random sequences truly random, we need to make the seed start
|
||
// at a different number. An easy way to do this is to put the current time
|
||
// and date into the seed. Since it is always incrementing the starting seed
|
||
// will always be different. Don<6F>t for each call of Random, or the sequence
|
||
// will no longer be random. Only needed once, here in the init.
|
||
//
|
||
GetDateTime((unsigned long*) &qd.randSeed);
|
||
|
||
//
|
||
// Make a new window for drawing in, and it must be a color window.
|
||
// The window is full screen size, made smaller to make it more visible.
|
||
//
|
||
windRect = qd.screenBits.bounds;
|
||
InsetRect(&windRect, 63, 34);
|
||
windRect.top = windRect.top + 15;
|
||
windRect.bottom = windRect.bottom + 15;
|
||
|
||
// mainPtr = NewCWindow(nil, &windRect, "\pExile", true, zoomDocProc,
|
||
// (WindowPtr) -1, false, 0);
|
||
mainPtr = GetNewCWindow(128,NIL,IN_FRONT);
|
||
// DrawGrowIcon(mainPtr);
|
||
SetPort(mainPtr); /* set window to current graf port */
|
||
/*stored_key = open_pref_file();
|
||
if (stored_key == -100) {
|
||
stored_key = open_pref_file();
|
||
if (stored_key == -100) {
|
||
Alert(983,NIL);
|
||
ExitToShell();
|
||
}
|
||
}*/
|
||
}
|
||
|
||
void Set_Window_Drag_Bdry()
|
||
{
|
||
Drag_Rect = qd.screenBits.bounds;
|
||
// Drag_Rect = (**(GrayRgn)).rgnBBox;
|
||
Drag_Rect.left += DRAG_EDGE;
|
||
Drag_Rect.right -= DRAG_EDGE;
|
||
Drag_Rect.bottom -= DRAG_EDGE;
|
||
}
|
||
|
||
void Handle_One_Event()
|
||
{
|
||
short chr,chr2;
|
||
long menu_choice,cur_time;
|
||
Boolean event_in_dialog = FALSE;
|
||
GrafPtr old_port;
|
||
|
||
//ed_reg = FALSE;
|
||
|
||
if (Multifinder_Present == TRUE) {
|
||
WaitNextEvent(everyEvent, &event, SLEEP_TICKS, MOUSE_REGION);
|
||
cur_time = TickCount();
|
||
|
||
GetPort(&old_port);
|
||
}
|
||
else
|
||
{
|
||
// through_sending();
|
||
SystemTask();
|
||
GetNextEvent( everyEvent, &event);
|
||
}
|
||
|
||
init_main_buttons();
|
||
|
||
switch (event.what)
|
||
{
|
||
case keyDown: case autoKey:
|
||
chr = event.message & charCodeMask;
|
||
chr2 = (char) ((event.message & keyCodeMask) >> 8);
|
||
if ((event.modifiers & cmdKey) != 0) {
|
||
if (event.what != autoKey) {
|
||
BringToFront(mainPtr);
|
||
SetPort(mainPtr);
|
||
menu_choice = MenuKey(chr);
|
||
handle_menu_choice(menu_choice);
|
||
}
|
||
}
|
||
// else
|
||
// handle_keystroke(chr,chr2,event);
|
||
|
||
break;
|
||
|
||
case mouseDown:
|
||
Mouse_Pressed();
|
||
break;
|
||
|
||
case activateEvt:
|
||
Handle_Activate();
|
||
break;
|
||
|
||
case updateEvt:
|
||
set_pixel_depth();
|
||
Handle_Update();
|
||
break;
|
||
|
||
case kHighLevelEvent:
|
||
AEProcessAppleEvent(&event);
|
||
break;
|
||
|
||
case osEvt:
|
||
/* 1.02 - must BitAND with 0x0FF to get only low byte */
|
||
switch ((event.message >> 24) & 0x0FF) { /* high byte of message */
|
||
case suspendResumeMessage: /* suspend/resume is also an activate/deactivate */
|
||
gInBackground = (event.message & 1) == 0; // 1 is Resume Mask
|
||
// DoActivate(FrontWindow(), !gInBackground);
|
||
// current_cursor = 300;
|
||
break;
|
||
}
|
||
break;
|
||
}
|
||
}
|
||
|
||
|
||
void Handle_Activate()
|
||
{
|
||
GrafPtr old_port;
|
||
|
||
GetPort(&old_port);
|
||
if (FrontWindow() == mainPtr)
|
||
SetPort(mainPtr);
|
||
set_cursor(sword_curs);
|
||
}
|
||
|
||
|
||
void Handle_Update()
|
||
{
|
||
WindowPtr the_window;
|
||
GrafPtr old_port;
|
||
|
||
the_window = (WindowPtr) event.message;
|
||
|
||
GetPort (&old_port);
|
||
SetPort (the_window);
|
||
|
||
BeginUpdate(the_window);
|
||
|
||
redraw_screen();
|
||
|
||
EndUpdate(the_window);
|
||
|
||
SetPort(old_port);
|
||
}
|
||
|
||
|
||
void Mouse_Pressed()
|
||
{
|
||
WindowPtr the_window;
|
||
short the_part,choice,i;
|
||
long menu_choice;
|
||
Boolean try_to_end;
|
||
|
||
the_part = FindWindow( event.where, &the_window);
|
||
|
||
switch (the_part)
|
||
{
|
||
|
||
case inMenuBar:
|
||
menu_choice = MenuSelect(event.where);
|
||
handle_menu_choice(menu_choice);
|
||
break;
|
||
|
||
case inSysWindow:
|
||
break;
|
||
|
||
case inDrag:
|
||
DragWindow(the_window, event.where, &qd.screenBits.bounds);
|
||
break;
|
||
|
||
case inGoAway:
|
||
if (the_window == mainPtr) {
|
||
|
||
All_Done = verify_restore_quit(0);
|
||
}
|
||
else {
|
||
/* for (i = 0; i < 12; i++)
|
||
if ((the_window == modeless_dialogs[i]) && (modeless_exists[i] == TRUE)) {
|
||
CloseDialog(modeless_dialogs[i]);
|
||
modeless_exists[i] = FALSE;
|
||
SelectWindow(mainPtr);
|
||
SetPort(mainPtr);
|
||
}*/
|
||
}
|
||
break;
|
||
|
||
case inContent:
|
||
if ((the_window != NIL) && (FrontWindow() != the_window)) {
|
||
SetPort(the_window);
|
||
SelectWindow(the_window);
|
||
SetPort(the_window);
|
||
}
|
||
else
|
||
if (the_window == mainPtr) {
|
||
try_to_end = handle_action(event,0);
|
||
if (try_to_end == TRUE)
|
||
All_Done = verify_restore_quit(0);
|
||
}
|
||
break;
|
||
}
|
||
}
|
||
|
||
|
||
void handle_menu_choice(long choice)
|
||
{
|
||
int menu,menu_item;
|
||
|
||
if (choice != 0) {
|
||
menu = HiWord(choice);
|
||
menu_item = LoWord(choice);
|
||
|
||
switch (menu) {
|
||
case 500:
|
||
handle_apple_menu(menu_item);
|
||
break;
|
||
case 550:
|
||
handle_file_menu(menu_item);
|
||
break;
|
||
case 650:
|
||
handle_extra_menu(menu_item);
|
||
break;
|
||
case 700:
|
||
handle_edit_menu(menu_item);
|
||
break;
|
||
case 750: case 751:case 752:case 753:
|
||
handle_item_menu(menu_item + 94 * (menu - 750) - 1);
|
||
break;
|
||
}
|
||
}
|
||
|
||
HiliteMenu(0);
|
||
}
|
||
|
||
void handle_apple_menu(int item_hit)
|
||
{
|
||
Str255 desk_acc_name;
|
||
short desk_acc_num;
|
||
|
||
switch (item_hit) {
|
||
case 1:
|
||
FCD(1062,0);
|
||
break;
|
||
default:
|
||
GetItem (apple_menu,item_hit,desk_acc_name);
|
||
desk_acc_num = OpenDeskAcc(desk_acc_name);
|
||
break;
|
||
}
|
||
}
|
||
|
||
void handle_file_menu(int item_hit)
|
||
{
|
||
short choice;
|
||
|
||
switch (item_hit) {
|
||
case 1:
|
||
save_file(0);
|
||
break;
|
||
case 2:
|
||
if (verify_restore_quit(1) == TRUE)
|
||
load_file();
|
||
break;
|
||
case 4:
|
||
give_reg_info();
|
||
break;
|
||
case 6:
|
||
All_Done = verify_restore_quit(0);
|
||
break;
|
||
}
|
||
}
|
||
|
||
|
||
|
||
void handle_extra_menu(int item_hit)
|
||
{
|
||
short i,j,choice;
|
||
boat_record_type v_boat = {{12,17},{0,0},{0,0},80,TRUE,FALSE};
|
||
|
||
if (file_in_mem == FALSE) {
|
||
display_strings(20,5,0,0,"Editing party",57,707,0);
|
||
return;
|
||
}
|
||
switch(item_hit) {
|
||
case 1:
|
||
edit_gold_or_food(0);
|
||
redraw_screen();
|
||
|
||
break;
|
||
case 2:
|
||
edit_gold_or_food(1);
|
||
redraw_screen();
|
||
|
||
break;
|
||
|
||
case 4:
|
||
if (party.stuff_done[304][0] > 0) {
|
||
FCD(909,0);
|
||
break;
|
||
}
|
||
FCD(901,0);
|
||
leave_town();
|
||
break;
|
||
|
||
case 5:
|
||
if (party.stuff_done[304][0] == 0) {
|
||
FCD(911,0);
|
||
break;
|
||
}
|
||
FCD(910,0);
|
||
c_town.p_loc.x = party.stuff_done[304][1];
|
||
c_town.p_loc.y = party.stuff_done[304][2];
|
||
party.stuff_done[304][0] = 0;
|
||
for (i = 0; i < 6; i++)
|
||
if (adven[i].main_status >= 10)
|
||
adven[i].main_status -= 10;
|
||
redraw_screen();
|
||
break;
|
||
|
||
|
||
case 6:
|
||
display_strings(20,20,0,0,"Editing party",57,707,0);
|
||
for (i = 0; i < 4; i++)
|
||
party.creature_save[i].which_town = 200;
|
||
break;
|
||
case 8: // damage
|
||
display_strings(20,1,0,0,"Editing party",57,715,0);
|
||
for (i = 0; i < 6; i++)
|
||
adven[i].cur_health = adven[i].max_health;
|
||
break;
|
||
case 9: // spell pts
|
||
display_strings(20,2,0,0,"Editing party",57,715,0);
|
||
for (i = 0; i < 6; i++)
|
||
adven[i].cur_sp = adven[i].max_sp;
|
||
break;
|
||
case 10: // raise dead
|
||
display_strings(20,3,0,0,"Editing party",57,715,0);
|
||
for (i = 0; i < 6; i++)
|
||
if ((adven[i].main_status == 2) || (adven[i].main_status == 3) ||
|
||
(adven[i].main_status == 4))
|
||
adven[i].main_status = 1;
|
||
break;
|
||
case 11: // conditions
|
||
display_strings(20,4,0,0,"Editing party",57,715,0);
|
||
for (i = 0; i < 6; i++) {
|
||
adven[i].status[2] = 0;
|
||
if (adven[i].status[3] < 0)
|
||
adven[i].status[3] = 0;
|
||
adven[i].status[6] = 0;
|
||
adven[i].status[7] = 0;
|
||
adven[i].status[9] = 0;
|
||
adven[i].status[11] = 0;
|
||
adven[i].status[12] = 0;
|
||
adven[i].status[13] = 0;
|
||
}
|
||
break;
|
||
|
||
case 13:
|
||
if (party_in_scen == FALSE) {
|
||
display_strings(20,25,0,0,"Editing party",57,715,0);
|
||
break;
|
||
}
|
||
if (FCD(912,0) != 1)
|
||
break;
|
||
remove_party_from_scen();
|
||
party.stuff_done[304][0] = 0;
|
||
redraw_screen();
|
||
break;
|
||
}
|
||
display_party(6,0);
|
||
}
|
||
|
||
void handle_edit_menu(int item_hit)
|
||
{
|
||
short choice,i,j,k;
|
||
|
||
if (file_in_mem == FALSE) {
|
||
display_strings(20,5,0,0,"Editing party",57,707,0);
|
||
return;
|
||
}
|
||
if ((ed_reg == FALSE) && (save_blocked == FALSE))
|
||
if ((choice = FCD(904,0)) == 1)
|
||
return;
|
||
else save_blocked = TRUE;
|
||
switch(item_hit) {
|
||
case 1:
|
||
display_alchemy();
|
||
break;
|
||
case 2: // all property
|
||
display_strings(20,6,0,0,"Editing party",57,707,0);
|
||
for (i = 0; i < 30; i++) {
|
||
party.boats[i].property = FALSE;
|
||
party.horses[i].property = FALSE;
|
||
}
|
||
break;
|
||
case 4: // edit day
|
||
edit_day();
|
||
break;
|
||
case 6: // ouit maps
|
||
if (party_in_scen == FALSE) {
|
||
display_strings(20,25,0,0,"Editing party",57,715,0);
|
||
break;
|
||
}
|
||
display_strings(20,13,0,0,"Editing party",57,715,0);
|
||
for (i = 0; i < 100; i++)
|
||
for (j = 0; j < 6; j++)
|
||
for (k = 0; k < 48; k++)
|
||
o_maps.outdoor_maps[i][j][k] = 255;
|
||
break;
|
||
case 7: // town maps
|
||
if (party_in_scen == FALSE) {
|
||
display_strings(20,25,0,0,"Editing party",57,715,0);
|
||
break;
|
||
}
|
||
display_strings(20,14,0,0,"Editing party",57,715,0);
|
||
for (i = 0; i < 200; i++)
|
||
for (j = 0; j < 8; j++)
|
||
for (k = 0; k < 64; k++)
|
||
town_maps.town_maps[i][j][k] = 255;
|
||
break;
|
||
case 9:
|
||
display_pc(current_active_pc,0,0);
|
||
break;
|
||
case 10:
|
||
display_pc(current_active_pc,1,0);
|
||
break;
|
||
case 11:
|
||
pick_race_abil(&adven[current_active_pc],0,0);
|
||
break;
|
||
case 12:
|
||
spend_xp(current_active_pc,1,0);
|
||
break;
|
||
case 13:
|
||
edit_xp(&adven[current_active_pc]);
|
||
break;
|
||
}
|
||
}
|
||
|
||
item_record_type convert_item (short_item_record_type s_item) {
|
||
item_record_type i;
|
||
location l = {0,0};
|
||
short temp_val;
|
||
|
||
i.variety = (short) s_item.variety;
|
||
i.item_level = (short) s_item.item_level;
|
||
i.awkward = (short) s_item.awkward;
|
||
i.bonus = (short) s_item.bonus;
|
||
i.protection = (short) s_item.protection;
|
||
i.charges = (short) s_item.charges;
|
||
i.type = (short) s_item.type;
|
||
i.graphic_num = (short) s_item.graphic_num;
|
||
if (i.graphic_num >= 25)
|
||
i.graphic_num += 20;
|
||
i.ability = (short) s_item.real_abil;
|
||
i.type_flag = (short) s_item.type_flag;
|
||
i.is_special = (short) s_item.is_special;
|
||
i.value = (short) s_item.value;
|
||
i.weight = s_item.weight;
|
||
i.special_class = 0;
|
||
i.item_loc = l;
|
||
strcpy((char *)i.full_name,(char *)s_item.full_name);
|
||
strcpy((char *)i.name,(char *)s_item.name);
|
||
|
||
if (i.charges > 0)
|
||
temp_val = i.value * i.charges;
|
||
else temp_val = i.value;
|
||
if (temp_val >= 15)
|
||
i.treas_class = 1;
|
||
if (temp_val >= 100)
|
||
i.treas_class = 2;
|
||
if (temp_val >= 900)
|
||
i.treas_class = 3;
|
||
if (temp_val >= 2400)
|
||
i.treas_class = 4;
|
||
|
||
i.magic_use_type = s_item.magic_use_type;
|
||
i.ability_strength = s_item.ability_strength;
|
||
i.reserved1 = 0;
|
||
i.reserved2 = 0;
|
||
i.item_properties = 0;
|
||
if (s_item.identified == TRUE)
|
||
i.item_properties = i.item_properties | 1;
|
||
if ((s_item.ability == 14) || (s_item.ability == 129) || (s_item.ability == 95))
|
||
i.item_properties = i.item_properties | 16;
|
||
if (s_item.magic == TRUE)
|
||
i.item_properties = i.item_properties | 4;
|
||
|
||
return i;
|
||
}
|
||
|
||
void handle_item_menu(int item_hit)
|
||
{
|
||
short choice;
|
||
item_record_type store_i;
|
||
|
||
if (file_in_mem == FALSE) {
|
||
display_strings(20,5,0,0,"Editing party",57,707,0);
|
||
return;
|
||
}
|
||
if ((ed_reg == FALSE) && (save_blocked == FALSE))
|
||
if ((choice = FCD(904,0)) == 1)
|
||
return;
|
||
else save_blocked = TRUE;
|
||
store_i = convert_item(item_list[item_hit]);
|
||
store_i.item_properties = store_i.item_properties | 1;
|
||
give_to_pc(current_active_pc,store_i,FALSE);
|
||
draw_items(1);
|
||
}
|
||
|
||
void update_item_menu()
|
||
{
|
||
short i,j;
|
||
MenuHandle item_menu[4];
|
||
Str255 item_name;
|
||
|
||
for (i = 0; i < 4; i++)
|
||
item_menu[i] = GetMHandle(750 + i);
|
||
for (j = 0; j < 4; j++)
|
||
for (i = 0; i < 94; i++) {
|
||
sprintf((char *) item_name, " %s",item_list[i + j * 94].full_name);
|
||
c2pstr((char *) item_name);
|
||
AppendMenu(item_menu[j],item_name);
|
||
}
|
||
|
||
}
|
||
|
||
void load_cursors()
|
||
{
|
||
short i,j;
|
||
|
||
sword_curs = GetCursor(120);
|
||
|
||
boot_curs = GetCursor(121);
|
||
key_curs = GetCursor(122);
|
||
target_curs = GetCursor(124);
|
||
|
||
set_cursor(sword_curs);
|
||
}
|
||
|
||
void set_cursor(CursHandle which_curs)
|
||
{
|
||
HLock ((Handle) which_curs);
|
||
SetCursor (*which_curs);
|
||
HUnlock((Handle) which_curs);
|
||
}
|
||
|
||
void find_quickdraw() {
|
||
OSErr err;
|
||
long response;
|
||
short choice;
|
||
|
||
err = Gestalt(gestaltQuickdrawVersion, &response);
|
||
if (err == noErr) {
|
||
if (response == 0x000) {
|
||
choice = choice_dialog(0,1070);
|
||
if (choice == 2)
|
||
ExitToShell();
|
||
else diff_depth_ok = TRUE;
|
||
}
|
||
}
|
||
else {
|
||
SysBeep(2);
|
||
ExitToShell();
|
||
}
|
||
}
|
||
|
||
void set_pixel_depth() {
|
||
GDHandle cur_device;
|
||
PixMapHandle screen_pixmap_handle;
|
||
short pixel_depth;
|
||
OSErr err;
|
||
short choice;
|
||
|
||
cur_device = GetGDevice();
|
||
|
||
if ((HasDepth(cur_device,8,1,1)) == 0) {
|
||
choice_dialog(0,1070);
|
||
ExitToShell();
|
||
}
|
||
|
||
screen_pixmap_handle = (**(cur_device)).gdPMap;
|
||
pixel_depth = (**(screen_pixmap_handle)).pixelSize;
|
||
|
||
if ((pixel_depth <= 8) && (diff_depth_ok == TRUE))
|
||
return;
|
||
|
||
if (pixel_depth != 8) {
|
||
choice = choice_dialog(0,1071);
|
||
if (choice == 3)
|
||
diff_depth_ok = TRUE;
|
||
if (choice == 2)
|
||
ExitToShell();
|
||
if (choice == 1) {
|
||
err = SetDepth(cur_device,8,1,1);
|
||
if (err != noErr)
|
||
ExitToShell();
|
||
}
|
||
}
|
||
}
|
||
|
||
|
||
void check_sys_7()
|
||
{
|
||
OSErr err;
|
||
long response;
|
||
|
||
err = Gestalt(gestaltSystemVersion, &response);
|
||
if ((err == noErr) && (response >= 0x0700))
|
||
sys_7_avail = TRUE;
|
||
else sys_7_avail = FALSE;
|
||
}
|
||
|
||
pascal OSErr handle_open_app(AppleEvent *theAppleEvent,AppleEvent *reply,long handlerRefcon)
|
||
{
|
||
return noErr;
|
||
}
|
||
|
||
pascal OSErr handle_open_doc(AppleEvent *theAppleEvent,AppleEvent *reply,long handlerRefcon)
|
||
{
|
||
FSSpec myFSS;
|
||
AEDescList docList;
|
||
OSErr myErr, ignoreErr;
|
||
long index, itemsInList;
|
||
Size actualSize;
|
||
AEKeyword keywd;
|
||
DescType returnedType;
|
||
|
||
/* myErr = AEGetParamDesc(theAppleEvent,keyDirectObject, typeAEList, &docList);
|
||
if (myErr == noErr) {
|
||
myErr == AECountItems(&docList,&itemsInList);
|
||
if (myErr == noErr) {
|
||
myErr = AEGetNthPtr(&docList,1,typeFSS,
|
||
&keywd,&returnedType,&myFSS,
|
||
sizeof(myFSS),&actualSize);
|
||
if (myErr == noErr) {
|
||
do_apple_event_open(myFSS);
|
||
if ((in_startup_mode == FALSE) && (startup_loaded == TRUE))
|
||
end_startup();
|
||
if (in_startup_mode == FALSE) {
|
||
post_load();
|
||
}
|
||
}
|
||
}
|
||
}*/
|
||
|
||
|
||
return noErr;
|
||
}
|
||
|
||
pascal OSErr handle_quit(AppleEvent *theAppleEvent,AppleEvent *reply,long handlerRefcon)
|
||
{
|
||
short choice;
|
||
|
||
All_Done = verify_restore_quit(0);
|
||
return noErr;
|
||
}
|
||
|
||
Boolean verify_restore_quit(short mode)
|
||
//short mode; // 0 - quit 1- restore
|
||
{
|
||
short choice;
|
||
|
||
if (file_in_mem == FALSE)
|
||
return TRUE;
|
||
choice = FCD(1066 + mode,0);
|
||
if (choice == 3)
|
||
return FALSE;
|
||
if (choice == 2)
|
||
return TRUE;
|
||
save_file(0);
|
||
return TRUE;
|
||
}
|
||
|
||
void set_up_apple_events()
|
||
{
|
||
OSErr myErr;
|
||
|
||
myErr = AEInstallEventHandler(kCoreEventClass,kAEOpenApplication,
|
||
(AEEventHandlerProcPtr) handle_open_app, 0, FALSE);
|
||
|
||
if (myErr != noErr)
|
||
SysBeep(2);
|
||
|
||
myErr = AEInstallEventHandler(kCoreEventClass,kAEOpenDocuments,
|
||
(AEEventHandlerProcPtr) handle_open_doc, 0, FALSE);
|
||
|
||
if (myErr != noErr)
|
||
SysBeep(2);
|
||
|
||
myErr = AEInstallEventHandler(kCoreEventClass,kAEQuitApplication,
|
||
(AEEventHandlerProcPtr) handle_quit, 0, FALSE);
|
||
|
||
if (myErr != noErr)
|
||
SysBeep(2);
|
||
}
|
||
|
||
|
||
pascal Boolean cd_event_filter (DialogPtr hDlg, EventRecord *event, short *dummy_item_hit)
|
||
{
|
||
char chr,chr2;
|
||
short the_type,wind_hit,item_hit;
|
||
Handle the_handle = NULL;
|
||
Rect the_rect,button_rect;
|
||
Point the_point;
|
||
CWindowPeek w;
|
||
|
||
dummy_item_hit = 0;
|
||
|
||
|
||
switch (event->what) {
|
||
case updateEvt:
|
||
w = (CWindowPeek) hDlg;
|
||
if (EmptyRgn(w->updateRgn) == TRUE) {
|
||
return TRUE;
|
||
}
|
||
BeginUpdate(hDlg);
|
||
cd_redraw(hDlg);
|
||
EndUpdate(hDlg);
|
||
DrawDialog(hDlg);
|
||
return TRUE;
|
||
break;
|
||
|
||
case keyDown:
|
||
chr = event->message & charCodeMask;
|
||
chr2 = (char) ((event->message & keyCodeMask) >> 8);
|
||
switch (chr2) {
|
||
case 126: chr = 22; break;
|
||
case 124: chr = 21; break;
|
||
case 123: chr = 20; break;
|
||
case 125: chr = 23; break;
|
||
case 53: chr = 24; break;
|
||
case 36: chr = 31; break;
|
||
case 76: chr = 31; break;
|
||
}
|
||
// specials ... 20 - <- 21 - -> 22 up 23 down 24 esc
|
||
// 25-30 ctrl 1-6 31 - return
|
||
|
||
wind_hit = cd_process_keystroke(hDlg,chr,&item_hit);
|
||
break;
|
||
|
||
case mouseDown:
|
||
the_point = event->where;
|
||
GlobalToLocal(&the_point);
|
||
wind_hit = cd_process_click(hDlg,the_point, event->modifiers,&item_hit);
|
||
break;
|
||
|
||
default: wind_hit = -1; break;
|
||
}
|
||
switch (wind_hit) {
|
||
case -1: break;
|
||
|
||
case 917: edit_day_event_filter(item_hit); break;
|
||
case 970: case 971: case 972: case 973: display_strings_event_filter(item_hit); break;
|
||
case 991: display_pc_event_filter(item_hit); break;
|
||
case 996: display_alchemy_event_filter(item_hit); break;
|
||
case 1010: spend_xp_event_filter (item_hit); break;
|
||
case 1012: case 947: edit_gold_or_food_event_filter (item_hit); break;
|
||
case 1013: pick_race_abil_event_filter (item_hit); break;
|
||
case 1018: select_pc_event_filter (item_hit); break;
|
||
case 1024: edit_xp_event_filter (item_hit); break;
|
||
case 1073: give_reg_info_event_filter (item_hit); break;
|
||
default: fancy_choice_dialog_event_filter (item_hit); break;
|
||
}
|
||
|
||
if (wind_hit == -1)
|
||
return FALSE;
|
||
else return TRUE;
|
||
}
|
||
|