xy-server/game/object/StarMgr.ts
2025-04-23 09:34:08 +08:00

241 lines
7.0 KiB
TypeScript

import GameUtil from "../core/GameUtil";
import ItemUtil from "../core/ItemUtil";
import SKDataUtil from "../gear/SKDataUtil";
import { EAttrTypeL1, EAttrTypeL2 } from "../role/EEnum";
import EquipMgr from "./EquipMgr";
class Attr {
ID: number //属性id
Base: number //基础属性
Value: number //属性值
}
class Star {
ID: number //星阵id
Level: number //星阵等级
EquipAttr: Attr[] = [] //装备属性
FreshAttr: Attr[] = [] //洗练属性
constructor(id: number, level: number) {
this.ID = id
this.Level = level
this.EquipAttr = []
this.FreshAttr = []
}
GetObject() {
return {
id: this.ID,
level: this.Level,
equipAttr: this.EquipAttr,
freshAttr: this.FreshAttr
}
}
UpdateData(data: any) {
this.Level = data.level
this.EquipAttr = data.equipAttr
this.FreshAttr = data.freshAttr
}
GetAttr(pos: number): any {
let arr = EquipMgr.shared.lianhuaArr[pos]
let info = arr[Math.floor(Math.random() * arr.length)];
let type = GameUtil.attrEquipTypeStr[info.key]
if (type == EAttrTypeL2.GENGU ||type == EAttrTypeL2.LINGXING || type == EAttrTypeL2.LILIANG || type == EAttrTypeL2.MINJIE){
return this.GetAttr(pos)
}
return info
}
//洗练星阵
Fresh() {
let cnt = 2
if (this.ID <= 3) {
cnt = 5
}
this.FreshAttr = []
for (let index = 0; index < cnt; index++) {
let pos = this.ID + 1
let info = this.GetAttr(pos)
let valuearr = info[`pos${pos}`].split(',');
let deltaValue = Number(valuearr[1]) - Number(valuearr[0]);
let randValue = Math.random() * deltaValue
let fvalue = Number(valuearr[0]) + randValue;
let attrtype = GameUtil.attrEquipTypeStr[info.key];
let attr = new Attr()
attr.ID = attrtype
attr.Base = Math.floor(fvalue)
attr.Value = parseInt(String(attr.Base * (1 + 0.005 * this.Level)));
this.FreshAttr.push(attr)
}
}
//装备洗练属性
Equip(): number {
this.EquipAttr = this.FreshAttr
this.FreshAttr = []
return 0
}
//更新星阵属性
Update(){
if (this.EquipAttr.length != 0) {
for (let index = 0; index < this.EquipAttr.length; index++) {
let attr = this.EquipAttr[index];
attr.Value = parseInt(String(attr.Base * (1 + 0.005 * this.Level)));
}
}
if (this.FreshAttr.length != 0) {
for (let index = 0; index < this.FreshAttr.length; index++) {
let attr = this.FreshAttr[index];
attr.Value = parseInt(String(attr.Base * (1 + 0.005 * this.Level)));
}
}
}
}
export default class StarMgr {
StarList: Star[] = []
EquipID: number //装备的星阵id
Player: any
constructor(player: any) {
this.Player = player
this.EquipID = -1 //未装备星阵
//八个星阵位占位
for (let index = 0; index < 8; index++) {
let star = new Star(index, 1)
this.StarList.push(star)
}
}
setDB(data: string) {
let result = SKDataUtil.jsonBy(data)
if (result == null ) { return }
this.EquipID = result.equipid
let list = result.list
for (let index = 0; index < list.length; index++) {
let starData = list[index];
let star = this.StarList[starData.id]
star.UpdateData(starData)
}
}
ToJson() {
let obj: any = {
equipid: this.EquipID,
}
let list = []
for (let index = 0; index < this.StarList.length; index++) {
let star = this.StarList[index];
list.push(star.GetObject())
}
obj.list = list
return SKDataUtil.toJson(obj, "{}")
}
GetStarByID(starid: number): Star{
if(starid > this.StarList.length || starid < 0){
return null
}
return this.StarList[starid]
}
Upgrade(starid: number, upgrade: number){
if(starid > this.StarList.length || starid < 0){
return 1; //starid 不符合规则
}
let star = this.StarList[starid]
if (star.Level == 100) {
return 2; //已经满级不需要再升级
}
if (star.Level + upgrade > 100){
upgrade = 100 - star.Level
}
if(upgrade <= 0) {
return 3; //升级参数错误
}
let need = (2 * star.Level + upgrade - 1) * upgrade / 2 * 5
let has = ItemUtil.getBagItemCount(this.Player, 9654)
if (need > has){
return 4;
}
this.Player.update_bagitem({ operation: 0, itemid: 9654, count: need })
star.Level = star.Level + upgrade
star.Update()
return 0
}
GetNewStarAttr(starid: number){
if(starid > this.StarList.length || starid < 0){
return 1; //starid 不符合规则
}
let hasMoney = this.Player.GetMoney(GameUtil.goldKind.Money)
let has = ItemUtil.getBagItemCount(this.Player, 9655)
if (5 > has || 300000 > hasMoney){
return 2
}
this.Player.addMoney(GameUtil.goldKind.Money, -300000)
this.Player.update_bagitem({ operation: 0, itemid: 9655, count: 5 })
let star = this.StarList[starid]
star.Fresh()
return 0
}
ReplaceStarAttr(starid: number){
if(starid > this.StarList.length || starid < 0){
return 1; //starid 不符合规则
}
let star = this.StarList[starid]
if (star.FreshAttr.length == 0) {
return 2 //错误: 未进行洗练
}
star.Equip()
return 0
}
EquipStar(starid: number){
if(starid > this.StarList.length || starid < 0){
return 1; //starid 不符合规则
}
this.EquipID = starid
//todo: 更新玩家属性
return 0
}
calculateStarAttr(attrArry: { [key: number]: number }) {
if (this.EquipID == -1) return
let star = this.StarList[this.EquipID]
//额外增加冰混睡忘技能属性
if (this.EquipID == 7) {
let buf = star.Level * 0.3
attrArry[EAttrTypeL1.K_SEAL] = Math.floor(attrArry[EAttrTypeL1.K_SEAL] + buf)
attrArry[EAttrTypeL1.K_SLEEP] = Math.floor(attrArry[EAttrTypeL1.K_SLEEP] + buf)
attrArry[EAttrTypeL1.K_CONFUSION] = Math.floor(attrArry[EAttrTypeL1.K_CONFUSION] + buf)
attrArry[EAttrTypeL1.K_FORGET] = Math.floor(attrArry[EAttrTypeL1.K_FORGET] + buf)
}
if (star.EquipAttr.length == 0) return
for (let index = 0; index < star.EquipAttr.length; index++) {
let attr = star.EquipAttr[index];
attrArry[attr.ID] = Math.floor(attrArry[attr.ID] + attr.Value / 10)
}
}
}