using GameClass.Skill; using Preparation.Utility; using System.Collections.Generic; using System; namespace GameClass.GameObj { public partial class Character { private readonly CharacterType characterType; public CharacterType CharacterType => characterType; private readonly IOccupation occupation; public IOccupation Occupation => occupation; private Dictionary timeUntilActiveSkillAvailable; public Dictionary TimeUntilActiveSkillAvailable => timeUntilActiveSkillAvailable; public bool SetTimeUntilActiveSkillAvailable(ActiveSkillType activeSkillType, int timeUntilActiveSkillAvailable) { if (TimeUntilActiveSkillAvailable.ContainsKey(activeSkillType)) { lock (gameObjLock) this.timeUntilActiveSkillAvailable[activeSkillType] = (timeUntilActiveSkillAvailable > 0) ? timeUntilActiveSkillAvailable : 0; return true; } return false; } public bool AddTimeUntilActiveSkillAvailable(ActiveSkillType activeSkillType, int addTimeUntilActiveSkillAvailable) { if (TimeUntilActiveSkillAvailable.ContainsKey(activeSkillType)) { lock (gameObjLock) this.timeUntilActiveSkillAvailable[activeSkillType] = (timeUntilActiveSkillAvailable[activeSkillType] + addTimeUntilActiveSkillAvailable > 0) ? timeUntilActiveSkillAvailable[activeSkillType] + addTimeUntilActiveSkillAvailable : 0; return true; } return false; } public bool UseActiveSkill(ActiveSkillType activeSkillType) { if (Occupation.ListOfIActiveSkill.Contains(ActiveSkillFactory.FindIActiveSkill(activeSkillType))) return ActiveSkillFactory.FindIActiveSkill(activeSkillType).SkillEffect(this); return false; } public void UsePassiveSkill(PassiveSkillType passiveSkillType) { if (Occupation.ListOfIPassiveSkill.Contains(PassiveSkillFactory.FindIPassiveSkill(passiveSkillType))) PassiveSkillFactory.FindIPassiveSkill(passiveSkillType).SkillEffect(this); return; } public bool IsGhost() { return this.characterType switch { CharacterType.Assassin => true, _ => false, }; } public Character(XY initPos, int initRadius, PlaceType initPlace, CharacterType characterType, ActiveSkillType commonSkillType) : base(initPos, initRadius, initPlace, GameObjType.Character) { this.CanMove = true; this.score = 0; this.propInventory = null; this.buffManager = new BuffManager(); switch (characterType) { case CharacterType.Assassin: this.occupation = new Assassin(); break; default: this.occupation = null; break; } this.MaxHp = occupation.MaxHp; this.hp = occupation.MaxHp; this.OrgMoveSpeed = occupation.MoveSpeed; this.moveSpeed = occupation.MoveSpeed; this.cd = occupation.CD; this.maxBulletNum = occupation.MaxBulletNum; this.bulletNum = maxBulletNum; this.bulletOfPlayer = occupation.InitBullet; this.OriBulletOfPlayer = occupation.InitBullet; this.characterType = characterType; foreach (var activeSkill in this.Occupation.ListOfIActiveSkill) { this.TimeUntilActiveSkillAvailable.Add(ActiveSkillFactory.FindActiveSkillType(activeSkill), 0); } // UsePassiveSkill(); //创建player时开始被动技能,这一过程也可以放到gamestart时进行 // 这可以放在AddPlayer中做 Debugger.Output(this, "constructed!"); } } }