【教程】使用ADLENGINE创建奇幻MUD游戏

0 点赞
The Adliberum Engine (ADLENGINE)
转载

如何在ADLENGINE中创建M.U.D。 本指南将介绍: 如何创建房间/出口。 如何设置和管理玩家属性、生命值、金币等。 如何利用骰子掷出结果并结合玩家/生物属性设置基础战斗。 如何设置和管理生物属性、生命值、金币等。 如何设置基础任务和对话。 示例文件获取 你可以在下方链接找到相关文件(我正在处理中)。 rpg.adlengine文件已可用于游玩。 房间图像均设置为图案(pattern.jpg)。如果你想自定义房间图像,请按以下步骤操作: 1. 在steamapps文件夹中找到adlengine文件夹(位于program files steam steamapps目录下)。 2. 将package.nw重命名为package。zip(忽略警告——你需要能够编辑文件夹选项中的文件扩展名) 3. 打开zip文件 4. 将.jpg图片以及任何你想使用的其他图片/声音添加到zip中(支持子文件夹) 5. 关闭zip文件 6. 将zip文件重命名回package.nw 7. 重新启动ADLENGINE 要为房间使用不同的图片(未提供): 在每个房间中: 房间图片为图片名称 如果图片在子文件夹中: 房间图片为文件夹名称 图片名称 忽略.jpg扩展名,无需添加。 ------------------- 内容: 3个房间: 酒馆 出租房 村庄广场 3个物品: 吧台 床 喷泉 - 金币(在喷泉内) 1个角色: 酒保 酒馆

物体:酒吧。 出口:北边和南边 建造出口的方法: 建造出口 北 建造出口 南 现在锁上北边的门:(待租房间) 北边出口已锁定 在酒馆中,你可以 a) 与酒保交谈 b) 购买啤酒 c) 租房间 租房间的方法: 租房间 这是一个调用script_rentroom的自定义指令。该脚本会检查玩家是否有足够的金币租房间,若金币充足则调用script_unlockdoor,否则会提示玩家无法负担房租。

要设置自定义指令,只需输入“if 自定义指令 then 执行操作”。自定义指令还可以包含可选的“and”。例如:“if rent room then do script_rentroom”。如果玩家能够租用房间,【script_unlockroom】脚本将解锁并打开北边的门,并从玩家的金币中扣除2枚金币。

我添加了购买啤酒的可选功能:购买啤酒

如果玩家有足够的钱,他们会自动购买并饮用啤酒,这会调用【script_drinkbeer】脚本。

注意:所有脚本文件(.verbose)和.adlengine文件都可以用记事本或类似的文本编辑器打开/编辑。这样做可以了解每个脚本的工作原理。 租赁房间

物体:床。 在玩家租用房间前,门会一直处于锁定状态。一旦玩家支付费用,他们就可以向北进入房间。 进入房间后,玩家可以选择: 睡觉 “睡觉”指令是一个自定义指令。 执行该指令会调用script_rest脚本,该脚本会将日期增加一天,将玩家生命值恢复至100点,然后强制玩家向南移动,并在其身后锁上门。

村庄广场

