split getting damages with a kick into separate function

This commit is contained in:
SHIRAKATA Kentaro
2022-05-04 03:19:58 +09:00
parent b53e76813d
commit 4da4584633

View File

@@ -20,6 +20,7 @@ static char *kickstr(char *, const char *);
static boolean watchman_thief_arrest(struct monst *); static boolean watchman_thief_arrest(struct monst *);
static boolean watchman_door_damage(struct monst *, xchar, xchar); static boolean watchman_door_damage(struct monst *, xchar, xchar);
static void kick_dumb(int, int); static void kick_dumb(int, int);
static void kick_ouch(int, int, const char *);
static void otransit_msg(struct obj *, boolean, boolean, long); static void otransit_msg(struct obj *, boolean, boolean, long);
static void drop_to(coord *, schar, xchar, xchar); static void drop_to(coord *, schar, xchar, xchar);
@@ -818,13 +819,40 @@ kick_dumb(int x, int y)
hurtle(-u.dx, -u.dy, 1, TRUE); hurtle(-u.dx, -u.dy, 1, TRUE);
} }
static void
kick_ouch(int x, int y, const char *kickobjnam)
{
int dmg;
char buf[BUFSZ];
pline("Ouch! That hurts!");
exercise(A_DEX, FALSE);
exercise(A_STR, FALSE);
if (isok(x, y)) {
if (Blind)
feel_location(x, y); /* we know we hit it */
if (is_drawbridge_wall(x, y) >= 0) {
pline_The("drawbridge is unaffected.");
/* update maploc to refer to the drawbridge */
(void) find_drawbridge(&x, &y);
g.maploc = &levl[x][y];
}
}
if (!rn2(3))
set_wounded_legs(RIGHT_SIDE, 5 + rnd(5));
dmg = rnd(ACURR(A_CON) > 15 ? 3 : 5);
losehp(Maybe_Half_Phys(dmg), kickstr(buf, kickobjnam), KILLED_BY);
if (Is_airlevel(&u.uz) || Levitation)
hurtle(-u.dx, -u.dy, rn1(2, 4), TRUE); /* assume it's heavy */
}
/* the #kick command */ /* the #kick command */
int int
dokick(void) dokick(void)
{ {
int x, y; int x, y;
int avrg_attrib; int avrg_attrib;
int dmg = 0, glyph, oldglyph = -1; int glyph, oldglyph = -1;
register struct monst *mtmp; register struct monst *mtmp;
boolean no_kick = FALSE; boolean no_kick = FALSE;
char buf[BUFSZ], kickobjnam[BUFSZ]; char buf[BUFSZ], kickobjnam[BUFSZ];
@@ -948,7 +976,8 @@ dokick(void)
if (!isok(x, y)) { if (!isok(x, y)) {
g.maploc = &g.nowhere; g.maploc = &g.nowhere;
goto ouch; kick_ouch(x, y, kickobjnam);
return ECMD_TIME;
} }
g.maploc = &levl[x][y]; g.maploc = &levl[x][y];
@@ -1016,7 +1045,8 @@ dokick(void)
hurtle(-u.dx, -u.dy, 1, TRUE); /* assume it's light */ hurtle(-u.dx, -u.dy, 1, TRUE); /* assume it's light */
return ECMD_TIME; return ECMD_TIME;
} }
goto ouch; kick_ouch(x, y, kickobjnam);
return ECMD_TIME;
} }
if (!IS_DOOR(g.maploc->typ)) { if (!IS_DOOR(g.maploc->typ)) {
@@ -1041,8 +1071,10 @@ dokick(void)
|| g.maploc->doormask == D_NODOOR) || g.maploc->doormask == D_NODOOR)
unblock_point(x, y); /* vision */ unblock_point(x, y); /* vision */
return ECMD_TIME; return ECMD_TIME;
} else } else {
goto ouch; kick_ouch(x, y, kickobjnam);
return ECMD_TIME;
}
} }
if (g.maploc->typ == SCORR) { if (g.maploc->typ == SCORR) {
if (!Levitation && rn2(30) < avrg_attrib) { if (!Levitation && rn2(30) < avrg_attrib) {
@@ -1052,8 +1084,10 @@ dokick(void)
feel_newsym(x, y); /* we know it's gone */ feel_newsym(x, y); /* we know it's gone */
unblock_point(x, y); /* vision */ unblock_point(x, y); /* vision */
return ECMD_TIME; return ECMD_TIME;
} else } else {
goto ouch; kick_ouch(x, y, kickobjnam);
return ECMD_TIME;
}
} }
if (IS_THRONE(g.maploc->typ)) { if (IS_THRONE(g.maploc->typ)) {
register int i; register int i;
@@ -1095,10 +1129,13 @@ dokick(void)
if (dunlev(&u.uz) < dunlevs_in_dungeon(&u.uz)) { if (dunlev(&u.uz) < dunlevs_in_dungeon(&u.uz)) {
fall_through(FALSE, 0); fall_through(FALSE, 0);
return ECMD_TIME; return ECMD_TIME;
} else } else {
goto ouch; kick_ouch(x, y, kickobjnam);
return ECMD_TIME;
}
} }
goto ouch; kick_ouch(x, y, kickobjnam);
return ECMD_TIME;
} }
if (IS_ALTAR(g.maploc->typ)) { if (IS_ALTAR(g.maploc->typ)) {
if (Levitation) { if (Levitation) {
@@ -1107,8 +1144,10 @@ dokick(void)
} }
You("kick %s.", (Blind ? something : "the altar")); You("kick %s.", (Blind ? something : "the altar"));
altar_wrath(x, y); altar_wrath(x, y);
if (!rn2(3)) if (!rn2(3)) {
goto ouch; kick_ouch(x, y, kickobjnam);
return ECMD_TIME;
}
exercise(A_DEX, TRUE); exercise(A_DEX, TRUE);
return ECMD_TIME; return ECMD_TIME;
} }
@@ -1118,8 +1157,10 @@ dokick(void)
return ECMD_TIME; return ECMD_TIME;
} }
You("kick %s.", (Blind ? something : "the fountain")); You("kick %s.", (Blind ? something : "the fountain"));
if (!rn2(3)) if (!rn2(3)) {
goto ouch; kick_ouch(x, y, kickobjnam);
return ECMD_TIME;
}
/* make metal boots rust */ /* make metal boots rust */
if (uarmf && rn2(3)) if (uarmf && rn2(3))
if (water_damage(uarmf, "metal boots", TRUE) == ER_NOTHING) { if (water_damage(uarmf, "metal boots", TRUE) == ER_NOTHING) {
@@ -1134,8 +1175,10 @@ dokick(void)
kick_dumb(x, y); kick_dumb(x, y);
return ECMD_TIME; return ECMD_TIME;
} }
if (rn2(4)) if (rn2(4)) {
goto ouch; kick_ouch(x, y, kickobjnam);
return ECMD_TIME;
}
exercise(A_WIS, FALSE); exercise(A_WIS, FALSE);
if (Role_if(PM_ARCHEOLOGIST) || Role_if(PM_SAMURAI) if (Role_if(PM_ARCHEOLOGIST) || Role_if(PM_SAMURAI)
|| ((u.ualign.type == A_LAWFUL) && (u.ualign.record > -10))) { || ((u.ualign.type == A_LAWFUL) && (u.ualign.record > -10))) {
@@ -1153,8 +1196,10 @@ dokick(void)
} }
return ECMD_TIME; return ECMD_TIME;
} }
if (g.maploc->typ == IRONBARS) if (g.maploc->typ == IRONBARS) {
goto ouch; kick_ouch(x, y, kickobjnam);
return ECMD_TIME;
}
if (IS_TREE(g.maploc->typ)) { if (IS_TREE(g.maploc->typ)) {
struct obj *treefruit; struct obj *treefruit;
@@ -1162,7 +1207,8 @@ dokick(void)
if (rn2(3)) { if (rn2(3)) {
if (!rn2(6) && !(g.mvitals[PM_KILLER_BEE].mvflags & G_GONE)) if (!rn2(6) && !(g.mvitals[PM_KILLER_BEE].mvflags & G_GONE))
You_hear("a low buzzing."); /* a warning */ You_hear("a low buzzing."); /* a warning */
goto ouch; kick_ouch(x, y, kickobjnam);
return ECMD_TIME;
} }
if (rn2(15) && !(g.maploc->looted & TREE_LOOTED) if (rn2(15) && !(g.maploc->looted & TREE_LOOTED)
&& (treefruit = rnd_treefruit_at(x, y))) { && (treefruit = rnd_treefruit_at(x, y))) {
@@ -1210,7 +1256,8 @@ dokick(void)
g.maploc->looted |= TREE_SWARM; g.maploc->looted |= TREE_SWARM;
return ECMD_TIME; return ECMD_TIME;
} }
goto ouch; kick_ouch(x, y, kickobjnam);
return ECMD_TIME;
} }
if (IS_SINK(g.maploc->typ)) { if (IS_SINK(g.maploc->typ)) {
int gend = poly_gender(); int gend = poly_gender();
@@ -1271,7 +1318,8 @@ dokick(void)
} }
return ECMD_TIME; return ECMD_TIME;
} }
goto ouch; kick_ouch(x, y, kickobjnam);
return ECMD_TIME;
} }
if (g.maploc->typ == STAIRS || g.maploc->typ == LADDER if (g.maploc->typ == STAIRS || g.maploc->typ == LADDER
|| IS_STWALL(g.maploc->typ)) { || IS_STWALL(g.maploc->typ)) {
@@ -1279,26 +1327,7 @@ dokick(void)
kick_dumb(x, y); kick_dumb(x, y);
return ECMD_TIME; return ECMD_TIME;
} }
ouch: kick_ouch(x, y, kickobjnam);
pline("Ouch! That hurts!");
exercise(A_DEX, FALSE);
exercise(A_STR, FALSE);
if (isok(x, y)) {
if (Blind)
feel_location(x, y); /* we know we hit it */
if (is_drawbridge_wall(x, y) >= 0) {
pline_The("drawbridge is unaffected.");
/* update maploc to refer to the drawbridge */
(void) find_drawbridge(&x, &y);
g.maploc = &levl[x][y];
}
}
if (!rn2(3))
set_wounded_legs(RIGHT_SIDE, 5 + rnd(5));
dmg = rnd(ACURR(A_CON) > 15 ? 3 : 5);
losehp(Maybe_Half_Phys(dmg), kickstr(buf, kickobjnam), KILLED_BY);
if (Is_airlevel(&u.uz) || Levitation)
hurtle(-u.dx, -u.dy, rn1(2, 4), TRUE); /* assume it's heavy */
return ECMD_TIME; return ECMD_TIME;
} }
kick_dumb(x, y); kick_dumb(x, y);
@@ -1312,8 +1341,10 @@ dokick(void)
} }
/* not enough leverage to kick open doors while levitating */ /* not enough leverage to kick open doors while levitating */
if (Levitation) if (Levitation) {
goto ouch; kick_ouch(x, y, kickobjnam);
return ECMD_TIME;
}
exercise(A_DEX, TRUE); exercise(A_DEX, TRUE);
/* door is known to be CLOSED or LOCKED */ /* door is known to be CLOSED or LOCKED */