本文整理汇总了C++中py_attack函数的典型用法代码示例。如果您正苦于以下问题:C++ py_attack函数的具体用法?C++ py_attack怎么用?C++ py_attack使用的例子?那么恭喜您, 这里精选的函数代码示例或许可以为您提供帮助。
在下文中一共展示了py_attack函数的20个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于我们的系统推荐出更棒的C++代码示例。
示例1: monk_double_attack_spell
void monk_double_attack_spell(int cmd, variant *res)
{
switch (cmd)
{
case SPELL_NAME:
var_set_string(res, "Double Attack");
break;
case SPELL_DESC:
var_set_string(res, "Attack twice at an adjacent enemy. This action consumes double the normal energy.");
break;
case SPELL_CAST:
var_set_bool(res, FALSE);
if (_monk_check_spell())
{
int x, y, dir = 0;
if (!get_rep_dir(&dir, FALSE)) return;
y = py + ddy[dir];
x = px + ddx[dir];
if (cave[y][x].m_idx)
{
if (one_in_(2)) msg_print("Ahhhtatatatatatatatatatatatatatataatatatatattaaaaa!!!!");
else msg_print("Oraoraoraoraoraoraoraoraoraoraoraoraoraoraoraoraora!!!!");
py_attack(y, x, 0);
if (cave[y][x].m_idx)
{
handle_stuff();
py_attack(y, x, 0);
}
}
else
{
msg_print("You don't see any monster in this direction");
msg_print(NULL);
}
var_set_bool(res, TRUE);
}
break;
case SPELL_ENERGY:
var_set_int(res, 100 + ENERGY_NEED());
break;
default:
default_spell(cmd, res);
break;
}
}
开发者ID:poschengband,项目名称:poschengband,代码行数:48,代码来源:monk.c
示例2: _scatter_spell
void _scatter_spell(int cmd, variant *res)
{
switch (cmd)
{
case SPELL_NAME:
var_set_string(res, "Scatter");
break;
case SPELL_DESC:
var_set_string(res, "Attack all adjacent monsters with a single strike. If landed, your enemies will be scattered away from you.");
break;
case SPELL_CAST:
{
int dir, x, y;
cave_type *c_ptr;
monster_type *m_ptr;
for (dir = 0; dir < 8; dir++)
{
y = py + ddy_ddd[dir];
x = px + ddx_ddd[dir];
c_ptr = &cave[y][x];
m_ptr = &m_list[c_ptr->m_idx];
if (c_ptr->m_idx && (m_ptr->ml || cave_have_flag_bold(y, x, FF_PROJECT)))
py_attack(y, x, MAULER_SCATTER);
}
var_set_bool(res, TRUE);
break;
}
default:
default_spell(cmd, res);
break;
}
}
开发者ID:bamhamcity,项目名称:lessxpcb,代码行数:35,代码来源:mauler.c
示例3: do_cmd_tunnel
/*
* Tunnel through "walls" (including rubble and secret doors)
*
* Digging is very difficult without a "digger" weapon, but can be
* accomplished by strong players using heavy weapons.
*/
void do_cmd_tunnel(cmd_code code, cmd_arg args[])
{
int y, x, dir;
bool more = FALSE;
dir = args[0].direction;
/* Get location */
y = p_ptr->py + ddy[dir];
x = p_ptr->px + ddx[dir];
/* Oops */
if (!do_cmd_tunnel_test(y, x))
{
/* Cancel repeat */
disturb(0, 0);
return;
}
/* Take a turn */
p_ptr->energy_use = 100;
/* Apply confusion */
if (confuse_dir(&dir))
{
/* Get location */
y = p_ptr->py + ddy[dir];
x = p_ptr->px + ddx[dir];
}
/* Monster */
if (cave_m_idx[y][x] > 0)
{
if (mon_list[cave_m_idx[y][x]].align & (AL_PET_MASK))
{
msg_print("There is a friendly monster in the way!");
}
else
{
/* Message */
msg_print("There is a monster in the way!");
/* Attack */
py_attack(y, x);
}
}
/* Walls */
else
{
/* Tunnel through walls */
more = do_cmd_tunnel_aux(y, x);
}
/* Cancel repetition unless we can continue */
if (!more) disturb(0, 0);
}
开发者ID:NickMcConnell,项目名称:RePosBand,代码行数:65,代码来源:cmd2.c
示例4: do_cmd_close
/*
* Close an open door.
*/
void do_cmd_close(cmd_code code, cmd_arg args[])
{
int y, x, dir;
bool more = FALSE;
dir = args[0].direction;
/* Get location */
y = p_ptr->py + ddy[dir];
x = p_ptr->px + ddx[dir];
/* Verify legality */
if (!do_cmd_close_test(y, x))
{
/* Cancel repeat */
disturb(0, 0);
return;
}
/* Take a turn */
p_ptr->energy_use = 100;
/* Apply confusion */
if (confuse_dir(&dir))
{
/* Get location */
y = p_ptr->py + ddy[dir];
x = p_ptr->px + ddx[dir];
}
/* Monster */
if (cave_m_idx[y][x] > 0)
{
if (mon_list[cave_m_idx[y][x]].align & (AL_PET_MASK))
msg_print("There is a friendly monster in the way!");
else
{
/* Message */
msg_print("There is a monster in the way!");
/* Attack */
py_attack(y, x);
}
}
/* Door */
else
{
/* Close door */
more = do_cmd_close_aux(y, x);
}
/* Cancel repeat unless told not to */
if (!more) disturb(0, 0);
}
开发者ID:NickMcConnell,项目名称:RePosBand,代码行数:60,代码来源:cmd2.c
示例5: do_cmd_close
/**
* Close an open door.
*/
void do_cmd_close(struct command *cmd)
{
int y, x, dir;
int err;
bool more = false;
/* Get arguments */
err = cmd_get_arg_direction(cmd, "direction", &dir);
if (err || dir == DIR_UNKNOWN) {
int y2, x2;
/* Count open doors */
if (count_feats(&y2, &x2, square_isopendoor, false) == 1) {
dir = coords_to_dir(y2, x2);
cmd_set_arg_direction(cmd, "direction", dir);
} else if (cmd_get_direction(cmd, "direction", &dir, false)) {
return;
}
}
/* Get location */
y = player->py + ddy[dir];
x = player->px + ddx[dir];
/* Verify legality */
if (!do_cmd_close_test(y, x)) {
/* Cancel repeat */
disturb(player, 0);
return;
}
/* Take a turn */
player->upkeep->energy_use = z_info->move_energy;
/* Apply confusion */
if (player_confuse_dir(player, &dir, false)) {
/* Get location */
y = player->py + ddy[dir];
x = player->px + ddx[dir];
}
/* Monster - alert, then attack */
if (cave->squares[y][x].mon > 0) {
msg("There is a monster in the way!");
py_attack(y, x);
} else
/* Door - close it */
more = do_cmd_close_aux(y, x);
/* Cancel repeat unless told not to */
if (!more) disturb(player, 0);
}
开发者ID:pete-mack,项目名称:angband,代码行数:56,代码来源:cmd-cave.c
示例6: do_cmd_tunnel
/*
* Tunnel through "walls" (including rubble and secret doors)
*
* Digging is very difficult without a "digger" weapon, but can be
* accomplished by strong players using heavy weapons.
*/
void do_cmd_tunnel(cmd_code code, cmd_arg args[])
{
int y, x, dir;
bool more = FALSE;
dir = args[0].direction;
/* Get location */
y = p_ptr->py + ddy[dir];
x = p_ptr->px + ddx[dir];
/* Oops */
if (!do_cmd_tunnel_test(y, x))
{
/* Cancel repeat */
disturb(p_ptr, 0, 0);
return;
}
/* Take a turn */
p_ptr->energy_use = 100;
/* Apply confusion */
if (player_confuse_dir(p_ptr, &dir, FALSE))
{
/* Get location */
y = p_ptr->py + ddy[dir];
x = p_ptr->px + ddx[dir];
}
/* Monster */
if (cave->m_idx[y][x] > 0)
{
/* Message */
msg("There is a monster in the way!");
/* Attack */
py_attack(y, x);
}
/* Walls */
else
{
/* Tunnel through walls */
more = do_cmd_tunnel_aux(y, x);
}
/* Cancel repetition unless we can continue */
if (!more) disturb(p_ptr, 0, 0);
}
开发者ID:qwerty16,项目名称:angband,代码行数:58,代码来源:cmd2.c
示例7: _charge_spell
static void _charge_spell(int cmd, variant *res)
{
switch (cmd)
{
case SPELL_NAME:
var_set_string(res, "Charge");
break;
case SPELL_DESC:
var_set_string(res, "Attacks monster with your weapons normally, then move through counter side of the monster.");
break;
case SPELL_CAST:
{
int dir, x, y;
var_set_bool(res, FALSE);
if (p_ptr->riding)
{
msg_print("You cannot do it when riding.");
return;
}
if (!get_rep_dir2(&dir)) return;
if (dir == 5) return;
y = py + ddy[dir];
x = px + ddx[dir];
if (!cave[y][x].m_idx)
{
msg_print("There is no monster there.");
return;
}
py_attack(y, x, 0);
if (player_can_enter(cave[y][x].feat, 0) && !is_trap(cave[y][x].feat))
{
y += ddy[dir];
x += ddx[dir];
if (player_can_enter(cave[y][x].feat, 0) && !is_trap(cave[y][x].feat) && !cave[y][x].m_idx)
{
msg_print(NULL);
move_player_effect(y, x, MPE_FORGET_FLOW | MPE_HANDLE_STUFF | MPE_DONT_PICKUP);
}
}
var_set_bool(res, TRUE);
break;
}
default:
default_spell(cmd, res);
break;
}
}
开发者ID:GenericPseudonym,项目名称:pseudoelliposchengband,代码行数:52,代码来源:berserker.c
示例8: do_cmd_close
/*
* Close an open door.
*/
void do_cmd_close(cmd_code code, cmd_arg args[])
{
int y, x, dir;
bool more = FALSE;
dir = args[0].direction;
/* Get location */
y = p_ptr->py + ddy[dir];
x = p_ptr->px + ddx[dir];
/* Verify legality */
if (!do_cmd_close_test(y, x))
{
/* Cancel repeat */
disturb(p_ptr, 0, 0);
return;
}
/* Take a turn */
p_ptr->energy_use = 100;
/* Apply confusion */
if (player_confuse_dir(p_ptr, &dir, FALSE))
{
/* Get location */
y = p_ptr->py + ddy[dir];
x = p_ptr->px + ddx[dir];
}
/* Monster */
if (cave->m_idx[y][x] > 0)
{
/* Message */
msg("There is a monster in the way!");
/* Attack */
py_attack(y, x);
}
/* Door */
else
{
/* Close door */
more = do_cmd_close_aux(y, x);
}
/* Cancel repeat unless told not to */
if (!more) disturb(p_ptr, 0, 0);
}
开发者ID:qwerty16,项目名称:angband,代码行数:55,代码来源:cmd2.c
示例9: do_blow
bool do_blow(int type)
{
int x = 0, y = 0;
int dir;
int m_idx = 0;
/* For ergonomics sake, use currently targeted monster. This allows
a macro of \e*tmaa or similar to pick an adjacent foe, while
\emaa*t won't work, since get_rep_dir2() won't allow a target. */
if (use_old_target && target_okay())
{
y = target_row;
x = target_col;
m_idx = cave[y][x].m_idx;
if (m_idx)
{
if (m_list[m_idx].cdis > 1)
m_idx = 0;
else
dir = 5;
}
}
if (!m_idx)
{
if (!get_rep_dir2(&dir)) return FALSE;
if (dir == 5) return FALSE;
y = py + ddy[dir];
x = px + ddx[dir];
m_idx = cave[y][x].m_idx;
if (!m_idx)
{
msg_print("There is no monster there.");
return FALSE;
}
}
if (m_idx)
py_attack(y, x, type);
return TRUE;
}
开发者ID:bamhamcity,项目名称:lessxpcb,代码行数:45,代码来源:mauler.c
示例10: do_cmd_alter_aux
/*
* Manipulate an adjacent grid in some way
*
* Attack monsters, tunnel through walls, disarm traps, open doors.
*
* This command must always take energy, to prevent free detection
* of invisible monsters.
*
* The "semantics" of this command must be chosen before the player
* is confused, and it must be verified against the new grid.
*/
void do_cmd_alter_aux(int dir)
{
int y, x;
bool more = FALSE;
/* Get location */
y = p_ptr->py + ddy[dir];
x = p_ptr->px + ddx[dir];
/* Take a turn */
p_ptr->energy_use = 100;
/* Apply confusion */
if (player_confuse_dir(p_ptr, &dir, FALSE)) {
/* Get location */
y = p_ptr->py + ddy[dir];
x = p_ptr->px + ddx[dir];
}
/* Attack monsters */
if (cave->m_idx[y][x] > 0)
py_attack(y, x);
/* Tunnel through walls and rubble */
else if (cave_isdiggable(cave, y, x))
more = do_cmd_tunnel_aux(y, x);
/* Open closed doors */
else if (cave_iscloseddoor(cave, y, x))
more = do_cmd_open_aux(y, x);
/* Disarm traps */
else if (cave_isknowntrap(cave, y, x))
more = do_cmd_disarm_aux(y, x);
/* Oops */
else
msg("You spin around.");
/* Cancel repetition unless we can continue */
if (!more) disturb(p_ptr, 0, 0);
}
开发者ID:qwerty16,项目名称:angband,代码行数:53,代码来源:cmd2.c
示例11: do_cmd_tunnel
/**
* Tunnel through "walls" (including rubble and doors, secret or otherwise)
*
* Digging is very difficult without a "digger" weapon, but can be
* accomplished by strong players using heavy weapons.
*/
void do_cmd_tunnel(struct command *cmd)
{
int y, x, dir;
bool more = false;
/* Get arguments */
if (cmd_get_direction(cmd, "direction", &dir, false))
return;
/* Get location */
y = player->py + ddy[dir];
x = player->px + ddx[dir];
/* Oops */
if (!do_cmd_tunnel_test(y, x)) {
/* Cancel repeat */
disturb(player, 0);
return;
}
/* Take a turn */
player->upkeep->energy_use = z_info->move_energy;
/* Apply confusion */
if (player_confuse_dir(player, &dir, false)) {
/* Get location */
y = player->py + ddy[dir];
x = player->px + ddx[dir];
}
/* Attack any monster we run into */
if (cave->squares[y][x].mon > 0) {
msg("There is a monster in the way!");
py_attack(y, x);
} else {
/* Tunnel through walls */
more = do_cmd_tunnel_aux(y, x);
}
/* Cancel repetition unless we can continue */
if (!more) disturb(player, 0);
}
开发者ID:pete-mack,项目名称:angband,代码行数:48,代码来源:cmd-cave.c
示例12: do_cmd_alter_aux
/**
* Manipulate an adjacent grid in some way
*
* Attack monsters, tunnel through walls, disarm traps, open doors.
*
* This command must always take energy, to prevent free detection
* of invisible monsters.
*
* The "semantics" of this command must be chosen before the player
* is confused, and it must be verified against the new grid.
*/
void do_cmd_alter_aux(int dir)
{
int y, x;
bool more = false;
/* Get location */
y = player->py + ddy[dir];
x = player->px + ddx[dir];
/* Take a turn */
player->upkeep->energy_use = z_info->move_energy;
/* Apply confusion */
if (player_confuse_dir(player, &dir, false)) {
/* Get location */
y = player->py + ddy[dir];
x = player->px + ddx[dir];
}
/* Action depends on what's there */
if (cave->squares[y][x].mon > 0)
/* Attack monsters */
py_attack(y, x);
else if (square_isdiggable(cave, y, x))
/* Tunnel through walls and rubble */
more = do_cmd_tunnel_aux(y, x);
else if (square_iscloseddoor(cave, y, x))
/* Open closed doors */
more = do_cmd_open_aux(y, x);
else if (square_isknowntrap(cave, y, x))
/* Disarm traps */
more = do_cmd_disarm_aux(y, x);
else
/* Oops */
msg("You spin around.");
/* Cancel repetition unless we can continue */
if (!more) disturb(player, 0);
}
开发者ID:pete-mack,项目名称:angband,代码行数:50,代码来源:cmd-cave.c
示例13: awesome_blow_spell
void awesome_blow_spell(int cmd, variant *res)
{
switch (cmd)
{
case SPELL_NAME:
var_set_string(res, "Awesome Blow");
break;
case SPELL_DESC:
var_set_string(res, "Attack a monster with a single melee blow. If blow hits, does normal melee damage and propels the monster backwards.");
break;
case SPELL_CAST:
{
int y, x, dir;
var_set_bool(res, FALSE);
if (!get_rep_dir2(&dir)) return;
if (dir == 5) return;
y = py + ddy[dir];
x = px + ddx[dir];
if (cave[y][x].m_idx)
{
py_attack(y, x, MELEE_AWESOME_BLOW);
}
else
{
msg_print("There is no monster.");
return;
}
var_set_bool(res, TRUE);
break;
}
default:
default_spell(cmd, res);
break;
}
}
开发者ID:MichaelDiBernardo,项目名称:poschengband,代码行数:39,代码来源:spells_a.c
示例14: do_cmd_open
/*
* Open a closed/locked/jammed door or a closed/locked chest.
*
* Unlocking a locked door/chest is worth one experience point.
*/
void do_cmd_open(cmd_code code, cmd_arg args[])
{
int y, x, dir;
s16b o_idx;
bool more = FALSE;
dir = args[0].direction;
/* Get location */
y = p_ptr->py + ddy[dir];
x = p_ptr->px + ddx[dir];
/* Check for chests */
o_idx = chest_check(y, x);
/* Verify legality */
if (!o_idx && !do_cmd_open_test(y, x))
{
/* Cancel repeat */
disturb(0, 0);
return;
}
/* Take a turn */
p_ptr->energy_use = 100;
/* Apply confusion */
if (confuse_dir(&dir))
{
/* Get location */
y = p_ptr->py + ddy[dir];
x = p_ptr->px + ddx[dir];
/* Check for chest */
o_idx = chest_check(y, x);
}
/* Monster */
if (cave_m_idx[y][x] > 0)
{
if (mon_list[cave_m_idx[y][x]].align & (AL_PET_MASK))
msg_print("There is a friendly monster in the way!");
else
{
/* Message */
msg_print("There is a monster in the way!");
/* Attack */
py_attack(y, x);
}
}
/* Chest */
else if (o_idx)
{
/* Open the chest */
more = do_cmd_open_chest(y, x, o_idx);
}
/* Door */
else
{
/* Open the door */
more = do_cmd_open_aux(y, x);
}
/* Cancel repeat unless we may continue */
if (!more) disturb(0, 0);
}
开发者ID:NickMcConnell,项目名称:RePosBand,代码行数:78,代码来源:cmd2.c
示例15: do_cmd_bash
/*
* Bash open a door, success based on character strength
*
* For a closed door, pval is positive if locked; negative if stuck.
*
* For an open door, pval is positive for a broken door.
*
* A closed door can be opened - harder if locked. Any door might be
* bashed open (and thereby broken). Bashing a door is (potentially)
* faster! You move into the door way. To open a stuck door, it must
* be bashed. A closed door can be jammed (see do_cmd_spike()).
*
* Creatures can also open or bash doors, see elsewhere.
*/
void do_cmd_bash(void)
{
int py = p_ptr->py;
int px = p_ptr->px;
int y, x, dir;
bool more = FALSE;
/* Get a direction (or abort) */
if (!get_rep_dir(&dir)) return;
/* Get location */
y = py + ddy[dir];
x = px + ddx[dir];
/* Verify legality */
if (!do_cmd_bash_test(y, x)) return;
/* Take a turn */
p_ptr->energy_use = 100;
/* Apply confusion */
if (confuse_dir(&dir))
{
/* Get location */
y = py + ddy[dir];
x = px + ddx[dir];
}
/* Allow repeated command */
if (p_ptr->command_arg)
{
/* Set repeat count */
p_ptr->command_rep = p_ptr->command_arg - 1;
/* Redraw the state */
p_ptr->redraw |= (PR_STATE);
/* Cancel the arg */
p_ptr->command_arg = 0;
}
/* Monster */
if (cave_m_idx[y][x] > 0)
{
/* Message */
msg_print("There is a monster in the way!");
/* Attack */
py_attack(y, x);
/* Done */
return;
}
/* Door */
else
{
/* Bash the door */
more = do_cmd_bash_aux(y, x);
}
/* Cancel repeat unless told not to */
if (!more) disturb(0, 0);
}
开发者ID:CJNyfalt,项目名称:Oangband,代码行数:84,代码来源:cmd2.c
示例16: do_cmd_open
/**
* Open a closed/locked/jammed door or a closed/locked chest.
*
* Unlocking a locked chest is worth one experience point; since doors are
* player lockable, there is no experience for unlocking doors.
*/
void do_cmd_open(struct command *cmd)
{
int y, x, dir;
struct object *obj;
bool more = false;
int err;
struct monster *m;
/* Get arguments */
err = cmd_get_arg_direction(cmd, "direction", &dir);
if (err || dir == DIR_UNKNOWN) {
int y2, x2;
int n_closed_doors, n_locked_chests;
n_closed_doors = count_feats(&y2, &x2, square_iscloseddoor, false);
n_locked_chests = count_chests(&y2, &x2, CHEST_OPENABLE);
if (n_closed_doors + n_locked_chests == 1) {
dir = coords_to_dir(y2, x2);
cmd_set_arg_direction(cmd, "direction", dir);
} else if (cmd_get_direction(cmd, "direction", &dir, false)) {
return;
}
}
/* Get location */
y = player->py + ddy[dir];
x = player->px + ddx[dir];
/* Check for chest */
obj = chest_check(y, x, CHEST_OPENABLE);
/* Check for door */
if (!obj && !do_cmd_open_test(y, x)) {
/* Cancel repeat */
disturb(player, 0);
return;
}
/* Take a turn */
player->upkeep->energy_use = z_info->move_energy;
/* Apply confusion */
if (player_confuse_dir(player, &dir, false)) {
/* Get location */
y = player->py + ddy[dir];
x = player->px + ddx[dir];
/* Check for chest */
obj = chest_check(y, x, CHEST_OPENABLE);
}
/* Monster */
m = square_monster(cave, y, x);
if (m) {
/* Mimics surprise the player */
if (is_mimicking(m)) {
become_aware(m);
/* Mimic wakes up */
mon_clear_timed(m, MON_TMD_SLEEP, MON_TMD_FLG_NOMESSAGE, false);
} else {
/* Message */
msg("There is a monster in the way!");
/* Attack */
py_attack(y, x);
}
} else if (obj) {
/* Chest */
more = do_cmd_open_chest(y, x, obj);
} else {
/* Door */
more = do_cmd_open_aux(y, x);
}
/* Cancel repeat unless we may continue */
if (!more) disturb(player, 0);
}
开发者ID:pete-mack,项目名称:angband,代码行数:85,代码来源:cmd-cave.c
示例17: move_player
/*
* Move player in the given direction.
*
* This routine should only be called when energy has been expended.
*
* Note that this routine handles monsters in the destination grid,
* and also handles attempting to move into walls/doors/rubble/etc.
*/
void move_player(int dir, bool disarm)
{
int py = p_ptr->py;
int px = p_ptr->px;
int y = py + ddy[dir];
int x = px + ddx[dir];
int m_idx = cave->m_idx[y][x];
/* Attack monsters */
if (m_idx > 0) {
/* Mimics surprise the player */
if (is_mimicking(m_idx)) {
become_aware(m_idx);
/* Mimic wakes up */
mon_clear_timed(m_idx, MON_TMD_SLEEP, MON_TMD_FLG_NOMESSAGE);
} else {
py_attack(y, x);
}
}
/* Optionally alter traps/doors on movement */
else if (disarm && (cave->info[y][x] & CAVE_MARK) &&
(cave_isknowntrap(cave, y, x) ||
cave_iscloseddoor(cave, y, x)))
{
/* Auto-repeat if not already repeating */
if (cmd_get_nrepeats() == 0)
cmd_set_repeat(99);
do_cmd_alter_aux(dir);
}
/* Cannot walk through walls */
else if (!cave_floor_bold(y, x))
{
/* Disturb the player */
disturb(p_ptr, 0, 0);
/* Notice unknown obstacles */
if (!(cave->info[y][x] & CAVE_MARK))
{
/* Rubble */
if (cave->feat[y][x] == FEAT_RUBBLE)
{
msgt(MSG_HITWALL, "You feel a pile of rubble blocking your way.");
cave->info[y][x] |= (CAVE_MARK);
cave_light_spot(cave, y, x);
}
/* Closed door */
else if (cave->feat[y][x] < FEAT_SECRET)
{
msgt(MSG_HITWALL, "You feel a door blocking your way.");
cave->info[y][x] |= (CAVE_MARK);
cave_light_spot(cave, y, x);
}
/* Wall (or secret door) */
else
{
msgt(MSG_HITWALL, "You feel a wall blocking your way.");
cave->info[y][x] |= (CAVE_MARK);
cave_light_spot(cave, y, x);
}
}
/* Mention known obstacles */
else
{
if (cave->feat[y][x] == FEAT_RUBBLE)
msgt(MSG_HITWALL, "There is a pile of rubble blocking your way.");
else if (cave->feat[y][x] < FEAT_SECRET)
msgt(MSG_HITWALL, "There is a door blocking your way.");
else
msgt(MSG_HITWALL, "There is a wall blocking your way.");
}
}
/* Normal movement */
else
{
/* See if trap detection status will change */
bool old_dtrap = ((cave->info2[py][px] & (CAVE2_DTRAP)) != 0);
bool new_dtrap = ((cave->info2[y][x] & (CAVE2_DTRAP)) != 0);
/* Note the change in the detect status */
if (old_dtrap != new_dtrap)
p_ptr->redraw |= (PR_DTRAP);
//.........这里部分代码省略.........
开发者ID:tonberrytoby,项目名称:angband,代码行数:101,代码来源:cmd1.c
示例18: do_cmd_alter
/*
* Manipulate an adjacent grid in some way
*
* Attack monsters, tunnel through walls, disarm traps, open doors,
* or, for rogues, set traps and steal money.
*
* This command must always take energy, to prevent free detection
* of invisible monsters.
*
* The "semantics" of this command must be chosen before the player
* is confused, and it must be verified against the new grid.
*/
void do_cmd_alter(void)
{
int py = p_ptr->py;
int px = p_ptr->px;
int y, x, dir;
int feat;
bool did_nothing = TRUE;
bool more = FALSE;
monster_type *m_ptr;
/* Get a direction */
if (!get_rep_dir(&dir)) return;
/* Get location */
y = py + ddy[dir];
x = px + ddx[dir];
/* Original feature */
feat = cave_feat[y][x];
/* Must have knowledge to know feature XXX XXX */
if (!(cave_info[y][x] & (CAVE_MARK))) feat = FEAT_NONE;
/* Take a turn */
p_ptr->energy_use = 100;
/* Apply confusion */
if (confuse_dir(&dir))
{
/* Get location */
y = py + ddy[dir];
x = px + ddx[dir];
}
/* Allow repeated command */
if (p_ptr->command_arg)
{
/* Set repeat count */
p_ptr->command_rep = p_ptr->command_arg - 1;
/* Redraw the state */
p_ptr->redraw |= (PR_STATE);
/* Cancel the arg */
p_ptr->command_arg = 0;
}
/* If a monster is present, and visible, Rogues may steal from it.
* Otherwise, the player will simply attack. -LM-
*/
if (cave_m_idx[y][x] > 0)
{
if ((check_ability(SP_STEAL)) && (!SCHANGE))
{
m_ptr = &m_list[cave_m_idx[y][x]];
if (m_ptr->ml) py_steal(y, x);
else py_attack(y, x);
}
else py_attack(y, x);
did_nothing = FALSE;
}
/*
* Some players can set traps. Total number is checked in py_set_trap.
*/
else if ((check_ability(SP_TRAP)) && (cave_naked_bold(y, x)))
{
py_set_trap(y, x);
did_nothing = FALSE;
}
/* Disarm advanced monster traps */
else if (feat > FEAT_MTRAP_HEAD)
{
/* Disarm */
more = do_cmd_disarm_aux(y, x);
}
/* Modify basic monster traps */
else if (feat == FEAT_MTRAP_HEAD)
{
//.........这里部分代码省略.........
开发者ID:CJNyfalt,项目名称:Oangband,代码行数:101,代码来源:cmd2.c
示例19: do_cmd_open
/*
* Open a closed/locked/jammed door or a closed/locked chest.
*
* Unlocking a locked door/chest is worth one experience point.
*/
void do_cmd_open(cmd_code code, cmd_arg args[])
{
int y, x, dir;
s16b o_idx;
bool more = FALSE;
dir = args[0].direction;
/* Get location */
y = p_ptr->py + ddy[dir];
x = p_ptr->px + ddx[dir];
/* Check for chests */
o_idx = chest_check(y, x);
/* Verify legality */
if (!o_idx && !do_cmd_open_test(y, x))
{
/* Cancel repeat */
disturb(p_ptr, 0, 0);
return;
}
/* Take a turn */
p_ptr->energy_use = 100;
/* Apply confusion */
if (player_confuse_dir(p_ptr, &dir, FALSE))
{
/* Get location */
y = p_ptr->py + ddy[dir];
x = p_ptr->px + ddx[dir];
/* Check for chest */
o_idx = chest_check(y, x);
}
/* Monster */
if (cave->m_idx[y][x] > 0)
{
int m_idx = cave->m_idx[y][x];
/* Mimics surprise the player */
if (is_mimicking(m_idx)) {
become_aware(m_idx);
/* Mimic wakes up */
mon_clear_timed(m_idx, MON_TMD_SLEEP, MON_TMD_FLG_NOMESSAGE);
} else {
/* Message */
msg("There is a monster in the way!");
/* Attack */
py_attack(y, x);
}
}
/* Chest */
else if (o_idx)
{
/* Open the chest */
more = do_cmd_open_chest(y, x, o_idx);
}
/* Door */
else
{
/* Open the door */
more = do_cmd_open_aux(y, x);
}
/* Cancel repeat unless we may continue */
if (!more) disturb(p_ptr, 0, 0);
}
开发者ID:qwerty16,项目名称:angband,代码行数:83,代码来源:cmd2.c
示例20: move_player
/**
* Move player in the given direction.
*
* This routine should only be called when energy has been expended.
*
* Note that this routine handles monsters in the destination grid,
* and also handles attempting to move into walls/doors/rubble/etc.
*/
void move_player(int dir, bool disarm)
{
int y = player->py + ddy[dir];
int x = player->px + ddx[dir];
int m_idx = cave->squares[y][x].mon;
struct monster *mon = cave_monster(cave, m_idx);
bool alterable = (square_isknowntrap(cave, y, x) ||
square_iscloseddoor(cave, y, x));
/* Attack monsters, alter traps/doors on movement, hit obstacles or move */
if (m_idx > 0) {
/* Mimics surprise the player */
if (is_mimicking(mon)) {
become_aware(mon);
/* Mimic wakes up */
mon_clear_timed(mon, MON_TMD_SLEEP, MON_TMD_FLG_NOMESSAGE, false);
} else {
py_attack(y, x);
}
} else if (disarm && square_isknown(cave, y, x) && alterable) {
/* Auto-repeat if not already repeating */
if (cmd_get_nrepeats() == 0)
cmd_set_repeat(99);
do_cmd_alter_aux(dir);
} else if (player->upkeep->running && square_isknowntrap(cave, y, x)) {
/* Stop running before known traps */
disturb(player, 0);
} else if (!square_ispassable(cave, y, x)) {
disturb(player, 0);
/* Notice unknown obstacles, mention known obstacles */
if (!square_isknown(cave, y, x)) {
if (square_isrubble(cave, y, x)) {
msgt(MSG_HITWALL,
"You feel a pile of rubble blocking your way.");
square_memorize(cave, y, x);
square_light_spot(cave, y, x);
} else if (square_iscloseddoor(cave, y, x)) {
msgt(MSG_HITWALL, "You feel a door blocking your way.");
square_memorize(cave, y, x);
square_light_spot(cave, y, x);
} else {
msgt(MSG_HITWALL, "You feel a wall blocking your way.");
square_memorize(cave, y, x);
square_light_spot(cave, y, x);
}
} else {
if (square_isrubble(cave, y, x))
msgt(MSG_HITWALL,
"There is a pile of rubble blocking your way.");
else if (square_iscloseddoor(cave, y, x))
msgt(MSG_HITWALL, "There is a door blocking your way.");
else
msgt(MSG_HITWALL, "There is a wall blocking your way.");
}
} else {
/* Move player */
monster_swap(player->py, player->px, y, x);
/* Handle store doors, or notice objects */
if (square_isshop(cave, y, x)) {
disturb(player, 0);
event_signal(EVENT_ENTER_STORE);
event_remove_handler_type(EVENT_ENTER_STORE);
event_signal(EVENT_USE_STORE);
event_remove_handler_type(EVENT_USE_STORE);
event_signal(EVENT_LEAVE_STORE);
event_remove_handler_type(EVENT_LEAVE_STORE);
} else {
square_know_pile(cave, y, x);
cmdq_push(CMD_AUTOPICKUP);
}
/* Discover invisible traps, set off visible ones */
if (square_issecrettrap(cave, y, x)) {
disturb(player, 0);
hit_trap(y, x);
} else if (square_isknowntrap(cave, y, x)) {
disturb(player, 0);
hit_trap(y, x);
}
/* Update view and search */
update_view(cave, player);
search();
}
player->upkeep->running_firststep = false;
//.........这里部分代码省略.........
开发者ID:pete-mack,项目名称:angband,代码行数:101,代码来源:cmd-cave.c
注:本文中的py_attack函数示例由纯净天空整理自Github/MSDocs等源码及文档管理平台,相关代码片段筛选自各路编程大神贡献的开源项目,源码版权归原作者所有,传播和使用请参考对应项目的License;未经允许,请勿转载。 |
请发表评论