X-Git-Url: http://git.osdn.net/view?a=blobdiff_plain;f=src%2Fcmd2.c;h=c6af4a167a471f51a1d332afba8a217ba8649421;hb=827b58461e81870e2d93e290078b8e9e0649d580;hp=251a555e7880a7969043df723c37d23b49ec85f5;hpb=a6ff2a43ef6446d63730373c9bfb5c41dec1e1ca;p=hengband%2Fhengband.git diff --git a/src/cmd2.c b/src/cmd2.c index 251a555e7..c6af4a167 100644 --- a/src/cmd2.c +++ b/src/cmd2.c @@ -95,6 +95,11 @@ void do_cmd_go_up(void) /* Activate the quest */ if (!quest[p_ptr->inside_quest].status) { + if (quest[p_ptr->inside_quest].type != QUEST_TYPE_RANDOM) + { + init_flags = INIT_ASSIGN; + process_dungeon_file("q_info.txt", 0, 0, 0, 0); + } quest[p_ptr->inside_quest].status = QUEST_STATUS_TAKEN; } @@ -264,6 +269,11 @@ void do_cmd_go_down(void) /* Activate the quest */ if (!quest[p_ptr->inside_quest].status) { + if (quest[p_ptr->inside_quest].type != QUEST_TYPE_RANDOM) + { + init_flags = INIT_ASSIGN; + process_dungeon_file("q_info.txt", 0, 0, 0, 0); + } quest[p_ptr->inside_quest].status = QUEST_STATUS_TAKEN; } @@ -438,7 +448,7 @@ void do_cmd_search(void) /* * Determine if a grid contains a chest */ -static s16b chest_check(int y, int x) +static s16b chest_check(int y, int x, bool trapped) { cave_type *c_ptr = &cave[y][x]; @@ -459,8 +469,13 @@ static s16b chest_check(int y, int x) /* Skip unknown chests XXX XXX */ /* if (!(o_ptr->marked & OM_FOUND)) continue; */ - /* Check for chest */ - if (o_ptr->tval == TV_CHEST) return (this_o_idx); + /* Check for non empty chest */ + if ((o_ptr->tval == TV_CHEST) && + (((!trapped) && (o_ptr->pval)) || /* non empty */ + ((trapped) && (o_ptr->pval > 0)))) /* trapped only */ + { + return (this_o_idx); + } } /* No chest */ @@ -1032,7 +1047,7 @@ static int count_chests(int *y, int *x, bool trapped) int xx = px + ddx_ddd[d]; /* No (visible) chest is there */ - if ((o_idx = chest_check(yy, xx)) == 0) continue; + if ((o_idx = chest_check(yy, xx, FALSE)) == 0) continue; /* Grab the object */ o_ptr = &o_list[o_idx]; @@ -1261,7 +1276,7 @@ void do_cmd_open(void) feat = get_feat_mimic(c_ptr); /* Check for chest */ - o_idx = chest_check(y, x); + o_idx = chest_check(y, x, FALSE); /* Nothing useful */ if (!have_flag(f_info[feat].flags, FF_OPEN) && !o_idx) @@ -2198,7 +2213,7 @@ void do_cmd_disarm(void) feat = get_feat_mimic(c_ptr); /* Check for chests */ - o_idx = chest_check(y, x); + o_idx = chest_check(y, x, TRUE); /* Disarm a trap */ if (!is_trap(feat) && !o_idx) @@ -3718,8 +3733,8 @@ void do_cmd_fire_aux(int item, object_type *j_ptr) armour = r_ptr->ac; if (p_ptr->concent) { - armour *= (10 - p_ptr->concent); - armour /= 10; + armour *= (8 - p_ptr->concent); + armour /= 8; } /* Did we hit it (penalize range) */ @@ -3791,7 +3806,7 @@ void do_cmd_fire_aux(int item, object_type *j_ptr) { /* Apply special damage XXX XXX XXX */ tdam = tot_dam_aux_shot(q_ptr, tdam, m_ptr); - tdam = critical_shot(q_ptr->weight, q_ptr->to_h, tdam); + tdam = critical_shot(q_ptr->weight, q_ptr->to_h, j_ptr->to_h, tdam); /* No negative damage */ if (tdam < 0) tdam = 0; @@ -3845,7 +3860,8 @@ void do_cmd_fire_aux(int item, object_type *j_ptr) else { /* STICK TO */ - if (object_is_fixed_artifact(q_ptr)) + if (object_is_fixed_artifact(q_ptr) && + (p_ptr->pclass != CLASS_SNIPER || p_ptr->concent == 0)) { char m_name[80]; @@ -4114,7 +4130,7 @@ bool do_cmd_throw_aux(int mult, bool boomerang, int shuriken) int i, j, y, x, ty, tx, prev_y, prev_x; int ny[19], nx[19]; int chance, tdam, tdis; - int mul, div; + int mul, div, dd, ds; int cur_dis, visible; object_type forge; @@ -4235,6 +4251,7 @@ bool do_cmd_throw_aux(int mult, bool boomerang, int shuriken) /* Extract the thrown object's flags. */ object_flags(q_ptr, flgs); + torch_flags(q_ptr, flgs); /* Distribute the charges of rods/wands between the stacks */ distribute_charges(o_ptr, q_ptr, 1); @@ -4449,10 +4466,13 @@ bool do_cmd_throw_aux(int mult, bool boomerang, int shuriken) } /* Hack -- Base damage from thrown object */ - tdam = damroll(q_ptr->dd, q_ptr->ds); + dd = q_ptr->dd; + ds = q_ptr->ds; + torch_dice(q_ptr, &dd, &ds); /* throwing a torch */ + tdam = damroll(dd, ds); /* Apply special damage XXX XXX XXX */ tdam = tot_dam_aux(q_ptr, tdam, m_ptr, 0, TRUE); - tdam = critical_shot(q_ptr->weight, q_ptr->to_h, tdam); + tdam = critical_shot(q_ptr->weight, q_ptr->to_h, 0, tdam); if (q_ptr->to_d > 0) tdam += q_ptr->to_d; else @@ -4539,6 +4559,9 @@ bool do_cmd_throw_aux(int mult, bool boomerang, int shuriken) } } + /* decrease toach's fuel */ + if (hit_body) torch_lost_fuel(q_ptr); + /* Chance of breakage (during attacks) */ j = (hit_body ? breakage_chance(q_ptr) : 0); @@ -4771,24 +4794,63 @@ void forget_travel_flow(void) for (x = 0; x < cur_wid; x++) { /* Forget the old data */ - travel.cost[y][x] = TRAVEL_UNABLE; - } + travel.cost[y][x] = MAX_SHORT; + } } + + travel.y = travel.x = 0; } -static bool travel_flow_aux(int y, int x, int n, bool wall) +static int travel_flow_cost(int y, int x) +{ + feature_type *f_ptr = &f_info[cave[y][x].feat]; + int cost = 1; + + /* Avoid obstacles (ex. trees) */ + if (have_flag(f_ptr->flags, FF_AVOID_RUN)) cost += 1; + + /* Water */ + if (have_flag(f_ptr->flags, FF_WATER)) + { + if (have_flag(f_ptr->flags, FF_DEEP) && !p_ptr->levitation) cost += 5; + } + + /* Lava */ + if (have_flag(f_ptr->flags, FF_LAVA)) + { + int lava = 2; + if (!p_ptr->resist_fire) lava *= 2; + if (!p_ptr->levitation) lava *= 2; + if (have_flag(f_ptr->flags, FF_DEEP)) lava *= 2; + + cost += lava; + } + + /* Detected traps and doors */ + if (cave[y][x].info & (CAVE_MARK)) + { + if (have_flag(f_ptr->flags, FF_DOOR)) cost += 1; + if (have_flag(f_ptr->flags, FF_TRAP)) cost += 10; + } + + return (cost); +} + +static void travel_flow_aux(int y, int x, int n, bool wall) { cave_type *c_ptr = &cave[y][x]; feature_type *f_ptr = &f_info[c_ptr->feat]; int old_head = flow_head; - - n = n % TRAVEL_UNABLE; + int add_cost = 1; + int base_cost = (n % TRAVEL_UNABLE); + int from_wall = (n / TRAVEL_UNABLE); + int cost; /* Ignore out of bounds */ - if (!in_bounds(y, x)) return wall; + if (!in_bounds(y, x)) return; - /* Ignore "pre-stamped" entries */ - if (travel.cost[y][x] != TRAVEL_UNABLE) return wall; + /* Ignore unknown grid except in wilderness */ + if (dun_level > 0 && !(c_ptr->info & CAVE_KNOWN)) return; /* Ignore "walls" and "rubble" (include "secret doors") */ if (have_flag(f_ptr->flags, FF_WALL) || @@ -4796,16 +4858,21 @@ static bool travel_flow_aux(int y, int x, int n, bool wall) (have_flag(f_ptr->flags, FF_DOOR) && cave[y][x].mimic) || (!have_flag(f_ptr->flags, FF_MOVE) && have_flag(f_ptr->flags, FF_CAN_FLY) && !p_ptr->levitation)) { - if (!wall) return wall; + if (!wall || !from_wall) return; + add_cost += TRAVEL_UNABLE; } else { - wall = FALSE; + add_cost = travel_flow_cost(y, x); } + cost = base_cost + add_cost; + + /* Ignore lower cost entries */ + if (travel.cost[y][x] <= cost) return; + /* Save the flow cost */ - travel.cost[y][x] = n; - if (wall) travel.cost[y][x] += TRAVEL_UNABLE; + travel.cost[y][x] = cost; /* Enqueue that entry */ temp2_y[flow_head] = y; @@ -4817,7 +4884,7 @@ static bool travel_flow_aux(int y, int x, int n, bool wall) /* Hack -- notice overflow by forgetting new entry */ if (flow_head == flow_tail) flow_head = old_head; - return wall; + return; } @@ -4825,15 +4892,16 @@ static void travel_flow(int ty, int tx) { int x, y, d; bool wall = FALSE; - feature_type *f_ptr = &f_info[cave[ty][tx].feat]; + feature_type *f_ptr = &f_info[cave[py][px].feat]; /* Reset the "queue" */ flow_head = flow_tail = 0; + /* is player in the wall? */ if (!have_flag(f_ptr->flags, FF_MOVE)) wall = TRUE; - /* Add the player's grid to the queue */ - wall = travel_flow_aux(ty, tx, 0, wall); + /* Start at the target grid */ + travel_flow_aux(ty, tx, 0, wall); /* Now process the queue */ while (flow_head != flow_tail) @@ -4845,11 +4913,14 @@ static void travel_flow(int ty, int tx) /* Forget that entry */ if (++flow_tail == MAX_SHORT) flow_tail = 0; + /* Ignore too far entries */ + //if (distance(ty, tx, y, x) > 100) continue; + /* Add the "children" */ for (d = 0; d < 8; d++) { /* Add that child if "legal" */ - wall = travel_flow_aux(y + ddy_ddd[d], x + ddx_ddd[d], travel.cost[y][x] + 1, wall); + travel_flow_aux(y + ddy_ddd[d], x + ddx_ddd[d], travel.cost[y][x], wall); } } @@ -4863,7 +4934,13 @@ void do_cmd_travel(void) int dx, dy, sx, sy; feature_type *f_ptr; - if (!tgt_pt(&x, &y)) return; + if (travel.x != 0 && travel.y != 0 && + get_check(_("¥È¥é¥Ù¥ë¤ò·Ñ³¤·¤Þ¤¹¤«¡©", "Do you continue to travel?"))) + { + y = travel.y; + x = travel.x; + } + else if (!tgt_pt(&x, &y)) return; if ((x == px) && (y == py)) { @@ -4890,12 +4967,12 @@ void do_cmd_travel(void) return; } - travel.x = x; - travel.y = y; - forget_travel_flow(); travel_flow(y, x); + travel.x = x; + travel.y = y; + /* Travel till 255 steps */ travel.run = 255;