
Changelog (without any order) : 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. - Fixed the town loading behavior so that Empties won't appear in Place Town Encounters anymore. - Cleaned the ressource file (smaller executable). - Changed the "force place monster" function to preferably flush a summoned monster if flushing is needed. Also prevent a potential infinite loop if trying to force place a monster and all the 60 monsters of a town have a life flag. - Tweaked exploding arrows firing animation to be smoother (arrow fired, then explosion). - The spell usable Stinking Cloud ability was protecting against acid instead of the Protection from Acid ability. Fixed. - The Protection from Disease item ability should now works to the full extent. - Removed a check on the item graphic when deciding whether to play the"swallow" sound; now checks only for item variety. (Celtic Minstrel) - Corrected the code so that the party cannot be split again if already split. - Various messages code cleaning/fixing (Celtic Minstrel) - Removed the 50 node limit. To prevent infinite loop an interrupt sequence has been implemented (Ctrl-C). - Cave Bridges battlefield should now appears instead of basic cave floor. - Wall trims are now working. - Slowdowns due to trims drawing (animated water, ...) should be fixed now. - Scenarios in subfolders (under Scenarios/) are now found. - No more limit for the number of listed scenarios. - Clicking '?' icon on shopping and talk mode now gives help, even if in 'No instant help' mode. 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. - You can't end the scenario via a special node if the party is dead anymore (prevent saving an "all dead" party) - Added a safety check to monsters with Absorb Spells ability to prevent negative health. - Jobs dialog reimplemented (not useable for now). - 'Burma Shave' Easter Egg readded. - Debug Mode : ghost mode implemented. Classic Scenario Editor Beta 2 : - 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). - Added a Monster data dumping function (dumps all info about monsters : wandering/special enc/town monsters details ...) - Added a Specials data dumping function (dumps all info about specials : number, types, variables, ...) - Town Room/Outdoors Info rectangles are now initialized at ((-1,-1),(-1,-1)) freeing the 0 coordinate and fixing the "Rectangle X" description at (0,0) in the game. - Cleanse Rectangle SDF1 info rewritten to match actual behavior (0 leave force/fire/webs/crate/barrel, 1 cleans all). - Corrected the Do SFX Burst info text (1 - telep., 2 - elec.) - When placing an item with a custom graphic in a town, the editor will display the graphic in the upper-left corner of the space it is placed on. Fixed - If you edit a monster’s abilities and click Cancel, the ability of that monster will be removed. Fixed. - If you edit a item's ability, all previously unsaved modifications are erased. Fixed. - Disappearences of right scroll bar fixed. Chokboyz git-svn-id: http://openexile.googlecode.com/svn/trunk@104 4ebdad44-0ea0-11de-aab3-ff745001d230
1469 lines
41 KiB
C++
1469 lines
41 KiB
C++
#include <Windows.h>
|
|
#include "string.h"
|
|
#include "global.h"
|
|
#include "dlgutils.h"
|
|
#include "text.h"
|
|
#include "town.h"
|
|
#include "itemdata.h"
|
|
#include "locutils.h"
|
|
#include "fields.h"
|
|
#include "party.h"
|
|
#include "specials.h"
|
|
#include "fileio.h"
|
|
#include "graphics.h"
|
|
#include "items.h"
|
|
#include "exlsound.h"
|
|
#include "stdio.h"
|
|
#include "dlogtool.h"
|
|
#include "newgraph.h"
|
|
#include "infodlgs.h"
|
|
#include "graphutl.h"
|
|
|
|
#include "globvar.h"
|
|
|
|
#define NUM_HINTS 30
|
|
|
|
extern BOOL fry_startup;
|
|
|
|
/*
|
|
shop_type:
|
|
0 - weapon shop
|
|
1 - armor shop
|
|
2 - misc shop
|
|
3 - healer
|
|
4 - food
|
|
5-9 - magic shop
|
|
10 - mage spells
|
|
11 - priest spells
|
|
12 alchemy
|
|
*/
|
|
void start_shop_mode(short shop_type,short shop_min,short shop_max,short cost_adj,char *store_name)
|
|
{
|
|
RECT area_rect;
|
|
|
|
if (shop_max < shop_min)
|
|
shop_max = shop_min; ////
|
|
store_cost_mult = cost_adj;
|
|
if (store_cost_mult > 6)
|
|
store_cost_mult = 6;
|
|
store_shop_type = shop_type;
|
|
store_shop_min = shop_min;
|
|
store_shop_max = shop_max;
|
|
|
|
area_rect = talk_area_rect;
|
|
strcpy((char *) store_store_name,store_name);
|
|
|
|
OffsetRect(&area_rect, -1 * area_rect.left,-1 * area_rect.top);
|
|
if (talk_gworld == NULL)
|
|
talk_gworld = CreateCompatibleBitmap(main_dc,area_rect.right,area_rect.bottom);
|
|
|
|
store_pre_shop_mode = overall_mode;
|
|
overall_mode = 21;
|
|
stat_screen_mode = 1;
|
|
create_clip_region();
|
|
|
|
set_up_shop_array();
|
|
put_background();
|
|
|
|
draw_shop_graphics(0,area_rect);
|
|
|
|
put_item_screen(stat_window,0);
|
|
give_help(26,27,0);
|
|
}
|
|
|
|
void end_shop_mode()
|
|
{
|
|
RECT dummy_rect = {0,0,0,0};
|
|
|
|
ShowScrollBar(shop_sbar,SB_CTL,FALSE);
|
|
if (store_pre_shop_mode == 20) {
|
|
sprintf((char *)old_str1,"You conclude your business.");
|
|
sprintf((char *)old_str2,"");
|
|
sprintf((char *)one_back1,"You conclude your business.");
|
|
sprintf((char *)one_back2,"");
|
|
|
|
strnum1 = strnum2 = oldstrnum1 = oldstrnum2 = 0;
|
|
place_talk_str((char *)old_str1,"",0,dummy_rect);
|
|
}
|
|
else {
|
|
DeleteObject(talk_gworld);
|
|
talk_gworld = NULL;
|
|
}
|
|
|
|
overall_mode = store_pre_shop_mode;
|
|
create_clip_region();
|
|
if (overall_mode == MODE_TALK_TOWN)
|
|
overall_mode = MODE_TOWN;
|
|
if (overall_mode == MODE_TOWN) {
|
|
center = c_town.p_loc;
|
|
update_explored(center);
|
|
}
|
|
stat_screen_mode = 0;
|
|
put_item_screen(stat_window,0);
|
|
put_pc_screen();
|
|
refresh_screen(0);
|
|
}
|
|
|
|
void handle_shop_event(POINT p)
|
|
{
|
|
short i,store_what_picked;
|
|
|
|
p.x -= 5;
|
|
p.y -= 5;
|
|
|
|
if (PtInRect(&talk_help_rect,p)) {
|
|
click_shop_rect(talk_help_rect);
|
|
party.help_received[26] = 0;
|
|
give_help(226,27,0);
|
|
return;
|
|
}
|
|
if (PtInRect(&shop_done_rect, p)) {
|
|
click_shop_rect(shop_done_rect);
|
|
end_shop_mode();
|
|
return;
|
|
}
|
|
|
|
for (i = 0; i < 8; i++) {
|
|
store_what_picked = i + GetScrollPos(shop_sbar,SB_CTL);
|
|
if ((PtInRect(&shopping_rects[i][1],p)) && (store_shop_items[store_what_picked] >= 0)) {
|
|
click_shop_rect(shopping_rects[i][1]);
|
|
handle_sale(store_shop_items[store_what_picked],store_shop_costs[store_what_picked]);
|
|
}
|
|
if ((PtInRect(&shopping_rects[i][6],p)) && (store_shop_items[store_what_picked] >= 0)
|
|
&& (store_shop_type != 3) && (store_shop_type != 4)){
|
|
click_shop_rect(shopping_rects[i][6]);
|
|
handle_info_request(store_shop_items[store_what_picked]);
|
|
}
|
|
}
|
|
}
|
|
|
|
void handle_sale(short what_chosen,short cost)
|
|
{
|
|
item_record_type base_item;
|
|
short what_magic_shop,what_magic_shop_item,i;
|
|
RECT dummy_rect = {0,0,0,0};
|
|
|
|
switch (what_chosen / 100) {
|
|
case 0: case 1: case 2: case 3: case 4:
|
|
base_item = get_stored_item(what_chosen);
|
|
base_item.item_properties = base_item.item_properties | 1;
|
|
//cost = (base_item.charges == 0) ? base_item.value : base_item.value * base_item.charges;
|
|
switch (adven[current_pc].okToBuy(cost,base_item)) {
|
|
case 1: play_sound(-38); adven[current_pc].giveToPC(base_item,true); break;
|
|
case 2: ASB("Can't carry any more items."); break;
|
|
case 3: ASB("Not enough cash."); break;
|
|
case 4: ASB("Item is too heavy."); break;
|
|
case 5: ASB("You own too many of this."); break;
|
|
}
|
|
break;
|
|
case 5:
|
|
base_item = store_alchemy(what_chosen - 500);
|
|
if (party.alchemy[base_item.item_level] == TRUE)
|
|
ASB("You already know that recipe.");
|
|
else if (party.takeGold(cost, false) == false)
|
|
ASB("Not enough gold.");
|
|
else {
|
|
play_sound(62);
|
|
ASB("You buy an alchemical recipe.");
|
|
party.alchemy[base_item.item_level] = TRUE;
|
|
}
|
|
break;
|
|
case 7:
|
|
what_chosen -= 700;
|
|
if (party.takeGold(cost, false) == false)
|
|
ASB("Not enough gold.");
|
|
else {
|
|
ASB("You pay the healer.");
|
|
play_sound(68);
|
|
switch (what_chosen) {
|
|
case 0:
|
|
adven[current_pc].cur_health = adven[current_pc].max_health;
|
|
break;
|
|
case 1:
|
|
adven[current_pc].status[2] = 0;
|
|
break;
|
|
case 2:
|
|
adven[current_pc].status[7] = 0; break;
|
|
case 3:
|
|
adven[current_pc].status[12] = 0; break;
|
|
case 4:
|
|
for (i = 0; i < 24; i++)
|
|
if ((adven[current_pc].equip[i] == TRUE) &&
|
|
(adven[current_pc].items[i].isCursed()))
|
|
adven[current_pc].items[i].item_properties =
|
|
adven[current_pc].items[i].item_properties & 239;
|
|
break;
|
|
case 5: case 6: case 7:
|
|
adven[current_pc].main_status = MAIN_STATUS_ALIVE; break;
|
|
case 8:
|
|
adven[current_pc].status[9] = 0; break;
|
|
}
|
|
}
|
|
break;
|
|
case 8:
|
|
base_item = store_mage_spells(what_chosen - 800 - 30);
|
|
if ((base_item.item_level < 0) || (base_item.item_level > 61)) {
|
|
MessageBeep(MB_OK); ASB("Error 102: Report this!"); break;}
|
|
if (adven[current_pc].mage_spells[base_item.item_level] == TRUE)
|
|
ASB("You already have this spell.");
|
|
else if (party.takeGold(cost, false) == false)
|
|
ASB("Not enough gold.");
|
|
else {
|
|
play_sound(62);
|
|
ASB("You buy a spell.");
|
|
adven[current_pc].mage_spells[base_item.item_level] = TRUE;
|
|
give_help(41,0,0);
|
|
}
|
|
break;
|
|
case 9:
|
|
base_item = store_priest_spells(what_chosen - 900 - 30);
|
|
if ((base_item.item_level < 0) || (base_item.item_level > 61)) {
|
|
MessageBeep(MB_OK); ASB("Error 101: Report this!"); break;}
|
|
if (adven[current_pc].priest_spells[base_item.item_level] == TRUE)
|
|
ASB("You already have this spell.");
|
|
else if (party.takeGold(cost, false) == false)
|
|
ASB("Not enough gold.");
|
|
else {
|
|
play_sound(62);
|
|
ASB("You buy a spell.");
|
|
adven[current_pc].priest_spells[base_item.item_level] = TRUE;
|
|
give_help(41,0,0);
|
|
}
|
|
break;
|
|
default:
|
|
what_magic_shop = (what_chosen / 1000) - 1;
|
|
what_magic_shop_item = what_chosen % 1000;
|
|
base_item = party.magic_store_items[what_magic_shop][what_magic_shop_item];
|
|
base_item.item_properties = base_item.item_properties | 1;
|
|
switch (adven[current_pc].okToBuy(cost,base_item)) {
|
|
case 1: play_sound(-38); adven[current_pc].giveToPC(base_item,true);
|
|
party.magic_store_items[what_magic_shop][what_magic_shop_item].variety = 0;
|
|
break;
|
|
case 2: ASB("Can't carry any more items."); break;
|
|
case 3: ASB("Not enough cash."); break;
|
|
case 4: ASB("Item is too heavy."); break;
|
|
}
|
|
break;
|
|
}
|
|
set_up_shop_array();
|
|
|
|
if (overall_mode != 21) {
|
|
MessageBeep(MB_OK);
|
|
ASB("Shop error 1. Report This!");
|
|
}
|
|
draw_shop_graphics(0,dummy_rect);
|
|
print_buf();
|
|
put_pc_screen();
|
|
put_item_screen(stat_window,0);
|
|
}
|
|
|
|
|
|
void handle_info_request(short what_chosen)
|
|
{
|
|
item_record_type base_item;
|
|
short what_magic_shop,what_magic_shop_item;
|
|
|
|
switch (what_chosen / 100) {
|
|
case 0: case 1: case 2: case 3: case 4:
|
|
base_item = get_stored_item(what_chosen);
|
|
base_item.item_properties = base_item.item_properties | 1;
|
|
display_pc_item(6,0, base_item,0);
|
|
break;
|
|
case 5:
|
|
display_help(0,0);
|
|
break;
|
|
case 8:
|
|
base_item = store_mage_spells(what_chosen - 800 - 30);
|
|
display_spells(0,base_item.item_level,0);
|
|
break;
|
|
case 9:
|
|
base_item = store_priest_spells(what_chosen - 900 - 30);
|
|
display_spells(1,base_item.item_level,0);
|
|
break;
|
|
default:
|
|
what_magic_shop = (what_chosen / 1000) - 1;
|
|
what_magic_shop_item = what_chosen % 1000;
|
|
base_item = party.magic_store_items[what_magic_shop][what_magic_shop_item];
|
|
base_item.item_properties = base_item.item_properties | 1;
|
|
display_pc_item(6,0, base_item,0);
|
|
break;
|
|
}
|
|
}
|
|
|
|
void set_up_shop_array()
|
|
{
|
|
short i,shop_pos = 0;
|
|
Boolean cursed_item = FALSE;
|
|
item_record_type store_i;
|
|
long store_l;
|
|
|
|
for (i = 0; i < 30; i++)
|
|
store_shop_items[i] = -1;
|
|
switch (store_shop_type) {
|
|
case 0: case 1: case 2:
|
|
for (i = store_shop_min; i < store_shop_max + 1; i++) {
|
|
store_shop_items[shop_pos] = i;
|
|
store_i = get_stored_item(store_shop_items[shop_pos]);
|
|
store_shop_costs[shop_pos] = (store_i.charges == 0) ?
|
|
store_i.value : store_i.value * store_i.charges;
|
|
shop_pos++;
|
|
}
|
|
break;
|
|
case 3:
|
|
if (adven[current_pc].cur_health < adven[current_pc].max_health) {
|
|
store_shop_items[shop_pos] = 700;
|
|
store_shop_costs[shop_pos] = heal_costs[0];
|
|
shop_pos++;
|
|
}
|
|
if (adven[current_pc].status[2] > 0) {
|
|
store_shop_items[shop_pos] = 701;
|
|
store_shop_costs[shop_pos] = heal_costs[1];
|
|
shop_pos++;
|
|
}
|
|
if (adven[current_pc].status[7] > 0) {
|
|
store_shop_items[shop_pos] = 702;
|
|
store_shop_costs[shop_pos] = heal_costs[2];
|
|
shop_pos++;
|
|
}
|
|
if (adven[current_pc].status[12] > 0) {
|
|
store_shop_items[shop_pos] = 703;
|
|
store_shop_costs[shop_pos] = heal_costs[3];
|
|
shop_pos++;
|
|
}
|
|
if (adven[current_pc].status[9] > 0) {
|
|
store_shop_items[shop_pos] = 708;
|
|
store_shop_costs[shop_pos] = heal_costs[8];
|
|
shop_pos++;
|
|
}
|
|
for (i = 0; i < 24; i++)
|
|
if ((adven[current_pc].equip[i] == TRUE) && (adven[current_pc].items[i].isCursed()))
|
|
cursed_item = TRUE;
|
|
if (cursed_item) {
|
|
store_shop_items[shop_pos] = 704;
|
|
store_shop_costs[shop_pos] = heal_costs[4];
|
|
shop_pos++;
|
|
}
|
|
if (adven[current_pc].main_status == MAIN_STATUS_STONE) {
|
|
store_shop_items[shop_pos] = 705;
|
|
store_shop_costs[shop_pos] = heal_costs[5];
|
|
shop_pos++;
|
|
}
|
|
if (adven[current_pc].main_status == MAIN_STATUS_DEAD){
|
|
store_shop_items[shop_pos] = 706;
|
|
store_shop_costs[shop_pos] = heal_costs[6];
|
|
shop_pos++;
|
|
}
|
|
if (adven[current_pc].main_status == MAIN_STATUS_DUST){
|
|
store_shop_items[shop_pos] = 707;
|
|
store_shop_costs[shop_pos] = heal_costs[7];
|
|
shop_pos++;
|
|
}
|
|
break;
|
|
case 4:
|
|
break;
|
|
case 5: case 6: case 7: case 8: case 9:
|
|
for (i = 0; i < 10; i++)
|
|
if (party.magic_store_items[store_shop_type - 5][i].variety != 0) {
|
|
store_shop_items[shop_pos] = (store_shop_type - 4) * 1000 + i;
|
|
store_i = party.magic_store_items[store_shop_type - 5][i];
|
|
store_shop_costs[shop_pos] = (store_i.charges == 0) ?
|
|
store_i.value : store_i.value * store_i.charges;
|
|
shop_pos++;
|
|
}
|
|
break;
|
|
case 10:
|
|
for (i = store_shop_min; i < store_shop_max + 1; i++)
|
|
if (i == minmax(0,31,(int)i)) {
|
|
store_i = store_mage_spells(i);
|
|
store_shop_costs[shop_pos] = store_i.value;
|
|
store_shop_items[shop_pos] = 800 + i + 30;
|
|
shop_pos++;
|
|
}
|
|
break;
|
|
case 11:
|
|
for (i = store_shop_min; i < store_shop_max + 1; i++)
|
|
if (i == minmax(0,31,(int)i)) {
|
|
store_i = store_priest_spells(i);
|
|
store_shop_costs[shop_pos] = store_i.value;
|
|
store_shop_items[shop_pos] = 900 + i + 30;
|
|
shop_pos++;
|
|
}
|
|
break;
|
|
case 12:
|
|
for (i = store_shop_min; i < store_shop_max + 1; i++)
|
|
if (i == minmax(0,19,(int)i)) {
|
|
store_i = store_alchemy(i);
|
|
store_shop_costs[shop_pos] = store_i.value;
|
|
store_shop_items[shop_pos] = 500 + i;
|
|
shop_pos++;
|
|
}
|
|
break;
|
|
}
|
|
for (i = 0; i < 30; i++)
|
|
if (store_shop_items[i] >= 0) {
|
|
store_l = store_shop_costs[i];
|
|
store_l = (store_l * cost_mult[store_cost_mult]) / 10;
|
|
store_shop_costs[i] = (short) store_l;
|
|
}
|
|
i = max(0,shop_pos - 8);
|
|
lpsi.nMax = i;
|
|
lpsi.fMask = SIF_RANGE;
|
|
SetScrollInfo(shop_sbar,SB_CTL,&lpsi,FALSE);
|
|
//SetScrollRange(shop_sbar,SB_CTL,0,i,TRUE);
|
|
|
|
}
|
|
|
|
void start_talk_mode(short m_num,short personality,unsigned char monst_type,short store_face_pic)////
|
|
{
|
|
RECT area_rect;
|
|
char place_string1[256] = "";
|
|
char place_string2[256] = "";
|
|
|
|
store_personality = personality;
|
|
|
|
store_monst_type = monst_type;
|
|
store_m_num = m_num;
|
|
store_talk_face_pic = store_face_pic; ////
|
|
area_rect = talk_area_rect;
|
|
OffsetRect(&area_rect, -1 * area_rect.left,-1 * area_rect.top);
|
|
talk_gworld = CreateCompatibleBitmap(main_dc,area_rect.right,area_rect.bottom);
|
|
|
|
// first make sure relevant talk strs are loaded in
|
|
if (personality / 10 != cur_town_talk_loaded)
|
|
load_town(personality / 10,1,0,NULL);
|
|
|
|
// Dredge up critter's name
|
|
sprintf((char *) title_string,"%s:",data_store3->talk_strs[personality % 10]);
|
|
|
|
store_pre_talk_mode = overall_mode;
|
|
overall_mode = 20;
|
|
create_clip_region();
|
|
talk_end_forced = FALSE;
|
|
stat_screen_mode = 1;
|
|
|
|
// Bring up and place first strings.
|
|
sprintf((char *) place_string1,"%s",data_store3->talk_strs[personality % 10 + 10]);
|
|
strnum1 = personality % 10 + 10;
|
|
strnum2 = 0;
|
|
strcpy((char *) old_str1,(char *) place_string1);
|
|
strcpy((char *) old_str2,(char *) place_string2);
|
|
strcpy((char *) one_back1,(char *) place_string1);
|
|
strcpy((char *) one_back2,(char *) place_string2);
|
|
place_talk_str((char *) place_string1,(char *) place_string2,0,dummy_rect);
|
|
|
|
put_item_screen(stat_window,0);
|
|
give_help(5,6,0);
|
|
|
|
}
|
|
|
|
void end_talk_mode()
|
|
{
|
|
DeleteObject(talk_gworld);
|
|
talk_gworld = NULL;
|
|
|
|
overall_mode = store_pre_talk_mode;
|
|
create_clip_region();
|
|
if (overall_mode == 2)
|
|
overall_mode = 1;
|
|
if (overall_mode == 1) {
|
|
center = c_town.p_loc;
|
|
update_explored(center);
|
|
}
|
|
stat_screen_mode = 0;
|
|
put_item_screen(stat_window,0);
|
|
put_pc_screen();
|
|
redraw_screen(0);
|
|
}
|
|
|
|
void handle_talk_event(POINT p)
|
|
{
|
|
short i,j,force_special = 0,get_pc,s1 = -1,s2 = -1,s3 = -1;
|
|
char asked[4];
|
|
char place_string1[256] = "";
|
|
char place_string2[256] = "";
|
|
|
|
short a,b,c,d,ttype,which_talk_entry = -1;
|
|
|
|
p.x -= 5;
|
|
p.y -= 5;
|
|
|
|
if (PtInRect(&talk_help_rect,p)) {
|
|
if (play_sounds == TRUE) play_sound(37);
|
|
party.help_received[5] = 0;
|
|
give_help(205,6,0);
|
|
return;
|
|
}
|
|
|
|
for (i = 0; i < 9; i++)
|
|
if ((PtInRect(&preset_words[i].word_rect,p)) && ((talk_end_forced == FALSE) || (i == 6) || (i == 5))) {
|
|
click_talk_rect((char *) old_str1,(char *) old_str2,preset_words[i].word_rect);
|
|
switch (i) {
|
|
case 0: case 1: case 2: case 7: case 8:
|
|
force_special = i + 1;
|
|
break;
|
|
case 3: case 4:
|
|
force_special = i + 1;
|
|
break;
|
|
case 5: // save
|
|
if (strnum1 <= 0) {
|
|
MessageBeep(MB_OK);
|
|
return;
|
|
}
|
|
for (j = 0; j < 120; j++)
|
|
if ((party.talk_save[j].personality == store_personality) &&
|
|
(party.talk_save[j].str1 == strnum1) &&
|
|
(party.talk_save[j].str2 == strnum2)) {
|
|
ASB("This is already saved.");
|
|
print_buf();
|
|
return;
|
|
}
|
|
for (j = 0; j < 120; j++)
|
|
if (party.talk_save[j].personality <= 0) {
|
|
give_help(57,0,0);
|
|
play_sound(0);
|
|
party.talk_save[j].personality = store_personality;
|
|
party.talk_save[j].town_num = (unsigned char) c_town.town_num;
|
|
party.talk_save[j].str1 = strnum1;
|
|
party.talk_save[j].str2 = strnum2;
|
|
ASB("Noted in journal.");
|
|
j = 200;
|
|
}
|
|
if (j < 200) {
|
|
MessageBeep(MB_OK);
|
|
ASB("No more room in talking journal.");
|
|
}
|
|
print_buf();
|
|
return;
|
|
break;
|
|
case 6: // quit
|
|
end_talk_mode();
|
|
return;
|
|
break;
|
|
default:
|
|
for (j = 0; j < 4; j++)
|
|
asked[j] = preset_words[i].word[j];
|
|
break;
|
|
}
|
|
i = 100;
|
|
}
|
|
if (i < 100) {
|
|
for (i = 0; i < 50; i++)
|
|
if ((PtInRect(&store_words[i].word_rect,p)) && (talk_end_forced == FALSE)) {
|
|
click_talk_rect((char *) old_str1,(char *) old_str2,store_words[i].word_rect);
|
|
for (j = 0; j < 4; j++)
|
|
asked[j] = store_words[i].word[j];
|
|
|
|
i = 100;
|
|
}
|
|
}
|
|
if (i == 50) // no event
|
|
return;
|
|
if (force_special == 9) {
|
|
get_text_response(1017,place_string1,0);
|
|
asked[0] = place_string1[0];
|
|
asked[1] = place_string1[1];
|
|
asked[2] = place_string1[2];
|
|
asked[3] = place_string1[3];
|
|
}
|
|
|
|
if ((asked[0] == 'n') && (asked[1] == 'a') &&(asked[2] == 'm') &&(asked[3] == 'a')) {
|
|
force_special = 2;
|
|
}
|
|
if ((asked[0] == 'l') && (asked[1] == 'o') &&(asked[2] == 'o') &&(asked[3] == 'k')) {
|
|
force_special = 1;
|
|
}
|
|
if (((asked[0] == 'j') && (asked[1] == 'o') &&(asked[2] == 'b')) ||
|
|
((asked[0] == 'w') && (asked[1] == 'o') &&(asked[2] == 'r')&&(asked[3] == 'k')) ) {
|
|
force_special = 3;
|
|
}
|
|
|
|
if (force_special > 0) {
|
|
switch (force_special) {
|
|
case 1: case 2: case 3:
|
|
GetIndString(place_string1,120 + ((store_personality - 1) / 10),
|
|
((store_personality - 1) % 10) * 3 + 10 + force_special);
|
|
sprintf((char *) place_string1,"%s",data_store3->talk_strs[store_personality % 10 + 10 * force_special]);
|
|
|
|
oldstrnum1 = strnum1; oldstrnum2 = strnum2;
|
|
strnum1 = store_personality % 10 + 10 * force_special;
|
|
strnum2 = 0;
|
|
strcpy((char *) one_back1,(char *) old_str1);
|
|
strcpy((char *) one_back2,(char *) old_str2);
|
|
strcpy((char *) old_str1,(char *) place_string1);
|
|
strcpy((char *) old_str2,(char *) place_string2);
|
|
place_talk_str((char *) place_string1,(char *) place_string2,0,dummy_rect);
|
|
return;
|
|
break;
|
|
case 4: // buy button
|
|
asked[0] = 'p';asked[1] = 'u';asked[2] = 'r';asked[3] = 'c';
|
|
if (scan_for_response(asked) >= 0)
|
|
break;
|
|
asked[0] = 's';asked[1] = 'a';asked[2] = 'l';asked[3] = 'e';
|
|
if (scan_for_response(asked) >= 0)
|
|
break;
|
|
asked[0] = 'h';asked[1] = 'e';asked[2] = 'a';asked[3] = 'l';
|
|
if (scan_for_response(asked) >= 0)
|
|
break;
|
|
asked[0] = 'i';asked[1] = 'd';asked[2] = 'e';asked[3] = 'n';
|
|
if (scan_for_response(asked) >= 0)
|
|
break;
|
|
asked[0] = 't';asked[1] = 'r';asked[2] = 'a';asked[3] = 'i';
|
|
if (scan_for_response(asked) >= 0)
|
|
break;
|
|
break;
|
|
case 5: // sell button
|
|
asked[0] = 's';asked[1] = 'e';asked[2] = 'l';asked[3] = 'l';
|
|
if (scan_for_response(asked) >= 0)
|
|
break;
|
|
break;
|
|
case 8: // back 1
|
|
strnum1 = oldstrnum1; strnum2 = oldstrnum2;
|
|
strcpy((char *) place_string1,(char *) one_back1);
|
|
strcpy((char *) place_string2,(char *) one_back2);
|
|
strcpy((char *) one_back1,(char *) old_str1);
|
|
strcpy((char *) one_back2,(char *) old_str2);
|
|
strcpy((char *) old_str1,(char *) place_string1);
|
|
strcpy((char *) old_str2,(char *) place_string2);
|
|
place_talk_str((char *) place_string1,(char *) place_string2,0,dummy_rect);
|
|
return;
|
|
break;
|
|
}
|
|
}
|
|
|
|
which_talk_entry = scan_for_response(asked);
|
|
if ((which_talk_entry < 0) || (which_talk_entry > 59)) {
|
|
strcpy((char *) one_back1,(char *) old_str1);
|
|
strcpy((char *) one_back2,(char *) old_str2);
|
|
sprintf((char *) old_str2,"");
|
|
sprintf((char *) old_str1,"%s",data_store3->talk_strs[store_personality % 10 + 160]);
|
|
if (strlen((char *) old_str1) < 2)
|
|
sprintf((char *) old_str1,"You get no response.");
|
|
place_talk_str((char *) old_str1,(char *) old_str2,0,dummy_rect);
|
|
strnum1 = -1;
|
|
return;
|
|
}
|
|
|
|
ttype = talking.talk_nodes[which_talk_entry].type;
|
|
a = talking.talk_nodes[which_talk_entry].extras[0];
|
|
b = talking.talk_nodes[which_talk_entry].extras[1];
|
|
c = talking.talk_nodes[which_talk_entry].extras[2];
|
|
d = talking.talk_nodes[which_talk_entry].extras[3];
|
|
|
|
sprintf((char *) place_string1,"%s",data_store3->talk_strs[40 + which_talk_entry * 2]);
|
|
sprintf((char *) place_string2,"%s",data_store3->talk_strs[40 + which_talk_entry * 2 + 1]);
|
|
|
|
oldstrnum1 = strnum1; oldstrnum2 = strnum2;
|
|
strnum1 = 40 + which_talk_entry * 2; strnum2 = 40 + which_talk_entry * 2 + 1;
|
|
|
|
switch(ttype) {
|
|
case 0:
|
|
break;
|
|
case 1:
|
|
if (PSD[a][b] > c) {
|
|
strnum1 = strnum2;
|
|
strcpy((char *) place_string1,(char *) place_string2);
|
|
}
|
|
sprintf((char *) place_string2,"");
|
|
strnum2 = 0;
|
|
break;
|
|
case 2:
|
|
PSD[a][b] = 1;
|
|
break;
|
|
case 3:
|
|
if (party.gold < a) {
|
|
strnum1 = strnum2;
|
|
strcpy((char *) place_string1,(char *) place_string2);
|
|
}
|
|
else {
|
|
talk_end_forced = TRUE;
|
|
party.gold -= a;
|
|
put_pc_screen();
|
|
adven.heal(30 * b);
|
|
adven.restoreSP(25 * b);
|
|
party.age += 700;
|
|
c_town.p_loc.x = c;
|
|
c_town.p_loc.y = d;
|
|
center = c_town.p_loc;
|
|
}
|
|
strnum2 = 0;
|
|
sprintf((char *) place_string2,"");
|
|
break;
|
|
case 4:
|
|
if (day_reached((unsigned char) a,0) == TRUE) {
|
|
strnum1 = strnum2;
|
|
strcpy((char *) place_string1,(char *) place_string2);
|
|
}
|
|
sprintf((char *) place_string2,"");
|
|
strnum2 = 0;
|
|
break;
|
|
case 5:
|
|
if (day_reached((unsigned char) a,(unsigned char) b) == TRUE) {
|
|
strnum1 = strnum2;
|
|
strcpy((char *) place_string1,(char *) place_string2);
|
|
}
|
|
sprintf((char *) place_string2,"");
|
|
strnum2 = 0;
|
|
break;
|
|
case 6:
|
|
if (c_town.town_num != a) {
|
|
strnum1 = strnum2;
|
|
strcpy((char *) place_string1,(char *) place_string2);
|
|
}
|
|
sprintf((char *) place_string2,"");
|
|
strnum2 = 0;
|
|
break;
|
|
case 7:
|
|
c = minmax(1,30,(int)c);
|
|
start_shop_mode(2,b,
|
|
b + c - 1,a,(char *)place_string1);
|
|
strnum1 = -1;
|
|
return;
|
|
case 8:
|
|
if ((get_pc = char_select_pc(1,0,"Train who?")) < 6) {
|
|
strnum1 = -1;
|
|
spend_xp(get_pc,1, 0);
|
|
}
|
|
sprintf((char *) place_string1, "You conclude your training.");
|
|
return;
|
|
|
|
case 9: case 10: case 11:
|
|
c = minmax(1,30,(int)c);
|
|
start_shop_mode(ttype + 1,b,
|
|
b + c - 1,a,(char *)place_string1);
|
|
strnum1 = -1;
|
|
return;
|
|
case 12: //healer
|
|
start_shop_mode(3,0,0,a,(char *)place_string1);
|
|
strnum1 = -1;
|
|
return;
|
|
break;
|
|
case 13: // sell weap
|
|
strnum1 = -1;
|
|
stat_screen_mode = 3;
|
|
put_item_screen(stat_window,1);
|
|
give_help(42,43,0);
|
|
break;
|
|
case 14: // sell armor
|
|
strnum1 = -1;
|
|
stat_screen_mode = 4;
|
|
put_item_screen(stat_window,1);
|
|
give_help(42,43,0);
|
|
break;
|
|
case 15: // sell misc
|
|
strnum1 = -1;
|
|
stat_screen_mode = 5;
|
|
put_item_screen(stat_window,1);
|
|
give_help(42,43,0);
|
|
break;
|
|
case 16: case 17: // ident enchant
|
|
strnum1 = -1;
|
|
stat_screen_mode = (ttype == 16) ? 2 : 6;
|
|
shop_identify_cost = a;
|
|
put_item_screen(stat_window,1);
|
|
give_help(ttype - 16 + 44,0,0);
|
|
break;
|
|
case 18:
|
|
if (party.gold < a) {
|
|
strnum1 = strnum2;
|
|
strcpy((char *) place_string1,(char *) place_string2);
|
|
}
|
|
else {
|
|
party.gold -= a;
|
|
put_pc_screen();
|
|
|
|
}
|
|
sprintf((char *) place_string2,"");
|
|
strnum2 = 0;
|
|
break;
|
|
case 19:
|
|
if ((sd_legit(b,c) == TRUE) && (PSD[b][c] == d)) {
|
|
sprintf((char *) place_string1, "You've already learned that.");
|
|
strnum1 = -1;
|
|
}
|
|
else if (party.gold < a) {
|
|
strnum1 = strnum2;
|
|
strcpy((char *) place_string1,(char *) place_string2);
|
|
}
|
|
else {
|
|
party.gold -= a;
|
|
put_pc_screen();
|
|
if (sd_legit(b,c) == TRUE)
|
|
PSD[b][c] = d;
|
|
else give_error("Invalid Stuff Done flag called in conversation.","",0);
|
|
}
|
|
strnum2 = 0;
|
|
sprintf((char *) place_string2,"");
|
|
break;
|
|
case 20:
|
|
if (party.gold < a) {
|
|
strnum1 = strnum2;
|
|
strnum2 = 0;
|
|
strcpy((char *) place_string1,(char *) place_string2);
|
|
sprintf((char *) place_string2,"");
|
|
break;
|
|
}
|
|
else {
|
|
for (i = b; i <= b + c; i++)
|
|
if ((i >= 0) && (i < 30) && (party.boats[i].property == TRUE)) {
|
|
party.gold -= a;
|
|
put_pc_screen();
|
|
party.boats[i].property = FALSE;
|
|
sprintf((char *) place_string2,"");
|
|
strnum2 = 0;
|
|
i = 1000;
|
|
}
|
|
if (i >= 1000)
|
|
break;
|
|
}
|
|
sprintf((char *) place_string1, "There are no boats left.");
|
|
sprintf((char *) place_string2,"");
|
|
strnum1 = -1;
|
|
strnum2 = -1;
|
|
break;
|
|
case 21:
|
|
if (party.gold < a) {
|
|
strnum1 = strnum2;
|
|
strnum2 = 0;
|
|
strcpy((char *) place_string1,(char *) place_string2);
|
|
sprintf((char *) place_string2,"");
|
|
break;
|
|
}
|
|
else {
|
|
for (i = b; i <= b + c; i++)
|
|
if ((i >= 0) && (i < 30) && (party.horses[i].property == TRUE)) {
|
|
party.gold -= a;
|
|
put_pc_screen();
|
|
party.horses[i].property = FALSE;
|
|
sprintf((char *) place_string2,"");
|
|
strnum2 = 0;
|
|
i = 1000;
|
|
}
|
|
if (i >= 1000)
|
|
break;
|
|
}
|
|
sprintf((char *) place_string1, "There are no horses left.");
|
|
sprintf((char *) place_string2,"");
|
|
strnum1 = -1;
|
|
strnum2 = -1;
|
|
break;
|
|
case 22:
|
|
if (party.spec_items[a] > 0) {
|
|
sprintf((char *) place_string1, "You already have it.");
|
|
strnum1 = -1;
|
|
}
|
|
else if (party.gold < b) {
|
|
strcpy((char *) place_string1,(char *) place_string2);
|
|
strnum1 = strnum2;
|
|
}
|
|
else {
|
|
party.gold -= b;
|
|
put_pc_screen();
|
|
party.spec_items[a] = 1;
|
|
}
|
|
strnum2 = 0;
|
|
sprintf((char *) place_string2,"");
|
|
break;
|
|
case 23:
|
|
start_shop_mode(5 + b,0,
|
|
9,a,(char *)place_string1);
|
|
strnum1 = -1;
|
|
return;
|
|
case 24:
|
|
if (party.can_find_town[b] > 0) {
|
|
}
|
|
else if (party.gold < a) {
|
|
strnum1 = strnum2;
|
|
strcpy((char *) place_string1,(char *) place_string2);
|
|
}
|
|
else {
|
|
party.gold -= a;
|
|
put_pc_screen();
|
|
party.can_find_town[b] = 1;
|
|
}
|
|
strnum2 = 0;
|
|
sprintf((char *) place_string2,"");
|
|
break;
|
|
case 25:
|
|
talk_end_forced = TRUE;
|
|
break;
|
|
case 26:
|
|
c_town.monst.dudes[store_m_num].attitude = 1;
|
|
c_town.monst.dudes[store_m_num].mobile = 1;
|
|
talk_end_forced = TRUE;
|
|
break;
|
|
case 27:
|
|
make_town_hostile();
|
|
talk_end_forced = TRUE;
|
|
break;
|
|
case 28:
|
|
c_town.monst.dudes[store_m_num].active = 0;
|
|
// Special killing effects
|
|
if (sd_legit(c_town.monst.dudes[store_m_num].monst_start.spec1,c_town.monst.dudes[store_m_num].monst_start.spec2) == TRUE)
|
|
party.stuff_done[c_town.monst.dudes[store_m_num].monst_start.spec1][c_town.monst.dudes[store_m_num].monst_start.spec2] = 1;
|
|
talk_end_forced = TRUE;
|
|
break;
|
|
case 29: // town special
|
|
run_special(7,2,a,c_town.p_loc,&s1,&s2,&s3);
|
|
// check s1 & s2 to see if we got diff str, and, if so, munch old strs
|
|
if ((s1 >= 0) || (s2 >= 0)) {
|
|
strnum1 = -1;
|
|
strnum2 = -1;
|
|
sprintf((char *) place_string1,"");
|
|
sprintf((char *) place_string2,"");
|
|
}
|
|
get_strs((char *) place_string1,(char *) place_string2,2,s1,s2);
|
|
if (s1 >= 0) strnum1 = 2000 + s1;
|
|
if (s2 >= 0) strnum2 = 2000 + s2;
|
|
put_pc_screen();
|
|
put_item_screen(stat_window,0);
|
|
break;
|
|
case 30: // scen special
|
|
run_special(7,0,a,c_town.p_loc,&s1,&s2,&s3);
|
|
// check s1 & s2 to see if we got diff str, and, if so, munch old strs
|
|
if ((s1 >= 0) || (s2 >= 0)) {
|
|
strnum1 = -1;
|
|
strnum2 = -1;
|
|
sprintf((char *) place_string1,"");
|
|
sprintf((char *) place_string2,"");
|
|
}
|
|
get_strs((char *) place_string1,(char *) place_string2,0,s1,s2);
|
|
if (s1 >= 0) strnum1 = 3000 + s1;
|
|
if (s2 >= 0) strnum2 = 3000 + s2;
|
|
put_pc_screen();
|
|
put_item_screen(stat_window,0);
|
|
break;
|
|
}
|
|
|
|
strcpy((char *) one_back1,(char *) old_str1);
|
|
strcpy((char *) one_back2,(char *) old_str2);
|
|
strcpy((char *) old_str1,(char *) place_string1);
|
|
strcpy((char *) old_str2,(char *) place_string2);
|
|
place_talk_str((char *) old_str1,(char *) old_str2,0,dummy_rect);
|
|
|
|
}
|
|
|
|
void do_sign(short town_num, short which_sign, short sign_type)
|
|
//town_num; // Will be 0 - 200 for town, 200 - 290 for outdoors
|
|
//short sign_type; // terrain type
|
|
{
|
|
char sign_text[256];
|
|
location view_loc;
|
|
|
|
view_loc = (is_out()) ? party.p_loc : c_town.p_loc;
|
|
SetCursor(sword_curs);
|
|
|
|
cd_create_dialog(1014,mainPtr);
|
|
|
|
store_sign_mode = sign_type;
|
|
if (terrain_pic[sign_type] < 1000)
|
|
csp(1014,3,terrain_pic[sign_type]);
|
|
else csp(1014,3,94);
|
|
|
|
if (town_num >= 200) {
|
|
town_num -= 200;
|
|
load_outdoors(town_num % scenario.out_width, town_num / scenario.out_width,party.i_w_c.x,party.i_w_c.y,
|
|
1,which_sign + 100,(char *) sign_text);
|
|
}
|
|
else {
|
|
sprintf((char *) sign_text,"%s",data_store->town_strs[120 + which_sign]);
|
|
}
|
|
csit(1014,2,(char *) sign_text);
|
|
|
|
while (dialog_not_toast)
|
|
ModalDialog();
|
|
cd_kill_dialog(1014,0);
|
|
}
|
|
|
|
|
|
|
|
|
|
Boolean prefs_event_filter (short item_hit)
|
|
{
|
|
Boolean done_yet = FALSE,did_cancel = FALSE;
|
|
short i;
|
|
RECT windRECT;
|
|
|
|
switch (item_hit) {
|
|
case 1:
|
|
done_yet = TRUE;
|
|
dialog_not_toast = FALSE;
|
|
break;
|
|
|
|
case 2:
|
|
done_yet = TRUE;
|
|
dialog_not_toast = FALSE;
|
|
did_cancel = TRUE;
|
|
break;
|
|
|
|
case 50: case 52: case 54: case 56: case 18: case 20: case 22: case 24: case 27: case 38: case 40: case 43: case 45:
|
|
cd_set_led(1099,item_hit,1 - cd_get_led(1099,item_hit));
|
|
break;
|
|
|
|
case 29:
|
|
cd_set_led(1099,29,1);
|
|
break;
|
|
|
|
case 32: case 34: case 36: case 47:
|
|
cd_set_led(1099,32,(item_hit == 32) ? 1 : 0);
|
|
cd_set_led(1099,34,(item_hit == 34) ? 1 : 0);
|
|
cd_set_led(1099,36,(item_hit == 36) ? 1 : 0);
|
|
cd_set_led(1099,47,(item_hit == 47) ? 1 : 0);
|
|
break;
|
|
|
|
case 58:
|
|
cd_set_led(1099,58,1 - cd_get_led(1099,58));
|
|
break;
|
|
|
|
default:
|
|
cd_set_led(1099,4 + cur_display_mode,0);
|
|
cur_display_mode = item_hit - 4;
|
|
cd_set_led(1099,4 + cur_display_mode,1);
|
|
break;
|
|
}
|
|
if (done_yet== TRUE) {
|
|
if (did_cancel == FALSE) {
|
|
display_mode = cur_display_mode;
|
|
party.stuff_done[306][0] = cd_get_led(1099,18);
|
|
party.stuff_done[306][1] = cd_get_led(1099,20);
|
|
play_sounds = 1 - party.stuff_done[306][1];
|
|
party.stuff_done[306][2] = cd_get_led(1099,22);
|
|
party.stuff_done[306][3] = cd_get_led(1099,24);
|
|
party.stuff_done[306][4] = cd_get_led(1099,27);
|
|
party.stuff_done[306][7] = cd_get_led(1099,38);
|
|
party.stuff_done[306][8] = cd_get_led(1099,40);
|
|
party.stuff_done[306][9] = cd_get_led(1099,43);
|
|
party.stuff_done[306][5] = cd_get_led(1099,45);
|
|
party.stuff_done[305][6] = cd_get_led(1099,50);
|
|
party.stuff_done[305][5] = cd_get_led(1099,52);
|
|
fry_startup = cd_get_led(1099,54);
|
|
party.stuff_done[305][7] = cd_get_led(1099,56);
|
|
|
|
if(party.stuff_done[307][0] != cd_get_led(1099,58)){//changed graphic mode (Mac vs Windows) ?
|
|
party.stuff_done[307][0] = cd_get_led(1099,58);//adjust the graphic mode SDF
|
|
swap_platform_graphics();//swap graphics
|
|
redraw_screen(0);//redraw screen with new graphics
|
|
clear_map();//redraw map with new graphics
|
|
}
|
|
|
|
if (cd_get_led(1099,32) == 1)
|
|
PSD[306][6] = 0;
|
|
if (cd_get_led(1099,34) == 1)
|
|
PSD[306][6] = 1;
|
|
if (cd_get_led(1099,36) == 1)
|
|
PSD[306][6] = 2;
|
|
if (cd_get_led(1099,47) == 1)
|
|
PSD[306][6] = 3;
|
|
if (cd_get_led(1099,29) == 1)
|
|
for (i = 0; i < 120; i++)
|
|
party.help_received[i] = 0;
|
|
|
|
if (display_mode < 5)
|
|
max_window(mainPtr);
|
|
else {
|
|
GetWindowRect(GetDesktopWindow(),&windRECT);
|
|
MoveWindow(mainPtr,(windRECT.right - (588 + 10)) / 2,
|
|
(windRECT.bottom - (425 + 52)) / 2 ,
|
|
588 + 10,425 + 52,TRUE);
|
|
}
|
|
}
|
|
save_maps = 1 - party.stuff_done[306][0];
|
|
give_delays = party.stuff_done[306][2];
|
|
build_data_file(2);
|
|
}
|
|
|
|
return FALSE;
|
|
}
|
|
|
|
void pick_preferences()
|
|
{
|
|
get_reg_data();
|
|
cur_display_mode = display_mode;
|
|
|
|
SetCursor(sword_curs);
|
|
|
|
cd_create_dialog(1099,mainPtr);
|
|
|
|
cd_set_led(1099,4 + cur_display_mode,1);
|
|
|
|
cd_set_led(1099,18,(party.stuff_done[306][0] != 0) ? 1 : 0);
|
|
cd_set_led(1099,20,(play_sounds == FALSE) ? 1 : 0);
|
|
cd_set_led(1099,22,(party.stuff_done[306][2] != 0) ? 1 : 0);
|
|
cd_set_led(1099,24,(party.stuff_done[306][3] != 0) ? 1 : 0);
|
|
cd_set_led(1099,27,(party.stuff_done[306][4] != 0) ? 1 : 0);
|
|
cd_set_led(1099,38,(party.stuff_done[306][7] != 0) ? 1 : 0);
|
|
cd_set_led(1099,40,(party.stuff_done[306][8] != 0) ? 1 : 0);
|
|
cd_set_led(1099,43,(party.stuff_done[306][9] != 0) ? 1 : 0);
|
|
cd_set_led(1099,45,(party.stuff_done[306][5] != 0) ? 1 : 0);
|
|
cd_set_led(1099,50,(party.stuff_done[305][6] != 0) ? 1 : 0);
|
|
cd_set_led(1099,52,(party.stuff_done[305][5] != 0) ? 1 : 0);
|
|
cd_set_led(1099,54,(fry_startup != FALSE) ? 1 : 0);
|
|
cd_set_led(1099,56,(party.stuff_done[305][7] != 0) ? 1 : 0);
|
|
cd_set_led(1099,58,(party.stuff_done[307][0] != 0) ? 1 : 0);
|
|
cd_set_flag(1099,3,1);
|
|
if (PSD[306][6] == 3)
|
|
cd_set_led(1099,47,1);
|
|
else cd_set_led(1099,32 + PSD[306][6] * 2,1);
|
|
|
|
if (party.help_received[55] == 0) {
|
|
cd_initial_draw(1099);
|
|
give_help(55,0,1099);
|
|
}
|
|
|
|
while (dialog_not_toast)
|
|
ModalDialog();
|
|
cd_kill_dialog(1099,0);
|
|
adjust_window_mode();
|
|
}
|
|
|
|
Boolean compatibility_event_filter (short item_hit)
|
|
{
|
|
Boolean done_yet = FALSE,did_cancel = FALSE;
|
|
|
|
switch (item_hit) {
|
|
case 1:
|
|
done_yet = TRUE;
|
|
dialog_not_toast = FALSE;
|
|
break;
|
|
|
|
case 2:
|
|
done_yet = TRUE;
|
|
dialog_not_toast = FALSE;
|
|
did_cancel = TRUE;
|
|
break;
|
|
|
|
|
|
case 7: case 9: case 11: case 13:
|
|
cd_set_led(1100,item_hit,1 - cd_get_led(1100,item_hit));
|
|
break;
|
|
}
|
|
|
|
if (done_yet== TRUE) {
|
|
if (did_cancel == FALSE) {
|
|
party.stuff_done[309][0]=cd_get_led(1100,7);
|
|
party.stuff_done[309][1]=1-cd_get_led(1100,9);
|
|
party.stuff_done[309][2]=1-cd_get_led(1100,11);
|
|
party.stuff_done[309][3]=cd_get_led(1100,13);
|
|
}
|
|
build_data_file(1);
|
|
}
|
|
|
|
return FALSE;
|
|
}
|
|
|
|
void pick_compatibility()
|
|
{
|
|
get_reg_data();
|
|
SetCursor(sword_curs);
|
|
|
|
cd_create_dialog(1100,mainPtr);
|
|
|
|
cd_set_led(1100,7,(party.stuff_done[309][0]!= 0) ? 1: 0);// party.stuff_done[309][0] legacy_day_reached
|
|
cd_set_led(1100,9,(party.stuff_done[309][1] != 0) ? 0 : 1);// party.stuff_done[309][1] legacy_kill_node
|
|
cd_set_led(1100,11,(party.stuff_done[309][2] != 0) ? 0 : 1);// party.stuff_done[309][2] town_waterfalls
|
|
cd_set_led(1100,13,(party.stuff_done[309][3] != 0) ? 1 : 0);// party.stuff_done[309][3] display_grass_trims
|
|
|
|
if (party.help_received[110] == 0) {
|
|
cd_initial_draw(1100);
|
|
give_help(110,111,1100);
|
|
}
|
|
|
|
while (dialog_not_toast)
|
|
ModalDialog();
|
|
cd_kill_dialog(1100,0);
|
|
adjust_window_mode();
|
|
}
|
|
|
|
void put_party_stats()
|
|
{
|
|
short i;
|
|
|
|
for (i = 0; i < 6; i++) {
|
|
if (adven[i].main_status > MAIN_STATUS_ABSENT) {
|
|
cd_set_item_text(989,5 + 5 * i,adven[i].name);
|
|
cd_activate_item(989,7 + 5 * i,1);
|
|
cd_activate_item(989,8 + 5 * i,1);
|
|
cd_set_flag(989,6 + 5 * i,96);
|
|
cd_activate_item(989,35 + i,1);
|
|
cd_activate_item(989,42 + i,1);
|
|
csp(989,42 + i,800 + adven[i].which_graphic);
|
|
}
|
|
else {
|
|
cd_set_item_text(989,5 + 5 * i,"Empty.");
|
|
cd_activate_item(989,7 + 5 * i,0);
|
|
cd_activate_item(989,8 + 5 * i,0);
|
|
cd_set_flag(989,6 + 5 * i,98);
|
|
cd_activate_item(989,35 + i,0);
|
|
cd_activate_item(989,42 + i,0);
|
|
}
|
|
|
|
}
|
|
}
|
|
|
|
void edit_party_event_filter (short item_hit)
|
|
{
|
|
short which_pc;
|
|
|
|
switch (item_hit) {
|
|
case 1:
|
|
dialog_not_toast = FALSE;
|
|
break;
|
|
|
|
case 41:
|
|
party.help_received[22] = 0;
|
|
give_help(222,23,989);
|
|
return;
|
|
|
|
case 5: case 10: case 15: case 20: case 25: case 30:
|
|
which_pc = (item_hit - 5) / 5;
|
|
if (adven[which_pc].main_status != MAIN_STATUS_ABSENT)
|
|
pick_pc_name(which_pc,989);
|
|
put_party_stats();
|
|
break;
|
|
case 7: case 12: case 17: case 22: case 27: case 32:
|
|
which_pc = (item_hit - 7) / 5;
|
|
pick_race_abil(&adven[which_pc],0,989);
|
|
put_party_stats();
|
|
break;
|
|
case 8: case 13: case 18: case 23: case 28: case 33:
|
|
which_pc = (item_hit - 8) / 5;
|
|
spend_xp(which_pc,0,989);
|
|
put_party_stats();
|
|
break;
|
|
case 35: case 36: case 37: case 38: case 39: case 40:
|
|
which_pc = item_hit - 35;
|
|
|
|
if (adven[which_pc].main_status <= MAIN_STATUS_ABSENT)
|
|
break;
|
|
if (adven[which_pc].main_status != MAIN_STATUS_ABSENT)
|
|
pick_pc_graphic(which_pc,1,989);
|
|
put_party_stats();
|
|
break;
|
|
case 6: case 11: case 16: case 21: case 26: case 31:
|
|
which_pc = (item_hit - 6) / 5;
|
|
if (adven[which_pc].main_status != MAIN_STATUS_ABSENT) {
|
|
if (FCD(1053,989) == 2)
|
|
adven[which_pc].main_status = MAIN_STATUS_ABSENT;
|
|
put_party_stats();
|
|
}
|
|
else {
|
|
give_help(56,0,989);
|
|
create_pc(which_pc,989);
|
|
put_party_stats();
|
|
cd_initial_draw(989); // extra redraw, just in case
|
|
}
|
|
break;
|
|
// case 7: case 12: case 17: case 22: case 27: case 32:
|
|
|
|
}
|
|
|
|
}
|
|
|
|
void edit_party()
|
|
{
|
|
|
|
SetCursor(sword_curs);
|
|
|
|
cd_create_dialog(989,mainPtr);
|
|
|
|
put_party_stats();
|
|
if (party.help_received[22] == 0) {
|
|
cd_initial_draw(989);
|
|
give_help(22,23,989);
|
|
}
|
|
while (dialog_not_toast)
|
|
ModalDialog();
|
|
cd_kill_dialog(989,0);
|
|
|
|
if (adven[current_pc].isAlive() == false)
|
|
current_pc = first_active_pc();
|
|
|
|
|
|
}
|
|
|
|
void tip_of_day_event_filter (short item_hit)
|
|
{
|
|
char place_str[256];
|
|
|
|
switch (item_hit) {
|
|
case 1:
|
|
dialog_not_toast = FALSE;
|
|
break;
|
|
|
|
case 5:
|
|
store_tip_page_on++;
|
|
if (store_tip_page_on == NUM_HINTS)
|
|
store_tip_page_on = 0;
|
|
GetIndString(place_str,12,50 + store_tip_page_on);
|
|
csit(958,3,(char *) place_str);
|
|
break;
|
|
|
|
case 7:
|
|
give_intro_hint = 1 - give_intro_hint;
|
|
cd_set_led(958,7,give_intro_hint);
|
|
break;
|
|
}
|
|
|
|
}
|
|
|
|
void tip_of_day()
|
|
{
|
|
char place_str[256];
|
|
|
|
store_tip_page_on = get_ran(1,0,NUM_HINTS - 1);
|
|
|
|
SetCursor(sword_curs);
|
|
|
|
cd_create_dialog_parent_num(958,0);
|
|
|
|
GetIndString(place_str,12,50 + store_tip_page_on);
|
|
csit(958,3,(char *) place_str);
|
|
|
|
cd_set_led(958,7,give_intro_hint);
|
|
|
|
while (dialog_not_toast) ModalDialog();
|
|
|
|
cd_kill_dialog(958,0);
|
|
build_data_file(2);
|
|
}
|
|
|
|
void max_window(HWND window)
|
|
{
|
|
RECT main_rect,wind_rect;
|
|
short width,height;
|
|
|
|
cursor_shown = TRUE;
|
|
showcursor(TRUE);
|
|
|
|
GetWindowRect(GetDesktopWindow(),&main_rect);
|
|
GetWindowRect(window,&wind_rect);
|
|
width = main_rect.right - main_rect.left;
|
|
height = main_rect.bottom - main_rect.top;
|
|
MoveWindow(window,0,0,width,height,TRUE);
|
|
}
|
|
|
|
void put_scen_info()
|
|
{
|
|
short i;
|
|
char place_str[256];
|
|
char *ratings[] = {"G","PG","R","NC-17"};
|
|
char *difficulty[] = {"Low","Medium","High","Very High"};
|
|
|
|
for (i = 0; i < 3; i++)
|
|
if(store_scen_page_on * 3 + i < store_num_scen){
|
|
if(scen_headers[store_scen_page_on * 3 + i].intro_pic == 100){//custom intro pic
|
|
sprintf(place_str,"scenarios/%s",data_store2[store_scen_page_on * 3 + i].scen_names);
|
|
place_str[strlen(place_str)-3]='b';
|
|
place_str[strlen(place_str)-2]='m';
|
|
place_str[strlen(place_str)-1]='p';
|
|
spec_scen_g = ReadBMP(place_str);
|
|
cd_set_pict(947, 6 + i * 3,2400);
|
|
DeleteObject(spec_scen_g);
|
|
}
|
|
else
|
|
cd_set_pict(947, 6 + i * 3,1600 + scen_headers[store_scen_page_on * 3 + i].intro_pic);
|
|
sprintf((char *) place_str,
|
|
"%s v%d.%d.%d - | Difficulty: %s, Rating: %s |%s |%s",
|
|
data_store2[store_scen_page_on * 3 + i].scen_header_strs[0],
|
|
(short) scen_headers[store_scen_page_on * 3 + i].ver[0],
|
|
(short) scen_headers[store_scen_page_on * 3 + i].ver[1],
|
|
(short) scen_headers[store_scen_page_on * 3 + i].ver[2],
|
|
difficulty[scen_headers[store_scen_page_on * 3 + i].difficulty],
|
|
ratings[scen_headers[store_scen_page_on * 3 + i].default_ground],
|
|
data_store2[store_scen_page_on * 3 + i].scen_header_strs[1],
|
|
data_store2[store_scen_page_on * 3 + i].scen_header_strs[2]);
|
|
csit(947,7 + i * 3,(char *) place_str);
|
|
cd_activate_item(947,8 + i * 3,1);
|
|
}
|
|
else {
|
|
cd_set_pict(947, 6 + i * 3,950);
|
|
csit(947,7 + i * 3,"");
|
|
cd_activate_item(947,8 + i * 3,0);
|
|
}
|
|
}
|
|
|
|
void pick_a_scen_event_filter (short item_hit)
|
|
{
|
|
switch (item_hit) {
|
|
case 1:
|
|
dialog_answer = -1;
|
|
dialog_not_toast = FALSE;
|
|
break;
|
|
|
|
case 3: case 4:
|
|
if (item_hit == 3) {
|
|
if (store_scen_page_on == 0)
|
|
store_scen_page_on = (store_num_scen - 1) / 3;
|
|
else store_scen_page_on--;
|
|
}
|
|
else {
|
|
if (store_scen_page_on == (store_num_scen - 1) / 3)
|
|
store_scen_page_on = 0;
|
|
else store_scen_page_on++;
|
|
}
|
|
put_scen_info();
|
|
break;
|
|
|
|
case 8: case 11: case 14:
|
|
dialog_answer = ((item_hit - 8) / 3) + store_scen_page_on * 3;
|
|
dialog_not_toast = FALSE;
|
|
break;
|
|
}
|
|
|
|
}
|
|
|
|
short pick_a_scen()
|
|
{
|
|
|
|
build_scen_headers();
|
|
|
|
store_scen_page_on = 0;
|
|
|
|
if (store_num_scen == 0) {
|
|
FCD(868,0);
|
|
return -1;
|
|
}
|
|
SetCursor(sword_curs);
|
|
|
|
cd_create_dialog_parent_num(947,0);
|
|
|
|
put_scen_info();
|
|
|
|
if (store_num_scen <= 3) {
|
|
cd_activate_item(947,3,0);
|
|
cd_activate_item(947,4,0);
|
|
}
|
|
while (dialog_not_toast)
|
|
ModalDialog();
|
|
cd_kill_dialog(947,0);
|
|
return dialog_answer;
|
|
}
|
|
|
|
|
|
void pick_prefab_scen_event_filter (short item_hit)
|
|
{
|
|
switch (item_hit) {
|
|
case 1:
|
|
dialog_answer = -1;
|
|
dialog_not_toast = FALSE;
|
|
break;
|
|
|
|
case 6: case 9: case 12:
|
|
dialog_answer = ((item_hit - 6) / 3);
|
|
dialog_not_toast = FALSE;
|
|
break;
|
|
}
|
|
}
|
|
|
|
short pick_prefab_scen()
|
|
{
|
|
SetCursor(sword_curs);
|
|
|
|
cd_create_dialog_parent_num(869,0);
|
|
cd_activate_item(869,2,0);
|
|
|
|
while (dialog_not_toast)
|
|
ModalDialog();
|
|
cd_kill_dialog(869,0);
|
|
return dialog_answer;
|
|
}
|