我正在开发一个小型浏览器游戏,我遇到了一个设计问题,我能想到的唯一解决方案很糟糕。
它是一个典型的网络应用程序 - Angular2/HTML/JS 前端、带有 PostgreSQL DB 的 Java 服务器、托管在 nginx 和 Tomcat 上的内容
用户可以与具有自定义行为的各种 NPC(非玩家角色)进行交互。我已经通用化了这个逻辑,NPC 作为配置行存储在数据库中,
- 编号:1
- 名称:Sam The NPC
- ImgURL:“www.mygame.com/img/npc/sam.png”
访问 mygame.com/npc/1 会在 JS 中向 Java 中的后端 API 发出一个 GET,以从数据库中获取该行,然后绑定并显示这些值。将这些作为配置行存储在数据库中允许我添加新的 NPC 或编辑现有的 NPC,而无需重新部署服务器或前端代码。
到目前为止,标准。但是,我希望 NPC Sam 友好,拜访他会增加玩家的金钱。另一个 NPC,史蒂夫,应该是敌对的,并从玩家库存中移除金钱或物品。NPC 鲍勃有时可以解锁玩家任务。
这就是我卡住的地方:每个 NPC 都有完全不同的任意行为意味着我需要每个 NPC 的可执行代码。
在我看来,我的两个选择都很糟糕,但方式不同。
每个 NPC 都有自己的 Java 类,并且是服务器逻辑中的第一类实体。所有 NPC 都实现一个
interact()
方法,添加或更改 NPC 需要代码推送。每个 NPC 都会在数据库中获得一个包含可执行 JS 的新列,以通过 Java 中的脚本引擎运行。这有点危险,但也很麻烦。编写可以通过与 Java 代码库交互然后将其作为字符串保存在数据库中来调用 DB 函数的 JS 是很笨拙的。
我目前正在使用选项 2,但并不太深入,我想知道是否有一种公认的方式来处理这样的事情会更好。