ljh合并 #9

Open
pxcfy5iqk wants to merge 32 commits from luojunhui_branch into master

@ -46,7 +46,6 @@ static int eat_ok(struct obj *);
static int offer_ok(struct obj *);
static int tin_ok(struct obj *);
/* also used to see if you're allowed to eat cats and dogs */
#define CANNIBAL_ALLOWED() (Role_if(PM_CAVE_DWELLER) || Race_if(PM_ORC))
/* monster types that cause hero to be turned into stone if eaten */
@ -84,8 +83,7 @@ static const struct victual_info zero_victual = { 0 };
static int getobj_else = 0;
/*
* Decide whether a particular object can be eaten by the possibly
* polymorphed character. Not used for monster checks.
*
*/
boolean
is_edible(register struct obj *obj)
@ -120,8 +118,7 @@ is_edible(register struct obj *obj)
return (boolean) (obj->oclass == FOOD_CLASS);
}
/* used for hero init, life saving (if choking), and prayer results of fix
starving, fix weak from hunger, or golden glow boon (if u.uhunger < 900) */
/* 用于英雄的初始化、生命挽救、修复因饥饿产生的负面效果以及提供增益效果 */
void
init_uhunger(void)
{
@ -176,7 +173,7 @@ eatmdone(void)
return 0;
}
/* called when hallucination is toggled */
/* 处理角色进食结束后的某些更新操作 */
void
eatmupdate(void)
{
@ -212,7 +209,7 @@ eatmupdate(void)
}
}
/* ``[the(] singular(food, xname) [)]'' */
/* 这个函数的主要目的是根据给定的食物对象和布尔值来生成一个特定的名字。 */
static const char *
food_xname(struct obj *food, boolean the_pfx)
{
@ -241,7 +238,7 @@ food_xname(struct obj *food, boolean the_pfx)
*
* To a full belly all food is bad. (It.)
*/
static void
static void//述玩家角色吃东西时发生的情况的函数
choke(struct obj *food)
{
/* only happens if you were satiated */
@ -287,7 +284,7 @@ choke(struct obj *food)
}
}
/* modify object wt. depending on time spent consuming it */
/*重新计算一个对象的重量 */
static void
recalc_wt(void)
{
@ -304,7 +301,7 @@ recalc_wt(void)
debugpline1("New weight = %d", piece->owt);
}
/* called when eating interrupted by an event */
/* 指示在进食回合结束后进行重置操作 */
void
reset_eat(void)
{
@ -318,7 +315,7 @@ reset_eat(void)
return;
}
/* base nutrition of a food-class object */
/* 计算并返回一个对象的营养值 */
unsigned
obj_nutrition(struct obj *otmp)
{
@ -377,7 +374,7 @@ touchfood(struct obj *otmp)
* do_reset_eat() at the beginning of eatfood()) and check for null pointers
* in do_reset_eat().
*/
void
void//处理食物消失
food_disappears(struct obj *obj)
{
if (obj == gc.context.victual.piece)
@ -390,7 +387,7 @@ food_disappears(struct obj *obj)
/* renaming an object used to result in it having a different address,
so the sequence start eating/opening, get interrupted, name the food,
resume eating/opening would restart from scratch */
void
void//替换特定的食物对象。
food_substitution(struct obj *old_obj, struct obj *new_obj)
{
if (old_obj == gc.context.victual.piece) {
@ -403,7 +400,7 @@ food_substitution(struct obj *old_obj, struct obj *new_obj)
}
}
static void
static void//重置与食物相关的某些属性
do_reset_eat(void)
{
debugpline0("do_reset_eat...");
@ -430,7 +427,7 @@ do_reset_eat(void)
attribute or because of polymorph shape or worn or carried gear), return
its timeout, otherwise return 0 */
long
temp_resist(int prop)
temp_resist(int prop)//检查某个属性由prop指定是否具有临时抗性
{
struct prop *p = &u.uprops[prop];
long timeout = p->intrinsic & TIMEOUT;
@ -449,7 +446,7 @@ temp_resist(int prop)
}
/* if temp resist against 'prop' is about to timeout, extend it slightly */
static void
static void//判断当前属性通过prop参数指定是否具有临时抗性
maybe_extend_timed_resist(int prop)
{
long timeout = temp_resist(prop);
@ -468,7 +465,7 @@ maybe_extend_timed_resist(int prop)
/* called each move during eating process */
static int
eatfood(void)
eatfood(void)//处理角色进食的逻辑。
{
struct obj *food = gc.context.victual.piece;
@ -512,7 +509,7 @@ eatfood(void)
}
static void
done_eating(boolean message)
done_eating(boolean message)//处理角色完成进食后的逻辑。
{
struct obj *piece = gc.context.victual.piece;
@ -544,7 +541,7 @@ done_eating(boolean message)
}
void
eating_conducts(struct permonst *pd)
eating_conducts(struct permonst *pd)//处理与角色进食相关的行为和记录。
{
int ll_conduct = 0;
@ -571,7 +568,7 @@ eating_conducts(struct permonst *pd)
/* handle side-effects of mind flayer's tentacle attack */
int
eat_brains(
eat_brains(//处理角色吃怪物的脑子的行为
struct monst *magr,
struct monst *mdef,
boolean visflag,
@ -720,7 +717,7 @@ eat_brains(
/* eating a corpse or egg of one's own species is usually naughty */
static boolean
maybe_cannibal(int pm, boolean allowmsg)
maybe_cannibal(int pm, boolean allowmsg)//判断角色是否可能成为食人族。
{
static NEARDATA long ate_brains = 0L;
struct permonst *fptr = &mons[pm]; /* food type */
@ -752,7 +749,7 @@ maybe_cannibal(int pm, boolean allowmsg)
return FALSE;
}
static void
static void//它处理玩家尝试吃怪物肉的情况
cprefx(register int pm)
{
(void) maybe_cannibal(pm, TRUE);
@ -847,7 +844,7 @@ fix_petrification(void)
/* intrinsic_possible() returns TRUE iff a monster can give an intrinsic. */
int
intrinsic_possible(int type, struct permonst *ptr)
intrinsic_possible(int type, struct permonst *ptr)//判断给定的怪物类型是否具有某些特性
{
int res = 0;
@ -918,7 +915,7 @@ intrinsic_possible(int type, struct permonst *ptr)
* intrinsic it is trying to give you.
*/
boolean
should_givit(int type, struct permonst *ptr)
should_givit(int type, struct permonst *ptr)//是否应该给予某种特性或能力。
{
int chance;
@ -960,7 +957,7 @@ temp_givit(int type, struct permonst *ptr)
* and what type of intrinsic it is trying to give you.
*/
static void
givit(int type, register struct permonst *ptr)
givit(int type, register struct permonst *ptr)//是否给予怪物某种特性或能力。
{
debugpline1("Attempting to give intrinsic %d", type);
@ -1060,7 +1057,7 @@ givit(int type, register struct permonst *ptr)
}
static void
eye_of_newt_buzz(void)
eye_of_newt_buzz(void)//加角色的某种魔法能量值
{
/* MRKR: "eye of newt" may give small magical energy boost */
if (rn2(3) || 3 * u.uen <= 2 * u.uenmax) {
@ -1085,7 +1082,7 @@ eye_of_newt_buzz(void)
DISABLE_WARNING_FORMAT_NONLITERAL
/* called after completely consuming a corpse */
static void
static void//处理角色变身或模仿其他生物的功能
cpostfx(int pm)
{
int tmp = 0;
@ -1282,7 +1279,7 @@ RESTORE_WARNING_FORMAT_NONLITERAL
* Non-deterministic; should only be called once per corpse.
*/
int
corpse_intrinsic(struct permonst *ptr)
corpse_intrinsic(struct permonst *ptr)//检查一个怪物是否具有某种内在属性
{
/* Check the monster for all of the intrinsics. If this
* monster can give more than one, pick one to try to give
@ -1319,7 +1316,7 @@ corpse_intrinsic(struct permonst *ptr)
}
void
violated_vegetarian(void)
violated_vegetarian(void)//角色违反了素食主义的情节
{
u.uconduct.unvegetarian++;
if (Role_if(PM_MONK)) {

File diff suppressed because it is too large Load Diff

@ -1539,7 +1539,7 @@ mon_learns_traps(struct monst *mtmp, int ttyp)
mtmp->mtrapseen |= (1L << (ttyp - 1));
}
/* monsters see a trap trigger, and remember it */
void
mons_see_trap(struct trap *ttmp)
{

@ -54,13 +54,13 @@ rnd_hallublast(void)
boolean
m_has_launcher_and_ammo(struct monst* mtmp)
{
struct obj *mwep = MON_WEP(mtmp);
struct obj *mwep = MON_WEP(mtmp);//从怪物结构中获取其持有的武器。
if (mwep && is_launcher(mwep)) {
if (mwep && is_launcher(mwep)) {//如果怪物有武器,并且这个武器是一个发射器,执行括号内的代码。
struct obj *otmp;
for (otmp = mtmp->minvent; otmp; otmp = otmp->nobj)
if (ammo_and_launcher(otmp, mwep))
for (otmp = mtmp->minvent; otmp; otmp = otmp->nobj)//遍历怪物的物品栏。
if (ammo_and_launcher(otmp, mwep))//如果找到与发射器匹配的弹药函数返回TRUE。
return TRUE;
}
return FALSE;
@ -68,10 +68,10 @@ m_has_launcher_and_ammo(struct monst* mtmp)
/* hero is hit by something other than a monster (though it could be a
missile thrown or shot by a monster) */
int
int//角色被某种物体(例如魔法瓶中的酸液)击中的情况
thitu(
int tlev, /* pseudo-level used when deciding whether to hit hero's AC */
int dam,
int tlev, /* 用于决定是否击中英雄的ACArmor Class防御力的伪级别。 */
int dam,//表示伤害值。
struct obj **objp,
const char *name) /* if null, then format `*objp' */
{
@ -155,7 +155,7 @@ thitu(
* Returns 0 if object still exists (not destroyed).
*/
static int
drop_throw(
drop_throw(//处理一个对象obj在被投掷或落下时的行为
register struct obj *obj,
boolean ohit,
coordxy x,
@ -163,8 +163,8 @@ drop_throw(
{
int retvalu = 1;
int create;
struct monst *mtmp;
struct trap *t;
struct monst *mtmp;//用于指向当前位置上的怪物。
struct trap *t;//用于指向当前位置上的陷阱。
if (obj->otyp == CREAM_PIE || obj->oclass == VENOM_CLASS
|| (ohit && obj->otyp == EGG))
@ -509,7 +509,7 @@ ucatchgem(
struct monst *mon)
{
/* won't catch rock or gray stone; catch (then drop) worthless glass */
if (gem->otyp <= LAST_GLASS_GEM && is_unicorn(gy.youmonst.data)) {
if (gem->otyp <= LAST_GLASS_GEM && is_unicorn(gy.youmonst.data)) {//如果传入的宝石gem是一个玻璃宝石包括各种颜色的玻璃宝石并且当前玩家gy.youmonst.data是独角兽
char *gem_xname = xname(gem),
*mon_s_name = s_suffix(mon_nam(mon));
@ -781,14 +781,14 @@ m_throw(
/* Monster throws item at another monster */
int
thrwmm(struct monst* mtmp, struct monst* mtarg)
thrwmm(struct monst* mtmp, struct monst* mtarg)//用于处理一个怪物mtmp对另一个怪物mtarg的攻击
{
struct obj *otmp, *mwep;
register coordxy x, y;
boolean ispole;
/* Polearms won't be applied by monsters against other monsters */
if (mtmp->weapon_check == NEED_WEAPON || !MON_WEP(mtmp)) {
if (mtmp->weapon_check == NEED_WEAPON || !MON_WEP(mtmp)) {//如果怪物没有合适的武器(例如长柄武器),它会尝试装备一个远程武器。
mtmp->weapon_check = NEED_RANGED_WEAPON;
/* mon_wield_item resets weapon_check as appropriate */
if (mon_wield_item(mtmp) != 0)
@ -806,10 +806,10 @@ thrwmm(struct monst* mtmp, struct monst* mtarg)
mwep = MON_WEP(mtmp); /* wielded weapon */
if (!ispole && m_lined_up(mtarg, mtmp)) {
if (!ispole && m_lined_up(mtarg, mtmp)) {//如果怪物有合适的远程武器,它会检查怪物和目标的位置
int chance = max(BOLT_LIM - distmin(x, y, mtarg->mx, mtarg->my), 1);
if (!mtarg->mflee || !rn2(chance)) {
if (!mtarg->mflee || !rn2(chance)) {//怪物会计算一个攻击成功的概率(基于与目标之间的距离)。如果这个概率大于随机数生成器产生的值,那么怪物会尝试进行攻击。
if (ammo_and_launcher(otmp, mwep)
&& dist2(mtmp->mx, mtmp->my, mtarg->mx, mtarg->my)
> PET_MISSILE_RANGE2)
@ -1327,7 +1327,7 @@ hits_bars(
&& obj_type != WAX_CANDLE && obj_type != LENSES
&& obj_type != TIN_WHISTLE && obj_type != MAGIC_WHISTLE);
break;
case ROCK_CLASS: /* includes boulder */
case ROCK_CLASS:
if (obj_type != STATUE || mons[otmp->corpsenm].msize > MZ_TINY)
hits = TRUE;
break;

@ -3067,7 +3067,7 @@ green_mon(struct monst *mon)
if (iflags.use_color)
return (ptr->mcolor == CLR_GREEN || ptr->mcolor == CLR_BRIGHT_GREEN);
#endif
/* approximation */
if (strstri(ptr->pmnames[NEUTRAL], "green")
|| (ptr->pmnames[MALE] && strstri(ptr->pmnames[MALE], "green"))
|| (ptr->pmnames[FEMALE] && strstri(ptr->pmnames[FEMALE], "green")))

@ -1478,7 +1478,7 @@ validate(NHFILE *nhfp, const char *name, boolean without_waitsynch_perfile)
if (nhfp->structlevel)
rlen = (readLenType) read(nhfp->fd, (genericptr_t) &sfi,
sizeof sfi);
minit(); /* ZEROCOMP */
minit();
if (rlen == 0) {
if (verbose) {
pline("File \"%s\" is empty during save file feature check?",

@ -22,7 +22,7 @@ struct rnglist_t {
enum { CORE = 0, DISP = 1 };
static struct rnglist_t rnglist[] = {
{ rn2, FALSE, { 0 } }, /* CORE */
{ rn2, FALSE, { 0 } },
{ rn2_on_display_rng, FALSE, { 0 } }, /* DISP */
};

@ -847,8 +847,7 @@ place_monster(struct monst* mon, coordxy x, coordxy y)
char buf[QBUFSZ];
buf[0] = '\0';
/* normal map bounds are <1..COLNO-1,0..ROWNO-1> but sometimes
vault guards (either living or dead) are parked at <0,0> */
if (!isok(x, y) && (x != 0 || y != 0 || !mon->isgd)) {
describe_level(buf, 0);
impossible("trying to place %s at <%d,%d> mstate:%lx on %s",

@ -19,8 +19,7 @@ static void see_lamp_flicker(struct obj *, const char *);
static void lantern_message(struct obj *);
static void cleanup_burn(ANY_P *, long);
/* used by wizard mode #timeout and #wizintrinsic; order by 'interest'
for timeout countdown, where most won't occur in normal play */
static const struct propname {
int prop_num;
const char *prop_name;

@ -12,14 +12,14 @@ static NEARDATA int utcnt, utpnt;
static NEARDATA coord utrack[UTSZ];
void
initrack(void)
initrack(void) /* 初始化路径*/
{
utcnt = utpnt = 0;
}
/* add to track */
void
settrack(void)
settrack(void)/* 添加路径 */
{
if (utcnt < UTSZ)
utcnt++;
@ -31,7 +31,8 @@ settrack(void)
}
coord *
gettrack(coordxy x, coordxy y)
gettrack(coordxy x, coordxy y)/* 寻找路径 */
{
register int cnt, ndist;
register coord *tc;

@ -836,7 +836,7 @@ gd_move_cleanup(
*/
x = grd->mx, y = grd->my;
see_guard = canspotmon(grd);
parkguard(grd); /* move to <0,0> */
parkguard(grd);
wallify_vault(grd);
restfakecorr(grd);
debugpline2("gd_move_cleanup: %scleanup%s",

Loading…
Cancel
Save