当前位置: 首页 > news >正文

【cocos creator】养成游戏简易事件系统,每日随机事件,每日行动点重置,根据数据检测多结局

在这里插入图片描述

在这里插入图片描述


const { ccclass, property } = cc._decorator;let actionEvent = {EVENT1: { name: "工作", need: { ap: 1 }, cost: { ap: 1 }, award: { coin: 50 }, count: 7, max_count: 5 },EVENT2: { name: "练功", need: { ap: 1 }, cost: { ap: 1 }, award: { attack: 10 }, count: 7, max_count: 5 },EVENT3: { name: "买秘籍", need: { coin: 500 }, cost: { ap: 1, coin: 1000 }, award: { attack: 100 }, count: 1, max_count: 1 },EVENT4: { name: "吃饭", need: { coin: 20 }, cost: { coin: 20 }, award: { ap: 2 }, count: 2, max_count: 2 },
}//随机事件,按照条件判定,满足走分支,不满足走下一个
const reActionEvent = {EVENT4: { name: "捡到物品还给失主,获得赏赐", need: {}, rate: 25, weight: 1, count: 5, cost: {}, award: { coin: 100 } },EVENT1: { name: "采到稀有药草,卖了好价钱", need: {}, rate: 25, weight: 1, count: 5, cost: {}, award: { coin: 200 } },EVENT2: { name: "遇到高僧指点功夫", need: { day: 10, coin: 100 }, rate: 10, weight: 1, count: 1, cost: { coin: 100 }, award: { attack: 400 } },EVENT6: { name: "捡到武功秘籍", need: { day: 5, coin: 100 }, rate: 10, weight: 1, count: 3, cost: {}, award: { attack: 50 } },EVENT3: { name: "遇到小偷", need: { coin: 1 }, rate: 25, weight: 1, count: -2, cost: {}, award: { coin: 100 } },EVENT5: { name: "下雨滑了一跤,就医", need: { coin: 1 }, rate: 25, weight: 1, count: 3, cost: {}, award: { coin: -100 } },EVENT_END: { name: "没什么特别的事情发生" },
}//结局事件
const endEvent = {EVENT4: { name: "富豪", need: { day: 30, coin: 6000 }, weight: 97, count: -2, cost: {}, desc: "达成结局:富豪\n\n成为远近闻名的大富豪", eading: 1 },EVENT5: { name: "武林高手", need: { day: 30, attack: 1200 }, weight: 99, count: -2, cost: {}, desc: "达成结局:武林高手\n\n战胜上任武林盟主,成为\n江湖人闻风丧胆的武林高手", eading: 1 },EVENT1: { name: "侠客", need: { day: 30, coin: 10, attack: 600 }, weight: 96, count: -2, cost: {}, desc: "达成结局:侠客\n\n为弱者不平,成为劫富济贫的侠客", eading: 1 },EVENT6: { name: "举人", need: { day: 30, attack: 1000 }, weight: 98, count: -2, cost: {}, desc: "达成结局:武举人\n\n成功通过武举人考试,成为武官", eading: 1 },EVENT7: { name: "店主", need: { day: 30, coin: 1500 }, weight: 95, count: -2, cost: {}, desc: "达成结局:店主\n\n开了一家属于自己的小店,为了过上更好的生活努力着", eading: 1 },EVENT_END: { name: "普通人", need: { day: 30 }, weight: 82, count: -2, cost: {}, desc: "达成结局:普通人\n\n继续着平凡的生活", eading: 1 }
}
//结局事件
const deathEvent = {EVENT3: { name: "半道崩卒", need: { day: 10 }, check: { attack: 100 }, weight: 99, canSkip: false, count: -2, cost: { life: 10 }, desc: "达成结局:强盗当道\n\n遇到强盗袭击战败,暴尸荒野", eading: 1 },EVENT2: { name: "无力就医", need: { day: 5 }, check: { coin: 50 }, rate: 25, weight: 99, canSkip: false, count: -2, cost: { life: 10 }, desc: "达成结局:无力就医\n\n遇到野兽袭击,没钱支付医药费,遗憾离世", eading: 1 }
}const descName = {coin: "总财产",attack: "武力值",life: "生命值",ap: "行动点",max_ap: "最大行动数",
}@ccclass
export default class TimePanel extends cc.Component {@property(cc.Label)tipsNode: cc.Label = null;@property(cc.Label)nowData: cc.Label = null;@property(cc.Label)time: cc.Label = null;@property(cc.Node)btnArr: cc.Node[] = [];nowDay = 1;defaultPlayData = {ap: 5,max_ap: 5,coin: 0,attack: 5,life: 10,}playData = JSON.parse(JSON.stringify(this.defaultPlayData))monsterData = {attack: 99,life: 1000,}end = false;onLoad() {let gameData = cc.sys.localStorage.getItem("data") || nullif (!gameData) {gameData = this.getSaveData()}if (gameData) {const { actionEventAll, playData, nowDay } = gameData;if (actionEventAll) {for (const key in actionEventAll) {if (Object.prototype.hasOwnProperty.call(actionEventAll, key)) {const element1 = actionEvent[key];if (!element1) continueelement1.count = actionEventAll[key].count || 0;}}}if (playData) this.playData = playData;if (nowDay) {this.nowDay = nowDay;this.checkPlayEvent()}}this.tipsNode.string = ""this.updateNowData()this.updateTime()this.updateAction()for (let i = 0; i < this.btnArr.length; i++) {let eventName = `EVENT${i + 1}`let data = actionEvent[eventName]if (!data) returnconst element = this.btnArr[i];element.getComponentInChildren(cc.Label).string = `${data.name} (${data.count})`element.on(cc.Node.EventType.TOUCH_START, () => {this.onEventBtn({ target: element }, (i + 1) + "")})}if (this.nowDay != 1) {this.checkPlayEvent()}}getDesc(data, needN = true, showAdd = false, isAdd = true) {let str = ""for (const key in data) {if (Object.prototype.hasOwnProperty.call(data, key)) {if (key.split("max_").length > 1) continueconst element = data[key];let symble = isAdd ? `${element > 0 ? "+" : "-"}${Math.abs(element)}` : `-${Math.abs(element)}`if (!showAdd) symble = `${Math.abs(element)}`str += (`${descName[key] || key} ${symble}` + (data["max_" + key] ? `/${data["max_" + key]}` : ""))str += (needN ? "\n" : ",")}}if (needN) str += ("\n")return str}updateNowData() {let str = this.getDesc(this.playData, true)this.nowData.string = str}updateTime() {this.time.string = `${this.nowDay}`}updateAction(data?) {if (!data) {this.tipsNode.string = ""return}// EVENT1: { name: "赚钱", need: { }, cost: { ap: 1 }, award: { coin: 50 } },let str = ""if (data.name) {str += (`行动:${data.name}\n\n`)}if (data.cost && Object.keys(data.cost).length > 0) {str += `${this.getDesc(data.cost, true, true, false)}`}if (data.award && Object.keys(data.award).length > 0) {str += `${this.getDesc(data.award, true, true)}`}// str += `剩余次数 ${data.count}`this.tipsNode.string = str}updateEvent(data?) {if (!data) {this.tipsNode.string = "无事发生"return}// EVENT1: { name: "赚钱", need: { }, cost: { ap: 1 }, award: { coin: 50 } },let str = ""if (data.name) {str += (`${data.name}\n\n`)}if (data.cost && Object.keys(data.cost).length > 0) {str += `${this.getDesc(data.cost, true, true, false)}`}if (data.award && Object.keys(data.award).length > 0) {str += `${this.getDesc(data.award, true, true)}`}this.tipsNode.string = str}onEventBtn(event, id) {if (this.end) return;id = Number(id)let eventName = `EVENT${id}`let data = actionEvent[eventName]if (!data) return// EVENT1: { name: "赚钱", need: { }, cost: { ap: 1 }, award: { coin: 50 } },if (!this.checkCanCost(data, true)) {return}this.changeData(data.cost, false);this.changeData(data.award);if (data.count != -2) data.count--;event.target.getComponentInChildren(cc.Label).string = `${data.name} (${data.count})`this.updateAction(data);this.updateNowData();}setTips(desc) {this.tipsNode.string = desc}onNextDayBtn() {if (this.end) return;this.nowDay++;this.cleadDayData()this.updateTime()this.updateNowData()this.updateAction()this.save()this.checkPlayEvent()}cleadDayData() {this.playData.ap = this.playData.max_ap;for (const key in actionEvent) {if (Object.prototype.hasOwnProperty.call(actionEvent, key)) {const data = actionEvent[key];data.count = data.max_count;let node = this.btnArr[Number(key.split("EVENT")[1]) - 1]if (!node) continue;node.getComponentInChildren(cc.Label).string = `${data.name} (${data.count})`}}}checkCanCost(data, showTips = false, isCheck = false) {if (data.count != -2 && data.count <= 0) {data.count == 0if (showTips) this.setTips(data.name + "次数达到每日上限")return false}let obj = isCheck ? data.check : data.needfor (const key in obj) {if (Object.prototype.hasOwnProperty.call(obj, key)) {const element = obj[key];if (key == "day") {if (this.nowDay < element) return falsecontinue}if (!cc.isValid(this.playData[key])) continue;if (this.playData[key] - element < 0) {if (showTips) this.setTips(`${descName[key]}不足`)return false;}}}for (const key in data.award) {if (Object.prototype.hasOwnProperty.call(data.award, key)) {const element = data.award[key];if (!cc.isValid(this.playData[key])) continue;if (cc.isValid(this.playData["max_" + key]) && this.playData[key] >= this.playData["max_" + key]) {if (showTips) this.setTips(`${descName[key]}已满`)return false;}}}return true}changeData(data, isAdd = true) {for (const key in data) {if (Object.prototype.hasOwnProperty.call(data, key)) {let element = data[key];if (cc.isValid(data[key + "_max"])) element = this.randomInt(data[key], data[key + "_max"]);if (!cc.isValid(this.playData[key])) continue;this.playData[key] = this.playData[key] + (isAdd ? 1 : -1) * elementif (!cc.isValid(this.playData["min_" + key]) && this.playData[key] < 0) this.playData[key] = 0if (cc.isValid(this.playData["max_" + key]) && this.playData[key] > this.playData["max_" + key]) {this.playData[key] = this.playData["max_" + key]}if (!cc.isValid(this.playData["min_" + key]) && this.playData[key] < this.playData["min_" + key]) {this.playData["min_" + key] = this.playData["min_" + key]}}}}getSaveData() {let data = {actionEventAll: actionEvent,playData: this.playData,nowDay: this.nowDay}return data}save() {let data = this.getSaveData()cc.sys.localStorage.setItem("data", data)return data}checkPlayEvent() {let data = null;let eventList = [deathEvent, endEvent, reActionEvent]for (let i = 0; i < eventList.length; i++) {const event = eventList[i];for (const key in event) {if (Object.prototype.hasOwnProperty.call(event, key)) {const element = event[key];if (element.canSkip == false) {let show = element.rate ? element.rate > Math.random() * 100 : trueif (!show) continue;if (!this.checkCanCost(element)) continue;if (this.checkCanCost(element, false, true)) continue;data = element;this.playEventData(data)return;}if (data && !element.weight) continueif (data && element.weight < data.weight) continueif (data && element.eading && element.weight == data.weight && Object.keys(element.need).length < Object.keys(data.need).length) continueif (!this.checkCanCost(element)) continue;let show = element.rate ? element.rate > Math.random() * 100 : trueif (!show) continue;data = element;}}}this.playEventData(data)}playEventData(data) {if (data) {this.changeData(data.cost, false);this.changeData(data.award);this.updateEvent(data);if (data.count != -2) data.count--;this.updateNowData();if (data.eading) {this.setTips(data.desc)this.end = truereturn data}return}this.tipsNode.string = reActionEvent.EVENT_END.name}reStartBtn() {cc.sys.localStorage.removeItem("data")this.nowDay = 1;this.end = false;this.updateTime()this.playData = JSON.parse(JSON.stringify(this.defaultPlayData))this.updateNowData()this.updateAction()this.save()}randomInt(min, max?) {if (min == max) return min;if (max === undefined) {max = min[1];min = min[0];}return Math.floor(Math.random() * (max - min + 1)) + min;}
}

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 【Unity输入】Input Manager 和 Input System对比
  • 实训第三十二天(学习playbook-roles,脚本创建数据库和表,mycat读写分离)
  • 2024年程序员金九银十面试宝典持续更新中.....
  • 【Spring Boot 3】【Web】同时启用 HTTP 和 HTTPS
  • 命令模式与宏命令:批量操作的高效实现
  • 探索Edge-TTS与WebSocket集成:打造实时语音交互系统
  • 【网络编程通关之路】 Tcp 基础回显服务器(Java实现)及保姆式知识原理详解 ! ! !
  • addroutes和next()导致的页面无法跳转问题,如登录之后无法跳转到首页,无法重定向,使用next(to)
  • 树、二叉树
  • 42-java 为什么要有包装类
  • 设置 Nginx、MySQL 日志轮询
  • 栈与队列--python
  • webpack4手动搭建Vue项目
  • 石油设备和相关机械都包涵那些?
  • GLM-4-Long加持的RAG:更准,更简,更全!
  • 【刷算法】从上往下打印二叉树
  • 2017年终总结、随想
  • angular2开源库收集
  • javascript 哈希表
  • Python利用正则抓取网页内容保存到本地
  • Redis字符串类型内部编码剖析
  • spring boot下thymeleaf全局静态变量配置
  • 基于OpenResty的Lua Web框架lor0.0.2预览版发布
  • 两列自适应布局方案整理
  • 你真的知道 == 和 equals 的区别吗?
  • 爬虫模拟登陆 SegmentFault
  • 全栈开发——Linux
  • 问题之ssh中Host key verification failed的解决
  • 用quicker-worker.js轻松跑一个大数据遍历
  • 在 Chrome DevTools 中调试 JavaScript 入门
  • 转载:[译] 内容加速黑科技趣谈
  • Spark2.4.0源码分析之WorldCount 默认shuffling并行度为200(九) ...
  • ​一、什么是射频识别?二、射频识别系统组成及工作原理三、射频识别系统分类四、RFID与物联网​
  • ######## golang各章节终篇索引 ########
  • #13 yum、编译安装与sed命令的使用
  • (C语言)二分查找 超详细
  • (附源码)ssm码农论坛 毕业设计 231126
  • (附源码)计算机毕业设计SSM智慧停车系统
  • (回溯) LeetCode 78. 子集
  • (佳作)两轮平衡小车(原理图、PCB、程序源码、BOM等)
  • (六)激光线扫描-三维重建
  • (论文阅读23/100)Hierarchical Convolutional Features for Visual Tracking
  • (每日一问)计算机网络:浏览器输入一个地址到跳出网页这个过程中发生了哪些事情?(废话少说版)
  • (七)MySQL是如何将LRU链表的使用性能优化到极致的?
  • (小白学Java)Java简介和基本配置
  • (源码版)2024美国大学生数学建模E题财产保险的可持续模型详解思路+具体代码季节性时序预测SARIMA天气预测建模
  • *p=a是把a的值赋给p,p=a是把a的地址赋给p。
  • .net core Swagger 过滤部分Api
  • .net core 客户端缓存、服务器端响应缓存、服务器内存缓存
  • .NET delegate 委托 、 Event 事件
  • .NET编程C#线程之旅:十种开启线程的方式以及各自使用场景和优缺点
  • .NET中使用Redis (二)
  • ::前边啥也没有
  • @angular/cli项目构建--Dynamic.Form
  • @cacheable 是否缓存成功_让我们来学习学习SpringCache分布式缓存,为什么用?