Files
oboe/osx/pcedit/pc.editors.cpp
Celtic Minstrel b02902770c Well, at present the Windows code for the actual game almost compiles. The current goal is to undo all the things that Ormus did to make this job difficult.
Basically, remove as many as possible of the dependencies of the source files in the tools and classes folders on source files not in those folders.
(With the exception that files in the classes folder may depend on files in the tools folder.)

In this commit, several changes were made.
- Project file modified, may need further modification.
- Many files renamed to match the Mac version.
- #include statements for system headers changed to use <> instead of "" (some already did, but many didn't).
- xxx.h headers replaced with cxxx headers where appropriate.
- Most sound-related variables moved from globvars.cpp to soundvars.cpp.
- The files originally named graphutil and gutils have been merged.
- Changed TRUE/FALSE to true/false.
- Changed exlsound to soundtool and mostly removed dependencies on the main game files; the exception is that it still uses mainPtr (which probably can't be helped)
  and print_nums (which should probably be incorporated into the MessageBox string).
- Possibly other things that were forgotten.

For some reason this commit also includes changes recently committed into the branch for osx.

git-svn-id: http://openexile.googlecode.com/svn/trunk@121 4ebdad44-0ea0-11de-aab3-ff745001d230
2009-08-03 19:00:23 +00:00

398 lines
9.0 KiB
C++

#include <Carbon/Carbon.h>
#include "pc.graphics.h"
#include "pc.global.h"
#include "classes.h"
#include "pc.editors.h"
#include "graphtool.h"
#include "dlgtool.h"
/* Adventure globals */
//extern party_record_type party;
//extern outdoor_record_type outdoors[2][2];
//extern current_town_type c_town;
//extern big_tr_type t_d;
//extern town_item_list t_i;
//extern unsigned char out[96][96],out_e[96][96];
//extern setup_save_type setup_save;
//extern stored_items_list_type stored_items[3];
extern cUniverse univ;
extern short dialog_answer;
extern short store_flags[3];
extern short current_active_pc;
extern WindowPtr mainPtr;
extern Rect d_rects[80];
extern short d_rect_index[80];
extern bool modeless_exists[12],diff_depth_ok,current_file_has_maps;
extern short modeless_key[12];
extern DialogPtr modeless_dialogs[12];
bool equippable[18] = {false,true,true,false,true,true,true,false,false,true,true,true,
true,true,true,false,false,true};
short num_hands_to_use[18] = {0,1,2,0,1,1,1,0,0,1,1,0,0,0,0,0,0,0};
short num_that_can_equip[18] = {0,2,1,0,1,1,1,0,0,2,1,1,1,2,1,0,0,1};
short selected,item_max = 0;
bool choice_active[6];
extern short store_trait_mode;
cPlayer *store_pc;
GWorldPtr button_num_gworld;
void combine_things(short pc_num)
{
short i,j,test;
for (i = 0; i < 24; i++) {
if ((univ.party[pc_num].items[i].variety > 0) &&
(univ.party[pc_num].items[i].type_flag > 0) && (univ.party[pc_num].items[i].ident)) {
for (j = i + 1; j < 24; j++)
if ((univ.party[pc_num].items[j].variety > 0) &&
(univ.party[pc_num].items[j].type_flag == univ.party[pc_num].items[i].type_flag)
&& (univ.party[pc_num].items[j].ident)) {
add_string_to_buf("(items combined)");
test = (short) (univ.party[pc_num].items[i].charges) + (short) (univ.party[pc_num].items[j].charges);
if (test > 125) {
univ.party[pc_num].items[i].charges = 125;
ASB("Can have at most 125 of any item.");
}
else univ.party[pc_num].items[i].charges += univ.party[pc_num].items[j].charges;
if (univ.party[pc_num].equip[j] == true) {
univ.party[pc_num].equip[i] = true;
univ.party[pc_num].equip[j] = false;
}
take_item(pc_num,j);
}
}
if ((univ.party[pc_num].items[i].variety > 0) && (univ.party[pc_num].items[i].charges < 0))
univ.party[pc_num].items[i].charges = 1;
}
}
bool give_to_pc(short pc_num,cItemRec item, short print_result)
{
short free_space;
if (item.variety == 0)
return true;
if (((free_space = pc_has_space(pc_num)) == 24 ) || (univ.party[pc_num].main_status != 1))
return false;
else {
univ.party[pc_num].items[free_space] = item;
combine_things(pc_num);
return true;
}
return false;
}
bool give_to_party(cItemRec item,short print_result)
{
short i = 0;
while (i < 6) {
if (give_to_pc(i,item,print_result) == true)
return true;
i++;
}
return false;
}
void give_gold(short amount,bool print_result)
{
univ.party.gold = univ.party.gold + amount;
}
bool take_gold(short amount,bool print_result)
{
if (univ.party.gold < amount)
return false;
univ.party.gold = univ.party.gold - amount;
return true;
}
short pc_has_space(short pc_num)
{
short i = 0;
while (i < 24) {
if (univ.party[pc_num].items[i].variety == 0)
return i;
i++;
}
return 24;
}
void take_item(short pc_num,short which_item)
//short pc_num,which_item; // if which_item > 20, don't update stat win, item is which_item - 20
{
short i;
if ((univ.party[pc_num].weap_poisoned == which_item) && (univ.party[pc_num].status[0] > 0)) {
// add_string_to_buf(" Poison lost. ");
univ.party[pc_num].status[0] = 0;
}
if ((univ.party[pc_num].weap_poisoned > which_item) && (univ.party[pc_num].status[0] > 0))
univ.party[pc_num].weap_poisoned--;
for (i = which_item; i < 23; i++) {
univ.party[pc_num].items[i] = univ.party[pc_num].items[i + 1];
univ.party[pc_num].equip[i] = univ.party[pc_num].equip[i + 1];
}
univ.party[pc_num].items[23].variety = ITEM_TYPE_NO_ITEM;
univ.party[pc_num].equip[23] = false;
}
//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;
// Str255 temp_str;
//
// 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,0);
//
// i = dialog_answer;
// dialog_answer = store_dialog_answer;
//
// return i;
//}
void select_pc_event_filter (short item_hit)
{
toast_dialog();
if (item_hit == 16)
dialog_answer = 6;
else dialog_answer = item_hit - 3;
}
short char_select_pc(short active_only,short free_inv_only,char *title)
//active_only; // 0 - no 1 - yes 2 - disarm trap
{
short item_hit,i;
make_cursor_sword();
cd_create_dialog(1018,mainPtr);
if (active_only == 2)
csit(1018,15,"Select PC to disarm trap:");
else csit( 1018,15,title);
for (i = 0; i < 6; i++) {
if ((univ.party[i].main_status == 0) ||
((active_only == true) && (univ.party[i].main_status > 1)) ||
((free_inv_only == 1) && (pc_has_space(i) == 24)) || (univ.party[i].main_status == 5)) {
cd_activate_item(1018, 3 + i, 0);
}
if (univ.party[i].main_status != 0) {
csit(1018,9 + i,univ.party[i].name.c_str());
}
else cd_activate_item(1018, 9 + i, 0);
}
item_hit = cd_run_dialog();
cd_kill_dialog(1018);
return dialog_answer;
}
short select_pc(short active_only,short free_inv_only)
//active_only; // 0 - no 1 - yes 2 - disarm trap
{
if (active_only == 2)
return char_select_pc(active_only,free_inv_only,"Trap! Who will disarm?");
else return char_select_pc(active_only,free_inv_only,"Select a character:");
}
// only used at beginning of program
short choice_dialog(short pic,short num)
{
DialogPtr select_dialog = NULL;
short item_hit;
select_dialog = GetNewDialog (num, 0, IN_FRONT);
if (select_dialog == NULL) {
SysBeep(50);
ExitToShell();
}
SetPort(GetDialogPort(select_dialog));
ShowWindow(GetDialogWindow(select_dialog));
//if (pic > 0)
// put_dialog_graphic(pic,0,the_rect);
ModalDialog(NULL, &item_hit);
DisposeDialog(select_dialog);
// SetPort(GetWindowPort(mainPtr));
// BeginUpdate(mainPtr);
// if (in_startup_mode == false)
// refresh_screen(0);
// else draw_startup(0);
// EndUpdate(mainPtr);
return item_hit;
}
short party_total_level()
{
short i,j = 0;
for (i = 0; i < 6; i++)
if (univ.party[i].main_status == 1)
j += univ.party[i].level;
return j;
}
short luck_total()
{
short i = 0;
for (i = 0; i < 6; i++)
if (univ.party[i].main_status == 1)
i += univ.party[i].skills[18];
return i;
}
void display_traits_graphics()
{
short i,store;
for (i = 0; i < 3; i++) {
cd_set_led(1013,4 + i,(store_pc->race == i) ? 1 : 0);
}
for (i = 0; i < 10; i++) {
cd_set_led(1013,7 + i,(store_pc->traits[i] > 0) ? 1 : 0);
}
for (i = 0; i < 5; i++) {
cd_set_led(1013,36 + i,(store_pc->traits[10 + i] > 0) ? 1 : 0);
}
store = store_pc->get_tnl();
cdsin(1013,18,store);
}
void pick_race_abil_event_filter(short item_hit)
{
Str255 abil_str;
cPlayer *pc;
pc = store_pc;
switch (item_hit) {
case 3:
toast_dialog();
break;
case 4: case 5: case 6:
if (store_trait_mode == 0)
pc->race = (eRace) (item_hit - 4);
display_traits_graphics();
get_str(abil_str,5,12 + item_hit);
csit(1013,19,(char *) abil_str);
break;
case 36: case 37: case 38: case 39: case 40:
if (store_trait_mode != 1)
pc->traits[item_hit - 36 + 10] = (pc->traits[item_hit - 36 + 10] == true) ? false : true;
display_traits_graphics();
get_str(abil_str,5,item_hit - 36 + 11);
csit(1013,19,(char *) abil_str);
break;
default:
if (item_hit >= 100)
return;
if (store_trait_mode != 1)
pc->traits[item_hit - 7] = (pc->traits[item_hit - 7] == true) ? false : true;
display_traits_graphics();
get_str(abil_str,5,item_hit - 6);
csit(1013,19,(char *) abil_str);
break;
}
}
void pick_race_abil(cPlayer *pc,short mode,short parent_num)
//mode; // 0 - edit 1 - just display 2 - can't change race
{
char *start_str1 = "Click on advantage button for description.";
char *start_str2 = "Click on advantage button to add/lose.";
short item_hit;
mode = 0;
store_trait_mode = mode;
store_pc = pc;
make_cursor_sword();
cd_create_dialog_parent_num(1013,parent_num);
display_traits_graphics();
if (mode == 1)
csit(1013,19,start_str1);
else csit(1013,19,start_str2);
item_hit = cd_run_dialog();
cd_kill_dialog(1013);
untoast_dialog();
}
//short get_tnl(pc_record_type *pc)
//{
// short tnl = 100,i,store_per = 100;
// short rp[3] = {0,12,20};
// short ap[15] = {10,20,8,10,4, 6,10,7,12,15, -10,-8,-8,-20,-8};
//
// tnl = (tnl * (100 + rp[pc->race])) / 100;
// for (i = 0; i < 15; i++)
// if (pc->traits[i] == true)
// store_per = store_per + ap[i];
//
// tnl = (tnl * store_per) / 100;
//
// return tnl;
//}
//
//display_strings(20,7,0,0,"Editing party",57,707,916);