物体:喷泉。 我在喷泉里放了硬币。要实现这一点,需进行以下操作: 建造喷泉; 喷泉可开启; 喷泉处于开启状态; 金币处于隐藏状态; 建造金币; 金币位于喷泉内部。 要让玩家能够看到并拿走金币,需执行以下步骤: 查看喷泉内部 这样玩家就能知晓金币的存在,之后只需使用指令即可拿走金币: 拿走金币 不过,要让金币可以被拿走,我们需要将其设置为可拿取状态。有两种方法可以实现: 1) 当你建造物体时,如果你希望玩家能够拿走该物体,可以在物体名称后添加.obj,这样会建造一个带有{可拿取}属性的空物体。 例如:建造box.obj .obj是一种物体类别,目前有几种可用类别。添加该后缀会自动赋予物体一些预定义的特殊属性。我正在添加自定义类别。 当前类别: .obj .chest .food .drink .ai .exit 2) 使用以下脚本命令 金币可被拾取 - 影响村庄广场照明 让一天中的时间影响村庄广场的照明水平。 real-time-light.verbose #hour=player.hours; ?hour>17:执行夜间模式!执行日间模式; 此脚本将本地保存在村庄广场。代码获取当前小时数,如果超过下午5点则为夜间模式,否则为日间模式。 nighttime.verbose 房间变暗; 简单直接的单条命令,使房间变暗。将此脚本全局存储。 verbose ?hour>6:房间变亮!房间变暗; 此脚本同样需要全局存储。系统会先判断当前时间是否已过早上6点。如果是,就判定为白天,房间会变亮;否则判定为夜晚,房间会变暗。 玩家 让我们给玩家赋予一些生命值。 玩家.生命值 = 100 再给一些可供花费的金币。 玩家.金币 = 100 建造另一个房间 要添加更多房间,请使用: 建造房间 方向 例如: 建造房间 n 这将在北方建造一个房间(如果该方向尚无房间),并创建通往北方房间的入口和从该房间通往南方的出口。 在房间内,你可以进行如下设置: 房间名称: 房间名称 是 房间名 例如: 房间名称 是 地牢 房间描述: 房间描述 是 房间描述内容 例如: 房间描述 是 一个潮湿、昏暗的地牢。 房间图像: 房间图像 是 图像名 例如: 房间图像 是 地牢 房间可见性: 房间 是 房间可见性状态 例如:房间一片漆黑 你可以为房间可见性设置以下数值: 伸手不见五指 微亮 黑暗 明亮 灯火通明 极亮 添加生存状态 首先,让我们设置一些基于生存的状态。 玩家.生命值 = 100 玩家.口渴值 = 100 玩家.饥饿值 = 100 玩家.能量值 = 100 接下来,我们将创建三个脚本文件,用于在玩家状态发生显著变化时为其提供反馈。不要忘记使用编辑器(.editor)存储它们——全局存储意味着它们可以在任何地方生效。本地存储则仅在特定房间内有效。例如,对于水这类会消耗玩家空气的场景非常适用。 hunger.verbose: #当前饥饿值=玩家.饥饿值; #当前饥饿值-1; 玩家.饥饿值 = 当前饥饿值; ?当前饥饿值<1:叙述 你因饥饿而死亡!; ?amihungry=1:叙述 你即将饿死!; ?amihungry=3:叙述 你正在饿死!; ?amihungry=5:叙述 你快要饿死了!; ?amihungry=10:叙述 你很饿!; ?amihungry=25:叙述 你非常饿!; ?amihungry=50:叙述 你饿了!; ?amihungry=75:叙述 你有点饿!; ?amihungry=100:叙述 你饱了!; thirst.verbose: #amithirsty=player.thirst; #amithirsty-2; player.thirst = amithirsty; ?amithirsty<1:叙述 你死于脱水!; ?amithirsty=2:叙述 你即将死于脱水!; ?amithirsty=4:叙述 你严重脱水!; ?amithirsty=6:叙述 你非常脱水!; ?amithirsty=10:叙述 你脱水了!; ?amithirsty=26:叙述 你很渴!;当口渴值=50:叙述 你渴了!; 当口渴值=74:叙述 你口干舌燥!; 当口渴值=100:叙述 你水分充足!; 能量详细状态: #疲劳值=玩家能量; 当疲劳值<0:叙述 你昏倒了!; 当疲劳值=0:叙述 你快要昏倒了!; 当疲劳值=10:叙述 你筋疲力尽!; 当疲劳值=25:叙述 你非常疲倦!; 当疲劳值=50:叙述 你开始感到疲倦!; 当疲劳值=75:叙述 你有点精神不振!; 当疲劳值=100:叙述 你精力充沛!; 注意在能量脚本中我们没有减少玩家的能量,这是因为我们将根据你执行的动作或命令来消耗能量,例如拿取重物或频繁移动。 现在我们可以设置两个定时事件来处理饥饿和口渴。每90秒触发饥饿 每60秒触发口渴 添加实时时钟 要设置实时时钟,我们将其附加到玩家身上,使其始终跟随我们。 player.seconds = 0 player.minutes = 0 player.hours = 0 player.days = 0 player.years = 1802 设置时钟的快捷方法是创建一个名为setupclock.verbose的脚本文件,并添加上述命令,以分号结尾,以便更快地导入到你的游戏中。 现在我们需要创建3个脚本中的第一个,这些脚本需要全局存储,以允许时间在任何地方运行: runtime.verbose #secs=player.seconds; #secs+1; player.seconds = secs; ?secs=60:do minute-passed!; 此脚本将每秒运行一次。该脚本会获取当前秒数,加1后重新存储,然后检查是否已过去60秒(即1分钟),若是则运行“minute-passed”脚本。 要每秒运行此脚本: 每1秒执行运行时 minute-passed #mins=玩家.分钟数; #mins+1; 玩家.分钟数 = mins; ?mins=60:执行 hour-passed!; 玩家.秒数 = 0; 此脚本获取当前分钟数,加1后重新存储,然后检查是否已过去60分钟(原文此处表述有误,应为1小时),若是则运行“hour-passed”脚本。此外,它会将秒数重置为0。 hour-passed #hrs=玩家.小时数; #hrs+1; 玩家.小时数 = hrs; ?hrs=24:执行 day-passed!; 玩家.分钟数 = 0; 此脚本获取当前小时数,加1后重新存储,然后检查是否已过去24小时(即1天),若是则运行“day-passed”脚本。此外,它会将分钟数重置为0。为了获取当前时间,我们需要创建另一个脚本: whattimeisit.verbose #小时数=玩家.小时数; #分钟数=玩家.分钟数; #秒数=玩家.秒数; 清除信息; 信息 当前时间为:; 信息 空格; 信息 小时数; 信息 :; 信息 分钟数; 信息 :; 信息 秒数; 调用此脚本时,会在屏幕底部中央的特殊调试消息中显示时间。它会获取当前的小时、分钟和秒数。 清除消息文本。 显示“当前时间为:” 显示一个空格(信息 空格) 显示小时数,后跟“:” 显示分钟数,后跟“:” 最后显示秒数。(如果不想显示秒数,可以省略最后两行,即模拟数字时钟的样式) 现在我们来处理天数... day-passed.verbose #天数=玩家.天数; #天数+1; 玩家.天数=天数; ?天数=365:执行 year-passed!; 玩家.小时 = 0; 此脚本会获取当前天数,加1后存回,若天数达到365则年份加1。同时会将小时重置为0。若你想自定义年长度,可添加玩家.年长度变量,并且将条件中的?days=365替换为首先将年长度存储到一个变量中,例如?days=年长度。 最后来说年份相关的处理。 year-passed.verbose #年数=玩家.年份; #年数+1; 玩家.年份 = 年数; 玩家.天数 = 0; 此最终脚本会获取当前年份,加1后存储新年份,并将天数重置为0。