ljh合并 #7

Closed
pxcfy5iqk wants to merge 7 commits from main into master

@ -0,0 +1,79 @@
用例名:道具使用
执行者:玩家
目标:将玩家装备的道具效果提交到属性面板上
前置条件:
玩家拥有至少一件道具
玩家处于可以与道具交互的状态(例如,非战斗状态)
后置条件:
道具使用后,其效果将被应用
玩家的状态可能因道具效果而改变
主要场景:
玩家选择一个道具。
玩家点击或选择“使用”选项。
游戏判断玩家是否满足使用该道具的条件(例如,是否在战斗中,道具是否为可消耗等)。
如果满足条件,游戏将执行道具效果,并在界面上显示相关信息。
如果道具具有持续效果,游戏将在一段时间内保持这些效果。
如果道具为一次性消耗品,使用后将消失。
玩家可以查看道具使用后的效果和状态变化。
交互动作:
1玩家遇到特殊情况后下达命令cmd.c并apply.c执行来选择使用道具。
2装备道具后根据更新后属性面板看能否解决当前问题。
3如果能解决则根据宝物使用更新内存分配alloc.c并记录时间date.c参数如果不能解决则继续试用其他宝物。
用例交互图
| 玩家
| +---------------+ +--------------+ +-------------+ +-----------+ +-----------+
| | 选择道具 |---------->| 判断条件 |---------->| 显示效果 |---------->| 更新状态 |---------->| 更新UI |---------->| 反馈 |
| +---------------+ +--------------+ +-------------+ +-----------+ +-----------+
| | 游戏系统
| +---------------+ +--------------+ +-------------+ +-----------+ +-----------+
|| 触发条件 |---------->| 验证玩家 |---------->| 获取道具信息|---------->| 执行效果|---------->| 更新UI |---------->| 返回结果 |
| +---------------+ +--------------+ +-------------+ +-----------+ +-----------+
函数的自然语言描述
alloc.c
描述:处理游戏中的内存分配。
用例:当游戏需要创建新对象或数据结构时,会使用此模块中的函数来分配所需的内存。
apply.c
描述:处理各种应用的逻辑。
用例:当玩家对其他对象(例如对一个门应用钥匙)或自己应用药物时,相关的逻辑会被处理。
artifact.c
描述处理神器Artifact相关的逻辑。
用例:玩家可能会找到神器,并尝试使用它们或与之互动。此模块处理这些交互的逻辑。
attrib.c
描述:处理属性相关的逻辑。
用例:玩家或敌人可能有各种属性,如攻击力、防御力、速度等。此模块处理这些属性的逻辑。
ball.c
描述处理魔法球Ball相关的逻辑。
用例:魔法球是游戏中的一个对象,玩家可以捡起并使用它。此模块处理与魔法球相关的所有逻辑。
bones.c
描述处理骨头Bones相关的逻辑。
用例:骨头是游戏中一种特殊的对象,当玩家死亡后可能会留下。此模块处理与骨头相关的所有逻辑。
botl.c
描述处理宝物Treasure相关的逻辑。
用例:玩家在游戏中可能会找到各种宝物,如金币、宝石等。此模块处理与这些宝物相关的所有逻辑。
cmd.c
描述:处理命令相关的逻辑。
用例:玩家在游戏中会发出各种命令,如移动、攻击、使用物品等。此模块处理这些命令的逻辑。
date.c
描述:处理日期和时间相关的逻辑。
用例:游戏世界有一个时间流逝的机制,此模块处理与时间流逝、日期等相关的逻辑。
dbridge.c
描述处理桥Bridge相关的逻辑。
用例:桥是游戏中一种特殊的对象或地形,玩家可能需要跨过或与之互动。此模块处理与桥相关的所有逻辑。
各个函数的分类属性以及相关的简单逻辑关系如下:
玩家-》通过命令cmd.c再由apply.c来执行
系统运行-》
内存分配alloc.c
时间date.c
显示面板-》
属性面板attrib.c
道具-》
桥dbridge.c
宝物botl.c
骨头bones.c
魔法球ball.c
神器artifact.c

