From ec2fb7f44f637a91bbeec4c98405ccb453104fa5 Mon Sep 17 00:00:00 2001 From: Celtic Minstrel Date: Mon, 27 Apr 2009 21:07:55 +0000 Subject: [PATCH] =?UTF-8?q?-=20Added=20a=20compatibility=20flag=20for=20Re?= =?UTF-8?q?surrection=20Balm=20=E2=80=93=20if=20set,=20it's=20not=20requir?= =?UTF-8?q?ed=20for=20Raise=20Dead=20or=20Resurrect=20-=20The=20flag=20is?= =?UTF-8?q?=20automatically=20set=20or=20unset=20as=20appropriate=20when?= =?UTF-8?q?=20loading=20a=20party,=20based=20on=20the=20version=20of=20the?= =?UTF-8?q?=20scenario=20they're=20in.=20-=20The=20flag=20is=20also=20auto?= =?UTF-8?q?matically=20set=20and=20unset=20when=20entering=20a=20scenario.?= =?UTF-8?q?=20-=20Commented=20some=20probably=20redundant=20code=20in=20fi?= =?UTF-8?q?re=5Fmissile()=20-=20Added=20Map=20Not=20Available=20option=20(?= =?UTF-8?q?or=20was=20that=20last=20revision=3F)=20for=20towns?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit git-svn-id: http://openexile.googlecode.com/svn/trunk@39 4ebdad44-0ea0-11de-aab3-ff745001d230 --- osx/boe.combat.cpp | 89 ++++++++++++++++++++++---------------------- osx/boe.consts.h | 1 + osx/boe.party.cpp | 11 +++++- osx/boe.specials.cpp | 2 +- osx/boe.town.cpp | 19 ++++++++-- osx/misc/fileio.cpp | 7 ++++ 6 files changed, 79 insertions(+), 50 deletions(-) diff --git a/osx/boe.combat.cpp b/osx/boe.combat.cpp index 3b28f7f8..8a9f81ba 100644 --- a/osx/boe.combat.cpp +++ b/osx/boe.combat.cpp @@ -1447,61 +1447,62 @@ void fire_missile(location target) { short skill_item,m_type = 0; cPopulation::cCreature *cur_monst; bool exploding = false; + missile_firer = current_pc; - skill = (overall_mode == MODE_FIRING) ? ADVEN[current_pc].skills[7] : ADVEN[current_pc].skills[6]; + skill = (overall_mode == MODE_FIRING) ? ADVEN[missile_firer].skills[7] : ADVEN[missile_firer].skills[6]; range = (overall_mode == MODE_FIRING) ? 12 : 8; - dam = ADVEN[current_pc].items[ammo_inv_slot].item_level; - dam_bonus = ADVEN[current_pc].items[ammo_inv_slot].bonus + minmax(-8,8,ADVEN[current_pc].status[1]); - hit_bonus = (overall_mode == MODE_FIRING) ? ADVEN[current_pc].items[missile_inv_slot].bonus : 0; - hit_bonus += stat_adj(current_pc,1) - can_see(pc_pos[current_pc],target,0) - + minmax(-8,8,ADVEN[current_pc].status[1]); - if ((skill_item = pc_has_abil_equip(current_pc,41)) < 24) { - hit_bonus += ADVEN[current_pc].items[skill_item].ability_strength / 2; - dam_bonus += ADVEN[current_pc].items[skill_item].ability_strength / 2; + dam = ADVEN[missile_firer].items[ammo_inv_slot].item_level; + dam_bonus = ADVEN[missile_firer].items[ammo_inv_slot].bonus + minmax(-8,8,ADVEN[missile_firer].status[1]); + hit_bonus = (overall_mode == MODE_FIRING) ? ADVEN[missile_firer].items[missile_inv_slot].bonus : 0; + hit_bonus += stat_adj(missile_firer,1) - can_see(pc_pos[missile_firer],target,0) + + minmax(-8,8,ADVEN[missile_firer].status[1]); + if ((skill_item = pc_has_abil_equip(missile_firer,41)) < 24) { + hit_bonus += ADVEN[missile_firer].items[skill_item].ability_strength / 2; + dam_bonus += ADVEN[missile_firer].items[skill_item].ability_strength / 2; } // race adj. - if (ADVEN[current_pc].race == 1) + if (ADVEN[missile_firer].race == 1) hit_bonus += 2; - if (ADVEN[current_pc].items[ammo_inv_slot].ability == 172) + if (ADVEN[missile_firer].items[ammo_inv_slot].ability == 172) exploding = true; - if (dist(pc_pos[current_pc],target) > range) + if (dist(pc_pos[missile_firer],target) > range) add_string_to_buf(" Out of range."); - else if (can_see(pc_pos[current_pc],target,0) >= 5) + else if (can_see(pc_pos[missile_firer],target,0) >= 5) add_string_to_buf(" Can't see target. "); else { // First, some missiles do special things if (exploding) { take_ap((overall_mode == MODE_FIRING) ? 3 : 2); add_string_to_buf(" The arrow explodes! "); - run_a_missile(pc_pos[current_pc],target,2,1,5, + run_a_missile(pc_pos[missile_firer],target,2,1,5, 0,0,100); - start_missile_anim(); - add_missile(target,2,1, 0, 0); - do_missile_anim(100,pc_pos[current_pc], 5); + //start_missile_anim(); + //add_missile(target,2,1, 0, 0); + //do_missile_anim(100,pc_pos[missile_firer], 5); place_spell_pattern(rad2,target, - 50 + ADVEN[current_pc].items[ammo_inv_slot].ability_strength * 2,true,current_pc); + 50 + ADVEN[missile_firer].items[ammo_inv_slot].ability_strength * 2,true,missile_firer); do_explosion_anim(5,0); - end_missile_anim(); + //end_missile_anim(); handle_marked_damage(); } else { - combat_posing_monster = current_working_monster = current_pc; + combat_posing_monster = current_working_monster = missile_firer; draw_terrain(2); - void_sanctuary(current_pc); + void_sanctuary(missile_firer); //play_sound((overall_mode == MODE_FIRING) ? 12 : 14); take_ap((overall_mode == MODE_FIRING) ? 3 : 2); - missile_firer = current_pc; + missile_firer = missile_firer; r1 = get_ran(1,1,100) - 5 * hit_bonus - 10; - r1 += 5 * (ADVEN[current_pc].status[6] / 3); + r1 += 5 * (ADVEN[missile_firer].status[6] / 3); r2 = get_ran(1,1,dam) + dam_bonus; - sprintf ((char *) create_line, "%s fires.",(char *) ADVEN[current_pc].name); // debug + sprintf ((char *) create_line, "%s fires.",(char *) ADVEN[missile_firer].name); // debug add_string_to_buf((char *) create_line); switch (overall_mode) { case MODE_THROWING: - switch (ADVEN[current_pc].items[ammo_inv_slot].item_level) { + switch (ADVEN[missile_firer].items[ammo_inv_slot].item_level) { case 7:m_type = 10;break; case 4:m_type = 1;break; case 8:m_type = 5;break; @@ -1510,31 +1511,31 @@ void fire_missile(location target) { } break; case MODE_FIRING: case MODE_FANCY_TARGET: - m_type = (ADVEN[current_pc].items[ammo_inv_slot].is_magic() == true) ? 4 : 3; + m_type = (ADVEN[missile_firer].items[ammo_inv_slot].is_magic() == true) ? 4 : 3; break; } - run_a_missile(pc_pos[current_pc],target,m_type,1,(overall_mode == MODE_FIRING) ? 12 : 14, + run_a_missile(pc_pos[missile_firer],target,m_type,1,(overall_mode == MODE_FIRING) ? 12 : 14, 0,0,100); if (r1 > hit_chance[skill]) add_string_to_buf(" Missed."); else if ((targ_monst = monst_there(target)) < T_M) { cur_monst = &univ.town.monst.dudes[targ_monst]; - spec_dam = calc_spec_dam(ADVEN[current_pc].items[ammo_inv_slot].ability, - ADVEN[current_pc].items[ammo_inv_slot].ability_strength,cur_monst); - if (ADVEN[current_pc].items[ammo_inv_slot].ability == 176) { + spec_dam = calc_spec_dam(ADVEN[missile_firer].items[ammo_inv_slot].ability, + ADVEN[missile_firer].items[ammo_inv_slot].ability_strength,cur_monst); + if (ADVEN[missile_firer].items[ammo_inv_slot].ability == 176) { ASB(" There is a flash of light."); cur_monst->m_d.health += r2; } - else damage_monst(targ_monst, current_pc, r2, spec_dam, DAMAGE_WEAPON,13); + else damage_monst(targ_monst, missile_firer, r2, spec_dam, DAMAGE_WEAPON,13); - //if (ADVEN[current_pc].items[ammo_inv_slot].ability == 33) + //if (ADVEN[missile_firer].items[ammo_inv_slot].ability == 33) // hit_space(cur_monst->m_loc,get_ran(3,1,6),1,1,1); // poison - if ((ADVEN[current_pc].status[0] > 0) && (ADVEN[current_pc].weap_poisoned == ammo_inv_slot)) { - poison_amt = ADVEN[current_pc].status[0]; - if (pc_has_abil_equip(current_pc,51) < 24) + if ((ADVEN[missile_firer].status[0] > 0) && (ADVEN[missile_firer].weap_poisoned == ammo_inv_slot)) { + poison_amt = ADVEN[missile_firer].status[0]; + if (pc_has_abil_equip(missile_firer,51) < 24) poison_amt++; poison_monst(cur_monst,poison_amt); } @@ -1544,20 +1545,20 @@ void fire_missile(location target) { } - if (ADVEN[current_pc].items[ammo_inv_slot].variety != 25) { - if (ADVEN[current_pc].items[ammo_inv_slot].ability != 170) - ADVEN[current_pc].items[ammo_inv_slot].charges--; - else ADVEN[current_pc].items[ammo_inv_slot].charges = 1; - if ((pc_has_abil_equip(current_pc,11) < 24) && (ADVEN[current_pc].items[ammo_inv_slot].ability != 170)) - ADVEN[current_pc].items[ammo_inv_slot].charges--; - if (ADVEN[current_pc].items[ammo_inv_slot].charges <= 0) - take_item(current_pc,ammo_inv_slot); + if (ADVEN[missile_firer].items[ammo_inv_slot].variety != 25) { + if (ADVEN[missile_firer].items[ammo_inv_slot].ability != 170) + ADVEN[missile_firer].items[ammo_inv_slot].charges--; + else ADVEN[missile_firer].items[ammo_inv_slot].charges = 1; + if ((pc_has_abil_equip(missile_firer,11) < 24) && (ADVEN[missile_firer].items[ammo_inv_slot].ability != 170)) + ADVEN[missile_firer].items[ammo_inv_slot].charges--; + if (ADVEN[missile_firer].items[ammo_inv_slot].charges <= 0) + take_item(missile_firer,ammo_inv_slot); } } if(!exploding){ combat_posing_monster = current_working_monster = -1; - ADVEN[current_pc].status[0] = move_to_zero(ADVEN[current_pc].status[0]); + ADVEN[missile_firer].status[0] = move_to_zero(ADVEN[missile_firer].status[0]); } print_buf(); } diff --git a/osx/boe.consts.h b/osx/boe.consts.h index 17d4bf89..06d8cc41 100644 --- a/osx/boe.consts.h +++ b/osx/boe.consts.h @@ -45,6 +45,7 @@ #define SDF_SKIP_STARTUP 305][4 // preferably deprecated #define SDF_LESS_SOUND 305][5 #define SDF_NO_TARGET_LINE 305][6 +#define SDF_RESURRECT_NO_BALM 305][8 #define SDF_HOSTILES_PRESENT 305][9 #define SDF_NO_MAPS 306][0 #define SDF_NO_SOUNDS 306][1 diff --git a/osx/boe.party.cpp b/osx/boe.party.cpp index 4ca0735b..ad6416d6 100644 --- a/osx/boe.party.cpp +++ b/osx/boe.party.cpp @@ -536,6 +536,13 @@ void put_party_in_scen(string scen_name) // this is kludgy, put here to prevent problems for (i = 0; i < 50; i++) univ.party.spec_items[i] = (scenario.special_items[i] >= 10) ? 1 : 0; + + // Compatibility flags + if(scenario.format.prog_make_ver[0] < 2){ + PSD[SDF_RESURRECT_NO_BALM] = 1; + } else { + PSD[SDF_RESURRECT_NO_BALM] = 0; + } } bool create_pc(short spot,short parent_num) @@ -1500,7 +1507,7 @@ void do_mage_spell(short pc_num,short spell_num) item = pc_has_abil(pc_num,158);//// if (item == 24) add_string_to_buf(" You need a sapphire. "); - else if (univ.town.town->specials2 % 10 == 1) + else if (univ.town.town->specials2 & 1) add_string_to_buf(" The spell fails. "); else { remove_charge(pc_num,item); @@ -1870,7 +1877,7 @@ void do_priest_spell(short pc_num,short spell_num) //// sprintf ((char *) c_line," Your items glow. "); } - if ((spell_num == 40) || (spell_num == 56)) + if (!PSD[SDF_RESURRECT_NO_BALM] && ((spell_num == 40) || (spell_num == 56))) if ((item = pc_has_abil(pc_num,160)) == 24) { add_string_to_buf(" Need resurrection balm. "); spell_num = 500; diff --git a/osx/boe.specials.cpp b/osx/boe.specials.cpp index 43a55f77..aeb76de6 100644 --- a/osx/boe.specials.cpp +++ b/osx/boe.specials.cpp @@ -859,7 +859,7 @@ effect_pat_type s = {{{0,0,0,0,0,0,0,0,0}, } break; case 131: - if (univ.town.town->specials2 % 10 == 1) { + if (univ.town.town->specials2 & 1) { add_string_to_buf(" It doesn't work."); break; } diff --git a/osx/boe.town.cpp b/osx/boe.town.cpp index f9ad5cea..77c4c7a5 100644 --- a/osx/boe.town.cpp +++ b/osx/boe.town.cpp @@ -1365,7 +1365,7 @@ void clear_map() pascal void draw_map (DialogPtr the_dialog, short the_item) //the_item; // Being sneaky - if this gets value of 5, this is not a full restore - - // just update near party, if it gets 11, blank univ.out.out middle and leave + // just update near party, if it gets 11, blank out middle and leave // No redrawing in gworld // If a 10, do a regular full restore // Also, can get a 5 even when the window is not up, so have to make @@ -1386,7 +1386,7 @@ pascal void draw_map (DialogPtr the_dialog, short the_item) short small_adj = 0; unsigned char what_ter,what_ter2; bool draw_surroundings = false,expl,expl2; - short total_size = 48; // if full redraw, use this to figure univ.out.out everything + short total_size = 48; // if full redraw, use this to figure out everything Rect area_to_put_on_map_rect; Rect custom_from; @@ -1523,7 +1523,20 @@ pascal void draw_map (DialogPtr the_dialog, short the_item) SetPort(old_port); return; } - } + }else if((is_town() && univ.town.town->specials2 & 1)) { + if (modeless_exists[5] == true) { + SetPort(GetDialogPort(the_dialog)); + FillCRect(&map_bar_rect,bg[4]); + char_port_draw_string( GetDialogPort(modeless_dialogs[5]), + map_bar_rect,"This place defies mapping.",0,12,false); + draw_pcs = false; + SetPort( map_gworld); + } + else { + SetPort(old_port); + return; + } + } else { if (modeless_exists[5] == true) { //SetPort(the_dialog); diff --git a/osx/misc/fileio.cpp b/osx/misc/fileio.cpp index 90a95caf..edac53a6 100644 --- a/osx/misc/fileio.cpp +++ b/osx/misc/fileio.cpp @@ -1090,6 +1090,13 @@ bool load_party(FSSpec file_to_load){ strcpy(univ.party.scen_name,""); } + // Compatibility flags + if(in_scen && scenario.format.prog_make_ver[0] < 2){ + univ.party.stuff_done[305][8] = 1; + } else { + univ.party.stuff_done[305][8] = 0; + } + return true; }