一個用Vue.js 開發的冒險類游戲;

git clone https://github.com/bastarder/Endless.git
cd Endless
npm install
npm run dev如果你和我一樣, 是一名學生, 喜歡前端開發, 苦於沒有練手的項目, 或是您已經是獨當一面的大牛, 不妨可以與我一起完成這樣一個小遊戲, 在這個遊戲中最複雜的戰鬥系統已經基本完成, 剩下一些相對容易的功能, 能讓你得到很好的鍛煉。
這是一款簡單的冒險類游戲, 我也希望在編寫過程中能得到更好的鍛煉;
數據設計, UI設計方面, 我真的不擅長, 如果你覺得你閒來無事的時候願意幫忙, 可以聯繫我;
QQ:85257684 , Wechat: I85257
遊戲中的戰鬥系統採用技能冷却的模式,一次向一個目標發送一個技能,計算一次行動的效果為戰鬥邏輯
首先是大致邏輯:(Fight.js)
當技能被释放後會優先進入這個方法,此方法接受3個參數,技能对象,攻击方,被攻击方,可根據這3者定制,判斷此次技能是否能夠被釋放;
當技能被判定為能夠成功釋放以後, 技能將進入冷卻時間;
從攻擊者身上提取type : 1的狀態, 從被攻擊者身上提取type : 2的狀態;
type : 1為所有能夠影響到此次技能的狀態,並且自定義狀態時應該按照這一規則創建,否則將不被認可;
type : 2為所有能夠影響此次技能對敵人造成的改變的狀態,並且自定義狀態時應該按照這一規則創建,否則將不被認可;
將技能與狀態對像中的事件提取並且合併,按照優先級進行排序;
技能行動對象,由所有的狀態與技能行動效果進行計算而出,根據權重排序;
權重暫定的規則
1-10 Action層, 與影響本次暴击,命中,闪避等前置條件相關的事件,權重值需要定義在這個範圍;11-89普通層, 普通的效果,例如技能造成的傷害,狀態添加,移除,更新等,大多數都在普通層;>90在90層中,將會計算本次技能在所有可識別加成下的最終結果(如,造成傷害,恢復血量等等), 如果你的狀態需要造成一個最终加成, 例如最終傷害增加50%,那麼此事件必須定義在90層, 在計算結果確定後;9999最終層, 所有權重都不應該超出9999, 在計算此層時, 行動對象將被轉換為可被unit接口直接執行的參數,並且不再改變;行動對像生成完畢後, 判定此次攻擊是否有效(如必中,miss,等ps: 必中將優先於100%miss);
確定有效以後,將行動對象代理給攻击者與被攻击者處理;
至此,技能完全釋放完畢,每次釋放技能為1s ,也就是說釋放一個技能以後所有技能都將獲得1秒的冷卻(如果技能冷卻時間不滿1秒,將被強制提升至1秒);
一次技能釋放結束,如果攻擊方和被攻擊方,有一方死亡, 則返回false
消耗計算
目前採用的公式是: (等級* 基礎金額) * (強化等級+ 1) * 品級參數
機率計算
機率採用固定值: [1, 1, 1, 0.95, 0.9, 0.8, 0.75, 0.62, 0.54, 0.41, 0.33, 0.28, 0.2, 0.17, 0.13, 0.1, 0.04, 0.03, 0.01, 0.01]
屬性增幅計算
強化失敗後的處理
大致流程:判斷前置條件-> 判斷強化機率-> 重新計算屬性
在地圖中,我們總可以觸發事件,從而獲得特定的效果,目前內置的事件的有2種:
戰鬥事件: 當英雄走入此事件格子以後,將會利用事件對象創建一個戰鬥事件, 並且跳轉到戰鬥界面,當戰鬥完畢,在返回地圖;
對話事件: 當英雄走入此事件格子以後, 將會利用事件對象創建一個對話事件,與英雄進行一些對話交互,分支事件,物品交換等;
事件定義的規則:
1. 事件将在判定允许被移动后,直接执行;
2. 在执行阶段可捕获的参数有: 当前格子对象,目标格子对象,英雄对象
3. 事件必须为一个可执行的函数;
4. 详细可以参考内置事件(event-class.js)
在這裡,我們引用實例來解釋,技能對象的定義規則;
數據(skill-data.js,state-data.js),所有字符串形式將在战斗技能释放,计算行动对象时被轉換為可執行函數;
範例
{
id: 1000002,
name: '净化',
dsc : '净化中毒效果~',
label : ['测试2','伤害2'],
defaultTime : 3000,
restrict : [
"[attacker]{$mp} >= {60}",
"[attacker]{$hp} <= {250}",
"[attacker]{$skills} nothas {1000003,1000001}",
"[attacker]{$status} has {2000001}",
"[skill]{coolTime} > {0}",
function(skill, attacker, enemy){
return true;
}
],
eventList : [
`[1]enemy@changeHp@attacker.$atk`,
`[2]attacker@changeHp@2`,
`[3]
action@{action.state.isCritical === true};
attacker@{attacker.$hp > (attacker.$hp * 0.5)}
#
enemy@changeState@[{ id: 2000001, state: "ADD" }];
enemy@changeHp@attacker.$atk
`
,
`[4]action@{action.state.isCritical = true}`,
],
// 当为状态时还可以添加下面2个属性;
stateEvent : function(hero) {
var self = this;
var duration = 5;
var per = 1;
var current = 1;
self.stateEventTimer = setInterval(function(){
hero.changeHp(-30);
current +=1;
if(current > 5){
clearInterval(self.stateEventTimer);
hero.removeList('$status',self);
}
}, per * 1000);
this.actived = true;
},
powerUp : {
$maxHp : [0,0,0,0],
},
},
| key | value | dsc |
|---|---|---|
| id | Number | 技能的唯一標識 |
| name | String | 技能的名稱 |
| label | [String] | 技能的標籤 |
| defaultTime | Number | 技能冷卻時間,單位毫秒 |
| restrict | [String or function] | 技能釋放的前置條件,當解析為函數時,能訪問3個參數,技能,攻击者,被攻击者,當函數返回為true時表示此規則通過,字符串解析規則: [对象]{属性名1} 标识符{值} , 標識符支持> < >= <= nothas has ,表達式的最終值將被判定為真與假 |
| eventList | [String or function] | 事件列表, 可以為一個函數,函數中接受3個參數,行动对象,攻击者,被攻击者,字符串形式解析規則[权重]参数名@{前置条件语句}#参数名@事件@事件参数,可多條應該使用;分開,並且末尾條目不需要添加分隔符 |
| stateEvent | function | 持續狀態, 一個狀態被添加到對象身上時將被執行此函數,在此函數內可以訪問被作用的單位,做一些處理 |
| powerUp | object | 狀態能帶來的屬性提升, Array值解析, [值, 类型: 0:基础值1:基础百分2:高级值3:高级百分] , 屬性計算公式((默认+ 基础值) * (1 + 基础百分) + 高级值) * (1 + 高级百分) |
恭喜,至此你已經可以製作一個屬於自己的技能了
// 装备
{
id: 30000012,
name: '精致的铁剑',
level: 1,
grade: 1,
equipType : 0,
label: [
'武器'
],
intensify : 1,
intPowerUp : {
$atk: 123
},
equip : {
$def: 2,
$atk: 15,
$maxHp : 5,
$maxMp : 5,
},
dsc : '用野草编制的手镯'
}
// 物品
{
id: 3000001,
name: '野草',
pile : true,
price : 10,
use : {
defaultTime : 1000,
restrict :[
function(){
return this.$hp > 500;
}
],
effect :[
function(){
this.changeHp(30);
}
]
},
label : [
'材料'
],
dsc : '很常见的东西,或许能用来做一些东西'
},
| key | value | dsc |
|---|---|---|
| level | Number | 裝備的等級 |
| grade | Number | 裝備的品級白0 ,绿1 ,蓝2 ,紫3 ,橙4 |
| equipType | Number | 裝備類型武器0 ,护肩1 ,鞋子2 ,腰带3 ,上衣4 ,绑腿5 ,戒指6 ,项链7 ,手镯8 , |
| equip | object | 裝備的屬性參數的值與状态的powerUp相同 |
| intensify | Number | 強化等級 |
| intPowerUp | Object | 強化帶來的增益,武器為$atk ,其餘防具為$dmgDown (百分比減傷) |
| pile | Boolean | 是否可以疊加 |
| price | Number | 物品的價值 |
| use | object | 可使用物品的效果defaultTime :冷却时间, restrict 前置条件列表,接受函数为单个条件,this指向使用者, effect 造成的效果列表,接受函数为单个事件,this指向使用者 |
| 怎麼樣?是不是發現自己還是不會創建一個屬於自己的裝備~ 沒關係,是我表達的不好~ |