@ -17,7 +17,7 @@ NEARDATA const struct c_color_names c_color_names = {
"black", "amber", "golden", "light blue", "red", "green",
"silver", "blue", "purple", "white", "orange"
};
const char *c_obj_colors[] = {
const char *c_obj_colors[] = { //这里定义了一些物品的颜色
"black", /* CLR_BLACK */
"red", /* CLR_RED */
"green", /* CLR_GREEN */
@ -36,8 +36,8 @@ const char *c_obj_colors[] = {
"white", /* CLR_WHITE */
};
const struct c_common_strings c_common_strings =
{ "Nothing happens.",
const struct c_common_strings c_common_strings = //结构体变量中包含了一些常见的字符串,用于文本输出
{ "Nothing happens.", //在游戏中提供反馈、描述情况,进行交互
"That's enough tries!",
"That is a silly thing to %s.",
"shudder for a moment.",
@ -50,33 +50,34 @@ const struct c_common_strings c_common_strings =
{ "mon", "you" }
};
const struct savefile_info default_sfinfo = {
#ifdef NHSTDC
const struct savefile_info default_sfinfo = { //定义了保存文件的默认信息
#ifdef NHSTDC //用于保存文件格式的标志位
0x00000000UL
#else
0x00000000L
#endif
#if defined(COMPRESS) || defined(ZLIB_COMP)
#if defined(COMPRESS) || defined(ZLIB_COMP) //用于外部压缩标志位
| SFI1_EXTERNALCOMP
#endif
#if defined(ZEROCOMP)
| SFI1_ZEROCOMP
| SFI1_ZEROCOMP //零压缩标志位
#endif
#if defined(RLECOMP)
| SFI1_RLECOMP
| SFI1_RLECOMP //RLE压缩标志
#endif
,
#ifdef NHSTDC
0x00000000UL, 0x00000000UL
0x00000000UL, 0x00000000UL //保留字段
#else
0x00000000L, 0x00000000L
#endif
};
const char disclosure_options[] = "iavgco";
char emptystr[] = {0}; /* non-const */
const char disclosure_options[] = "iavgco"; //是一个字符数组,包含了几个选项。这些选项用于控制信息的披露程度。
char emptystr[] = {0}; /* non-const */ //是一个字符数组,用于表示空字符串。它是非常量数组,可以被修改。
NEARDATA struct flag flags; /* extern declaration is in flag.h, not decl.h */
//是一个结构体变量用于存储游戏中的标志位。该变量在flag.h中有外部声明。
/* Global windowing data, defined here for multi-window-system support */
#ifdef WIN32
@ -84,25 +85,28 @@ boolean fqn_prefix_locked[PREFIX_COUNT] = { FALSE, FALSE, FALSE,
FALSE, FALSE, FALSE,
FALSE, FALSE, FALSE,
FALSE };
//是一个布尔数组用于表示文件名前缀是否被锁定。在这段代码中它被初始化为全为FALSE。
#endif
#ifdef PREFIXES_IN_USE
const char *fqn_prefix_names[PREFIX_COUNT] = {
"hackdir", "leveldir", "savedir", "bonesdir", "datadir",
"scoredir", "lockdir", "sysconfdir", "configdir", "troubledir"
};
};//是一个字符串指针数组,包含了一些文件名前缀的名称。这些名称用于指定不同类型文件的存储路径。
#endif
/* x/y/z deltas for the 10 movement directions (8 compass pts, 2 down/up) */
const schar xdir[N_DIRS_Z] = { -1, -1, 0, 1, 1, 1, 0, -1, 0, 0 };
const schar ydir[N_DIRS_Z] = { 0, -1, -1, -1, 0, 1, 1, 1, 0, 0 };
const schar zdir[N_DIRS_Z] = { 0, 0, 0, 0, 0, 0, 0, 0, 1, -1 };
//是三个有符号字符数组分别表示十个移动方向包括八个主要方向和上下方向的x、y和z轴的增量。
/* redordered directions, cardinals first */
const schar dirs_ord[N_DIRS] =
{ DIR_W, DIR_N, DIR_E, DIR_S, DIR_NW, DIR_NE, DIR_SE, DIR_SW };
//是一个有符号字符数组,表示经过重新排序的移动方向。首先是四个基本方向,然后是四个对角线方向。
NEARDATA boolean has_strong_rngseed = FALSE;
NEARDATA boolean has_strong_rngseed = FALSE; //是一个布尔变量,用于表示是否具有强随机种子。
struct engr *head_engr;
NEARDATA struct instance_flags iflags;
NEARDATA struct instance_flags iflags; //是一个结构体变量,用于存储游戏实例的标志位。
/* NOTE: the order of these words exactly corresponds to the
order of oc_material values #define'd in objclass.h. */
const char *materialnm[] = { "mysterious", "liquid", "wax", "organic",
@ -111,37 +115,43 @@ const char *materialnm[] = { "mysterious", "liquid", "wax", "organic",
"metal", "copper", "silver", "gold",
"platinum", "mithril", "plastic", "glass",
"gemstone", "stone" };
const char quitchars[] = " \r\n\033";
NEARDATA struct savefile_info sfcap, sfrestinfo, sfsaveinfo;
const int shield_static[SHIELD_COUNT] = {
//是一个字符串指针数组包含了一些物品材质的名称。这些名称与objclass.h中定义的oc_material值的顺序完全对应。
const char quitchars[] = " \r\n\033";//是一个包含一些表示退出字符的字符串,包括空格、回车、换行和转义字符。
NEARDATA struct savefile_info sfcap, sfrestinfo, sfsaveinfo; //结构体变量,用于保存文件的信息。
const int shield_static[SHIELD_COUNT] = {//是一个整型数组,包含了一些盾牌的静态符号。
S_ss1, S_ss2, S_ss3, S_ss2, S_ss1, S_ss2, S_ss4, /* 7 per row */
S_ss1, S_ss2, S_ss3, S_ss2, S_ss1, S_ss2, S_ss4,
S_ss1, S_ss2, S_ss3, S_ss2, S_ss1, S_ss2, S_ss4,
};
NEARDATA struct you u;
NEARDATA time_t ubirthday;
NEARDATA struct u_realtime urealtime;
NEARDATA struct obj *uwep, *uarm, *uswapwep,
NEARDATA struct you u;//结构体变量,用于表示玩家角色的状态和属性。
NEARDATA time_t ubirthday; //是一个time_t类型的变量表示玩家角色的出生时间。
NEARDATA struct u_realtime urealtime; //用于表示游戏时间的实时信息。
NEARDATA struct obj *uwep, *uarm, *uswapwep, //结构体的指针变量,用于表示玩家角色的装备和物品。
*uquiver, /* quiver */
*uarmu, /* under-wear, so to speak */
*uskin, /* dragon armor, if a dragon */
*uarmc, *uarmh, *uarms, *uarmg,*uarmf, *uamul,
*uright, *uleft, *ublindf, *uchain, *uball;
const char vowels[] = "aeiouAEIOU";
NEARDATA winid WIN_MESSAGE, WIN_STATUS, WIN_MAP, WIN_INVEN;
const char ynchars[] = "yn";
const char vowels[] = "aeiouAEIOU"; //是一个包含元音字母的字符串,包括小写和大写的元音字母。
NEARDATA winid WIN_MESSAGE, WIN_STATUS, WIN_MAP, WIN_INVEN;//是窗口标识符winid类型变量用于表示游戏中的不同窗口。
const char ynchars[] = "yn"; //是包含一些表示"yes"和"no"的字符的字符串。
const char ynqchars[] = "ynq";
const char ynaqchars[] = "ynaq";
const char ynNaqchars[] = "yn#aq";
NEARDATA long yn_number = 0L;
//这些变量的定义用于实现游戏的逻辑和界面显示等功能。
//其中包括随机数种子、文本输出、文件操作、游戏状态、时间管理、玩家角色属性、装备和物品等。
#ifdef PANICTRACE
const char *ARGV0;
const char *ARGV0; //是一个指向const char类型的指针变量在宏定义PANICTRACE被定义时生效。
#endif
#define IVMAGIC 0xdeadbeef
#define IVMAGIC 0xdeadbeef //是一个整型常量,表示一个特定的魔数。
const struct Role urole_init_data = {
const struct Role urole_init_data = { //是一个struct Role结构体变量用于初始化玩家角色的初始数据。其中包括角色名称、属性、初始位置等信息。
{ "Undefined", 0 },
{ { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 },
{ 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 } },
@ -167,7 +177,7 @@ const struct Role urole_init_data = {
};
const struct Race urace_init_data = {
"something",
"something", //是一个struct Race结构体变量用于初始化玩家种族的初始数据。其中包括种族名称、属性、初始位置等信息。
"undefined",
"something",
"Xxx",
@ -188,7 +198,8 @@ const struct Race urace_init_data = {
};
const struct instance_globals_a g_init_a = {
const struct instance_globals_a g_init_a = { //是一个struct instance_globals_a结构体变量用于初始化一些全局变量。
//每个注释后面的注释表示该变量在代码中的使用位置。
/* artifact.c */
/* decl.c */
UNDEFINED_PTR, /* afternmv */
@ -216,7 +227,8 @@ const struct instance_globals_a g_init_a = {
IVMAGIC /* a_magic to validate that structure layout has been preserved */
};
const struct instance_globals_b g_init_b = {
const struct instance_globals_b g_init_b = {//是一个struct instance_globals_b结构体变量用于初始化另一些全局变量。
//每个注释后面的注释表示该变量在代码中的使用位置。
/* botl.c */
{ { { NULL, NULL, 0L, FALSE, FALSE, 0, 0U, { 0 }, { 0 }, NULL, 0, 0, 0
#ifdef STATUS_HILITES
@ -486,26 +498,26 @@ const struct instance_globals_l g_init_l = {
0U, /* last_hider */
/* nhlan.c */
#ifdef MAX_LAN_USERNAME
UNDEFINED_VALUES, /* lusername */
MAX_LAN_USERNAME, /* lusername_size */
UNDEFINED_VALUES, /* lusername */ //是一个全局变量用于存储本地区域网络的用户名。如果定义了MAX_LAN_USERNAME宏则将其初始化为UNDEFINED_VALUES否则将其初始化为未定义的值。注释后面的注释表示该变量在代码中的使用位置。
MAX_LAN_USERNAME, /* lusername_size */ //是一个全局变量,用于存储本地区域网络用户名的大小。
#endif /* MAX_LAN_USERNAME */
/* nhlua.c */
UNDEFINED_VALUE, /* luacore */
DUMMY, /* lua_warnbuf[] */
UNDEFINED_VALUE, /* luacore */ //是一个全局变量用于存储Lua脚本的核心。将其初始化为未定义的值。
DUMMY, /* lua_warnbuf[] */ //是一个数组用于存储Lua警告信息的缓冲区。
/* options.c */
FALSE, /* loot_reset_justpicked */
FALSE, /* loot_reset_justpicked */ //是一个全局变量用于表示是否刚刚拾取了战利品并需要重置。将其初始化为FALSE。
/* save.c */
(struct obj *) 0, /* looseball */
(struct obj *) 0, /* looseball */ //是全局变量,用于表示游戏中的松散物品
(struct obj *) 0, /* loosechain */
/* sp_lev.c */
NULL, /* lev_message */
UNDEFINED_PTR, /* lregions */
NULL, /* lev_message */ //是一个全局变量,用于存储地图生成时的消息。
UNDEFINED_PTR, /* lregions */ //一个全局变量,用于存储地图生成时的区域信息
/* trap.c */
{ UNDEFINED_PTR, 0, 0 }, /* launchplace */
{ UNDEFINED_PTR, 0, 0 }, /* launchplace */ //是一个结构体变量,用于表示陷阱的发射位置。
/* windows.c */
UNDEFINED_PTR, /* last_winchoice */
UNDEFINED_PTR, /* last_winchoice */ //是一个全局变量,用于存储上次选择的窗口选项。
/* new */
DUMMY, /* lua_ver[LUA_VER_BUFSIZ] */
DUMMY, /* lua_ver[LUA_VER_BUFSIZ] */ //是一个字符数组用于存储Lua版本信息。
DUMMY, /* lua_copyright[LUA_COPYRIGHT_BUFSIZ] */
TRUE, /* havestate*/
IVMAGIC /* l_magic to validate that structure layout has been preserved */
@ -948,8 +960,11 @@ const struct const_globals cg = {
};
#define ZERO(x) memset(&x, 0, sizeof(x))
//是一个宏定义用于将变量x的内存空间清零。使用memset函数将x的内存空间的值设置为0大小为sizeof(x)。
#define MAGICCHECK(xx) \
//是一个宏定义用于检查结构体变量xx的魔术值和状态。
//如果xx的magic字段不等于IVMAGIC预定义的魔术值则输出错误信息并退出程序。如果xx的havestate字段不等于TRUE则输出错误信息并退出程序。
do { \
if ((xx).magic != IVMAGIC) { \
raw_printf( \

Loading…
Cancel
Save