private void Input(ICharacter player)
        {
            var info = Console.ReadKey();

            switch (info.Key)
            {
                case ConsoleKey.Spacebar:
                    var ninja = Enemies.FirstOrDefault();

                    player.Atack(ninja);

                    if (ninja != null && ninja.Blood == 0)
                    {
                        Enemies.Remove(ninja);
                    }
                    break;

                case ConsoleKey.LeftArrow:
                    player.Move(Direction.Left);
                    break;

                case ConsoleKey.UpArrow:
                    player.Move(Direction.Up);
                    break;

                case ConsoleKey.RightArrow:
                    player.Move(Direction.Right);
                    break;

                case ConsoleKey.DownArrow:
                    player.Move(Direction.Down);
                    break;
            }
        }
 public override void ExecuteCommand(ICharacter character, Identity target, string[] args)
 {
     Vendor v = Pool.Instance.GetObject<Vendor>(character.Playfield.Identity, target);
     if (v != null)
     {
         int pfid = character.Playfield.Identity.Instance;
         StatelData sd =
             PlayfieldLoader.PFData[pfid].Statels.FirstOrDefault(x => x.Identity.Equals(v.OriginalIdentity));
         if (sd != null)
         {
             int instance = (((sd.Identity.Instance) >> 16) & 0xff
                             | (character.Playfield.Identity.Instance << 16));
             DBVendor dbv = new DBVendor();
             dbv.Id = instance;
             dbv.Playfield = pfid;
             dbv.X = sd.X;
             dbv.Y = sd.Y;
             dbv.Z = sd.Z;
             dbv.HeadingX = sd.HeadingX;
             dbv.HeadingY = sd.HeadingY;
             dbv.HeadingZ = sd.HeadingZ;
             dbv.HeadingW = sd.HeadingW;
             dbv.Name = "New shop, please fill me";
             dbv.TemplateId = sd.TemplateId;
             dbv.Hash = "";
             VendorDao.Instance.Delete(dbv.Id);
             VendorDao.Instance.Add(dbv, dontUseId: false);
         }
     }
 }
示例#3
0
文件: Game.cs 项目: Nitboy/RPGBase
 public IEncounter CreateNewEncounter()
 {
     player = CharacterFactory.CreatePlayerCharacter();
     monster = CharacterFactory.CreateMonster();
     encounter = new Encounter(player, monster);
     return encounter;
 }
示例#4
0
        public virtual int Hit(ICharacter enemy)
        {
            int damage = (this.Damage +this.Master.AttackPoints/10)*(1000 - enemy.DefencePoints)/1000;
            enemy.HealthPoints -= damage;

            return damage;
        }
示例#5
0
        public override CommandResult Execute(ICharacter subject)
        {
            ICharacter character = subject;

            if (character.CurrentAnimationSeq == null) return new CommandResult(CommandStatusEnum.NotFinished);
            if (character.CurrentAnimationSeq._isEnd) return new CommandResult(CommandStatusEnum.NotFinished);

            switch (character.CurrentAnimationSeq._purpose)
            {
                case AnimationPurposeEnum.Moving:
                    if (!character.CurrentAnimationSeq._isEnd)
                    {
                        PointF point = character.CurrentAnimationSeq._destPoint;
                        character.DestAnimationPt = point;

                        if (Move(character))
                        {
                            character.CurrentAnimationSeq._isEnd = true;
                        }
                    }
                    break;
                default:
                    if (character.CurrentAnimationRunner._isEnd)
                        character.CurrentAnimationSeq._isEnd = true;
                    break;
            }

            return new CommandResult(CommandStatusEnum.NotFinished);
        }
示例#6
0
	public EnemyAI(ICharacter Character, Vector3 AttackPosition):base(Character)
	{
		m_AttackPosition = AttackPosition;

		// 一開始起始的狀態
		ChangeAIState(new IdleAIState());
	}
示例#7
0
 public void RaiseAction(ICharacter character, int raise, ISingleBet bet)
 {
     character.HasRaised = true;
     character.Raise(raise);
     bet.AddBet(raise);
     bet.LastBet = raise;
 }
示例#8
0
 public override void Decide(ICharacter character, IList<ICard> cardCollection,
                            int firstCard, int secondCard, int botChips,
                            bool isFinalTurn, Label hasFolded, int botIndex,
                            double botPower, double behaviourPower, int callSum)
 {
     this.IsOnTurn = true;
 }
        public FieldType NextField(ICharacter character)
        {
            int x = character.PositionX;
            int y = character.PositionY;
            switch (character.ActualTurn)
            {
                case TurnType.Turn0:
                    x++;
                    break;
                case TurnType.Turn90:
                    y--;
                    break;
                case TurnType.Turn180:
                    x--;
                    break;
                case TurnType.Turn270:
                    y++;
                    break;
            }

            if (x < 0 || x >= Level.BorderSize ||
                y < 0 || y >= Level.BorderSize)
            {
                return FieldType.Obstacle;
            }
            return Level.GameBoard[x, y];
        }
        private int Choose(ICharacter player)
        {
            ICharacter target = new Enemy();

            var random = new Random();

            ConsoleKeyInfo option = Console.ReadKey(true);

            switch (option.Key)
            {
                case ConsoleKey.Escape:
                    Environment.Exit(0);
                    break;

                case ConsoleKey.A:
                    player.Move(Direction.Up);
                    break;

                case ConsoleKey.B:
                    player.Atack(target);
                    break;
                
            }

            return random.Next(0, 1980);
        }
 /// <summary>
 /// Initializes a new instance of the <see cref="OccupancyChangedEventArgs"/> class.
 /// </summary>
 /// <param name="occupant">The occupant.</param>
 /// <param name="departureRoom">The departure room.</param>
 /// <param name="arrivalRoom">The arrival room.</param>
 public OccupancyChangedEventArgs(ICharacter occupant, ITravelDirection travelDirection, DefaultRoom departureRoom, DefaultRoom arrivalRoom)
 {
     this.Occupant = occupant;
     this.DepartureRoom = departureRoom;
     this.ArrivalRoom = arrivalRoom;
     this.TravelDirection = travelDirection;
 }
        //TODO:from int to double return type
        public void CheckHandPower(ICharacter player, IList<ICard> tableCards)
        {
            decimal powerToSet = 0;

            powerToSet = CheckFourOfKind(player, tableCards);
            if (powerToSet >= initialPowerFourOfKind)
            {
                player.Power = powerToSet;
                return;
            }

            powerToSet = CheckForFullHouse(player, tableCards);
            if (powerToSet >= initialPowerFullHouse)
            {
                player.Power = powerToSet;
                return;
            }


            powerToSet = CheckForFlush(player, tableCards);
            if (powerToSet >= initialPowerFlush)
            {
                player.Power = powerToSet;
                return;
            }

            powerToSet = CheckForStraight(player, tableCards);
            if (powerToSet >= initialPowerStraight)
            {
                player.Power = powerToSet;
                return;
            }

            powerToSet = CheckForThreeOfKind(player, tableCards);
            if (powerToSet >= initialPowerThreeOfKind)
            {
                player.Power = powerToSet;
                return;
            }

            powerToSet = CheckForTwoPair(player, tableCards);
            if (powerToSet >= initialPowerTwoPair)
            {
                player.Power = powerToSet;
                return;
            }

            powerToSet = CheckForOnePair(player, tableCards);
            if (powerToSet >= initialPowerOnePair)
            {
                player.Power = powerToSet;
                return;
            }

            powerToSet = CheckForHighCard(player);
            if (powerToSet >= 1)
            {
                player.Power = powerToSet;
            }
        }
 public virtual void MapToEntity(ICharacterModel model, ref ICharacter entity, int currentDepth = 1)
 {
     currentDepth++;
     // Assign Base properties
     NameableEntityMapper.MapToEntity(model, ref entity);
     // Character Properties
     entity.RealName = model.RealName;
     entity.DateOfBirth = model.DateOfBirth;
     // Related Objects
     entity.PrimaryImageFileId = model.PrimaryImageFileId;
     entity.PrimaryImageFile = (ImageFile)model.PrimaryImageFile?.MapToEntity();
     entity.FirstIssueAppearanceId = model.FirstIssueAppearanceId;
     entity.FirstIssueAppearance = (Issue)model.FirstIssueAppearance?.MapToEntity();
     entity.GenderId = model.GenderId;
     entity.Gender = (Gender)model.Gender?.MapToEntity();
     entity.OriginId = model.OriginId;
     entity.Origin = (Origin)model.Origin?.MapToEntity();
     entity.PublisherId = model.PublisherId;
     entity.Publisher = (Publisher)model.Publisher?.MapToEntity();
     // Associated Objects
     entity.CharacterAliases = model.CharacterAliases?.Where(i => i.Active).Select(CharacterAliasMapperExtensions.MapToEntity).ToList();
     entity.CharacterCreators = model.CharacterCreators?.Where(i => i.Active).Select(CharacterCreatorMapperExtensions.MapToEntity).ToList();
     entity.CharacterEnemies = model.CharacterEnemies?.Where(i => i.Active).Select(CharacterEnemyMapperExtensions.MapToEntity).ToList();
     entity.CharacterEnemyTeams = model.CharacterEnemyTeams?.Where(i => i.Active).Select(CharacterEnemyTeamMapperExtensions.MapToEntity).ToList();
     entity.CharacterFriends = model.CharacterFriends?.Where(i => i.Active).Select(CharacterFriendMapperExtensions.MapToEntity).ToList();
     entity.CharacterFriendlyTeams = model.CharacterFriendlyTeams?.Where(i => i.Active).Select(CharacterFriendlyTeamMapperExtensions.MapToEntity).ToList();
     entity.CharacterIssuesAppearedIn = model.CharacterIssuesAppearedIn?.Where(i => i.Active).Select(CharacterAppearedInIssueMapperExtensions.MapToEntity).ToList();
     entity.CharacterIssuesDiedIn = model.CharacterIssuesDiedIn?.Where(i => i.Active).Select(CharacterDiedInIssueMapperExtensions.MapToEntity).ToList();
     entity.CharacterIssues = model.CharacterIssues?.Where(i => i.Active).Select(CharacterIssueMapperExtensions.MapToEntity).ToList();
     entity.CharacterMovies = model.CharacterMovies?.Where(i => i.Active).Select(CharacterMovieMapperExtensions.MapToEntity).ToList();
     entity.CharacterPowers = model.CharacterPowers?.Where(i => i.Active).Select(CharacterPowerMapperExtensions.MapToEntity).ToList();
     entity.CharacterStoryArcs = model.CharacterStoryArcs?.Where(i => i.Active).Select(CharacterStoryArcMapperExtensions.MapToEntity).ToList();
     entity.CharacterTeams = model.CharacterTeams?.Where(i => i.Active).Select(CharacterTeamMapperExtensions.MapToEntity).ToList();
     entity.CharacterVolumes = model.CharacterVolumes?.Where(i => i.Active).Select(CharacterVolumeMapperExtensions.MapToEntity).ToList();
 }
示例#14
0
 public InputCommandResult(bool isCommandCompleted, IInputCommand command, ICharacter executor)
 {
     this.Result = string.Empty;
     this.IsCommandCompleted = isCommandCompleted;
     this.CommandExecuted = command;
     this.Executor = executor;
 }
示例#15
0
		private void onSaveGameLoaded()
		{
			_panel = _game.Find<IPanel>(_panel.ID);
			_inventoryItemIcon = _game.Find<IObject>(_inventoryItemIcon.ID);
			_player = _game.State.Player;
			_lastInventoryItem = null;
		}
示例#16
0
        public override void Update(GameTime gameTime, ICharacter character)
        {
            this.TimeSinceLastFrame += gameTime.ElapsedGameTime.Milliseconds;
            if (this.TimeSinceLastFrame < this.TimePerFrame)
            {
                return;
            }
            this.TimeSinceLastFrame = gameTime.ElapsedGameTime.Milliseconds;

            KeyboardState keyState = Keyboard.GetState();

            bool moving = ((Player)character).KbKeys.Any(key => keyState.IsKeyDown(key));

            if (moving || this.CurrentFrame != 5)
            {
                if (this.reverse)
                {
                    this.CurrentFrame--;
                }
                else
                {
                    this.CurrentFrame++;
                }

                if (this.CurrentFrame == this.TotalFrames - 1 || this.CurrentFrame == 0)
                {
                    this.reverse = !this.reverse;
                }
            }
        }
 public CommandCompletionArgs(string command, ICharacter owner, IEnumerable<string> args, InputCommandResult result)
 {
     this.Command = command;
     this.Arguments = args;
     this.Owner = owner;
     this.CommandResult = result;
 }
示例#18
0
 public void Draw(ICharacter character, SpriteBatch spriteBatch)
 {
     foreach (IStat stat in Stats)
     {
         stat.Draw(character, spriteBatch);
     }
 }
示例#19
0
 public static void ToStringModelView(ICharacter c, int nest, StringBuilder sb, out bool oneLiner)
 {
     if (c is Sprite)
     {
         ((Sprite)c).ToStringModelView(nest, sb, out oneLiner);
     }
     else if (c is EditText)
     {
         ((EditText)c).ToStringModelView(nest, sb, out oneLiner);
     }
     else if (c is StaticText)
     {
         ((StaticText)c).ToStringModelView(nest, sb, out oneLiner);
     }
     else if (c is IImage)
     {
         ((IImage)c).ToStringModelView(nest, sb, out oneLiner);
     }
     else if (c is IShape)
     {
         ((IShape)c).ToStringModelView(nest, sb, out oneLiner);
     }
     else
     {
         throw new Exception("*** ERROR: CAN'T DUMP: " + c.ToString());
     }
 }
示例#20
0
 public void ModifyOnCreation(ICharacter subject)
 {
     subject.Hitpoints.Max = HitDie + subject.Constitution.Modifier;
     subject.Hitpoints.Current = subject.Hitpoints.Max;
     subject.Skills.AddRanks(GetSkillPointsCreation(subject));
     ClassModifyOnCreation(subject);
 }
示例#21
0
 //
 // This constructor's purpose is entirely for making a deep copy of the object type
 //
 public Character(ICharacter c)
 {
     foreach (var property in typeof(Character).GetProperties())
     {
         property.SetValue(this, property.GetValue(c));
     }
 }
示例#22
0
        public void Add(ICharacter character)
        {
            if (character == null) throw new ArgumentNullException("character");

            lock (_characters)
                _characters.Add(character.Id, character);
        }
示例#23
0
    /// <summary>
    /// Sets the stat scaling on this weapon based on the user character's selected attribute. </summary>
    /// <param name='userStats'> User character's stat module. </param>
    public void SetScaling(ICharacter user)
    {
        switch (scalingAttribute) {
                case CharacterAttribute.AttributeName.Vitality:
                        _scalingAtt = user.CharStats.Vitality;
                        break;
                case CharacterAttribute.AttributeName.Endurance:
                        _scalingAtt = user.CharStats.Endurance;
                        break;
                case CharacterAttribute.AttributeName.Spirit:
                        _scalingAtt = user.CharStats.Spirit;
                        break;
                case CharacterAttribute.AttributeName.Strength:
                        _scalingAtt = user.CharStats.Strength;
                        break;
                case CharacterAttribute.AttributeName.Dexterity:
                        _scalingAtt = user.CharStats.Dexterity;
                        break;
                case CharacterAttribute.AttributeName.Mind:
                        _scalingAtt = user.CharStats.Mind;
                        break;
                default:
                        _scalingAtt = null;
                        break;
                }

                if (_scalingAtt == null)
                        Debug.Log ("no scaling attribute set!");
    }
示例#24
0
		private void onSavedGameLoaded()
		{
			_player = _game.State.Player;
			_room = Rooms.Find(_game.State, _room);
			_bottle = _room.Find<IObject>(_bottleId);
			subscribeEvents();
		}
示例#25
0
		public void AddText(ICharacter character, params string[] sentences)
		{
			foreach (string sentence in sentences)
			{
				Actions.Add(new AGSDialogAction (character, sentence));
			}
		}
        public static bool CanCharacterIdentifyDestination(IMap map, ICharacter viewer, int targetX, int targetY)
        {
            //checks to see if it's one tile beyond sight
            int viewerX = viewer.X;
            int viewerY = viewer.Y;

            //adjust for screen endings
            if (viewerX < 10) viewerX = 10;
            if (viewerX > map.MaxX - 9) viewerX = map.MaxX - 9;
            if (viewerY < 7) viewerY = 7;
            if (viewerY > map.MaxY - 7) viewerY = map.MaxY - 7;

            //check to see if the target would be in the viewer's screen
            if (targetX > viewerX + 10) return false;
            if (targetX < viewerX - 11) return false;
            if (targetY > viewerY + 8) return false;
            if (targetY < viewerY - 8) return false;

            int darkness;
            if (viewer.Darkness > -2) {
                darkness = viewer.Darkness;
            } else {
                darkness = map.Darkness;
            }

            if (darkness > -1) {
                int distance = (int)System.Math.Ceiling(2 * System.Math.Sqrt(System.Math.Pow(viewer.X - targetX, 2) + System.Math.Pow(viewer.Y - targetY, 2)));
                if (distance > darkness - 1) return false;
            }

            return true;
        }
        public void OnKeyboardDown(MagecrawlKey key, Map map, GameWindow window, IGameEngine engine)
        {
            switch (key)
            {
                case MagecrawlKey.Enter:
                {
                    ICharacter possiblyTargettedMonster = engine.Map.Monsters.Where(x => x.Position == map.TargetPoint).FirstOrDefault();

                    // Rememeber last targetted monster so we can target them again by default next turn.
                    if (m_targettingType == TargettingType.Monster && possiblyTargettedMonster != null)
                        m_lastTargetted = possiblyTargettedMonster;

                    if (m_action != null)
                    {
                        m_action(window, engine, map.TargetPoint);
                        m_action = null;
                    }

                    Escape(map, window);
                    break;
                }
                case MagecrawlKey.Escape:
                {
                    Escape(map, window);
                    break;
                }
                case MagecrawlKey.v:
                {
                    Escape(map, window);
                    break;
                }
                case MagecrawlKey.Left:
                    HandleDirection(Direction.West, map, window, engine);
                    break;
                case MagecrawlKey.Right:
                    HandleDirection(Direction.East, map, window, engine);
                    break;
                case MagecrawlKey.Down:
                    HandleDirection(Direction.South, map, window, engine);
                    break;
                case MagecrawlKey.Up:
                    HandleDirection(Direction.North, map, window, engine);
                    break;
                case MagecrawlKey.Insert:
                    HandleDirection(Direction.Northwest, map, window, engine);
                    break;
                case MagecrawlKey.Delete:
                    HandleDirection(Direction.Southwest, map, window, engine);
                    break;
                case MagecrawlKey.PageUp:
                    HandleDirection(Direction.Northeast, map, window, engine);
                    break;
                case MagecrawlKey.PageDown:
                    HandleDirection(Direction.Southeast, map, window, engine);
                    break;
                default:
                    break;
            }
        }
示例#28
0
        protected override void ClassModifyOnCreation(ICharacter subject)
        {
            subject.IncreaseAbility(AbilityType.Strength, 2);
            subject.DecreaseAbility(AbilityType.Intelligence, 2);
            subject.DecreaseAbility(AbilityType.Charisma, 2);

            subject.Features.Add(Feature.DarkVision);
        }
示例#29
0
 public Skill(string name, int damage, int manaCost, ICharacter master)
 {
     this.Name = name;
     this.Damage = damage;
     this.ManaCost = manaCost;
     this.Coordinates = new Point();
     this.Master = master;
 }
示例#30
0
        public ArrayList _path; // moving path

        #endregion Fields

        #region Constructors

        public SubAction()
        {
            _character = null;
            _animationSeqs = new ArrayList();
            _currentAnimationSeq = null;
            _path = null;
            _isEnd = false;
        }
示例#31
0
        public static void ServerSpawnMinions(
            ICharacter characterBoss,
            Vector2D characterBossCenterPosition,
            IProtoCharacterMob protoMinion,
            List <ICharacter> minionsList,
            double spawnCheckDistanceSqr,
            ServerBossDamageTracker bossDamageTracker,
            double minionsPerPlayer,
            int minionsTotalMin,
            int minionsTotalMax,
            int?minionsSpawnPerIterationLimit,
            double baseMinionsNumber,
            double spawnNoObstaclesCircleRadius,
            double spawnDistanceMin,
            double spawnDistanceMax)
        {
            // calculate how many minions required
            var minionsRequired = baseMinionsNumber;

            using var tempListCharacters = Api.Shared.GetTempList <ICharacter>();
            Api.Server.World.GetScopedByPlayers(characterBoss, tempListCharacters);

            foreach (var playerCharacter in tempListCharacters.AsList())
            {
                if (playerCharacter.ProtoGameObject is PlayerCharacterSpectator)
                {
                    continue;
                }

                if (playerCharacter.Position.DistanceSquaredTo(characterBossCenterPosition)
                    <= spawnCheckDistanceSqr)
                {
                    minionsRequired += minionsPerPlayer;
                }
            }

            minionsRequired = MathHelper.Clamp(minionsRequired,
                                               minionsTotalMin,
                                               minionsTotalMax);

            if (minionsSpawnPerIterationLimit.HasValue)
            {
                minionsRequired = Math.Min(minionsRequired, minionsSpawnPerIterationLimit.Value);
            }

            ServerProcessMinions(characterBoss,
                                 protoMinion,
                                 minionsList,
                                 out var spawnedMinionsCount,
                                 despawnDistanceSqr: spawnCheckDistanceSqr);

            //Logger.Dev($"Minions required: {minionsRequired} minions have: {minionsHave}");
            minionsRequired -= spawnedMinionsCount;
            if (minionsRequired <= 0)
            {
                return;
            }

            // spawn minions
            var attemptsRemains = 300;
            var physicsSpace    = characterBoss.PhysicsBody.PhysicsSpace;

            while (minionsRequired > 0)
            {
                attemptsRemains--;
                if (attemptsRemains <= 0)
                {
                    // attempts exceeded
                    return;
                }

                var spawnDistance = spawnDistanceMin
                                    + RandomHelper.NextDouble() * (spawnDistanceMax - spawnDistanceMin);
                var angle         = RandomHelper.NextDouble() * MathConstants.DoublePI;
                var spawnPosition = new Vector2D(
                    characterBossCenterPosition.X + spawnDistance * Math.Cos(angle),
                    characterBossCenterPosition.Y + spawnDistance * Math.Sin(angle));
                if (ServerTrySpawnMinion(spawnPosition) is { } spawnedMinion)
                {
                    // spawned successfully!
                    minionsRequired--;
                    minionsList.Add(spawnedMinion);
                }
            }

            ICharacter ServerTrySpawnMinion(Vector2D spawnPosition)
            {
                if (physicsSpace.TestCircle(spawnPosition,
                                            spawnNoObstaclesCircleRadius,
                                            CollisionGroups.Default,
                                            sendDebugEvent: true).EnumerateAndDispose().Any())
                {
                    // obstacles nearby
                    return(null);
                }

                var spawnedCharacter = Api.Server.Characters.SpawnCharacter(protoMinion, spawnPosition);

                if (spawnedCharacter is null)
                {
                    return(null);
                }

                // write this boss' damage tracker into the minion character
                // so any damage dealt to it will be counted in the winners ranking
                var privateState = spawnedCharacter.GetPrivateState <ICharacterPrivateStateWithBossDamageTracker>();

                privateState.DamageTracker = bossDamageTracker;

                // start spawn animation
                if (spawnedCharacter.ProtoGameObject is IProtoCharacterMob protoCharacterMob)
                {
                    protoCharacterMob.ServerSetSpawnState(spawnedCharacter,
                                                          MobSpawnState.Spawning);
                }

                return(spawnedCharacter);
            }
        }
示例#32
0
 public void SecondSkill(ICharacter c)
 {
     Console.WriteLine($"Second skill from Malphite and this skill name is {secondSkillName}");
     c.HealthPoint = c.HealthPoint + c.DefensePoint - (int)(c.HealthPoint * 0.3);
 }
示例#33
0
 public static PlayerCharacterQuests SharedGetQuests(this ICharacter character)
 {
     return(PlayerCharacter.GetPrivateState(character)
            .Quests);
 }
示例#34
0
 public static IEnumerable <ILogicObject> ServerEnumerateCurrentStatusEffects(this ICharacter character)
 {
     return(InternalServerGetStatusEffects(character));
 }
示例#35
0
 private static NetworkSyncList <ILogicObject> InternalServerGetStatusEffects(ICharacter character)
 {
     Api.ValidateIsServer();
     return(InternalSharedGetStatusEffects(character));
 }
示例#36
0
        public static void ClientOnWeaponHitOrTrace(
            ICharacter firingCharacter,
            IProtoItemWeapon protoWeapon,
            IProtoItemAmmo protoAmmo,
            IProtoCharacter protoCharacter,
            Vector2Ushort fallbackCharacterPosition,
            IReadOnlyList <WeaponHitData> hitObjects,
            Vector2D endPosition,
            bool endsWithHit)
        {
            if (firingCharacter is not null &&
                !firingCharacter.IsInitialized)
            {
                firingCharacter = null;
            }

            var weaponTracePreset = protoWeapon.FireTracePreset
                                    ?? protoAmmo?.FireTracePreset;
            var worldPositionSource = SharedCalculateWeaponShotWorldPositon(
                firingCharacter,
                protoWeapon,
                protoCharacter,
                fallbackCharacterPosition.ToVector2D(),
                hasTrace: weaponTracePreset?.HasTrace ?? false);

            protoWeapon.ClientOnWeaponHitOrTrace(firingCharacter,
                                                 worldPositionSource,
                                                 protoWeapon,
                                                 protoAmmo,
                                                 protoCharacter,
                                                 fallbackCharacterPosition,
                                                 hitObjects,
                                                 endPosition,
                                                 endsWithHit);

            if (weaponTracePreset?.HasTrace ?? false)
            {
                ComponentWeaponTrace.Create(weaponTracePreset,
                                            worldPositionSource,
                                            endPosition,
                                            hasHit: endsWithHit,
                                            lastHitData: hitObjects.LastOrDefault(t => t.WorldObject is not null));
            }

            foreach (var hitData in hitObjects)
            {
                var hitWorldObject = hitData.WorldObject;
                if (hitWorldObject is not null &&
                    !hitWorldObject.IsInitialized)
                {
                    hitWorldObject = null;
                }

                var protoWorldObject = hitData.FallbackProtoWorldObject;

                double delay;
                {
                    var worldObjectPosition = CalculateWorldObjectPosition(hitWorldObject, hitData);
                    delay = weaponTracePreset?.HasTrace ?? false
                                ? SharedCalculateTimeToHit(weaponTracePreset,
                                                           worldPositionSource : worldPositionSource,
                                                           endPosition : worldObjectPosition
                                                           + hitData.HitPoint.ToVector2D())
                                : 0;
                }

                ClientTimersSystem.AddAction(
                    delay,
                    () =>
                {
                    // re-calculate the world object position
                    var worldObjectPosition = CalculateWorldObjectPosition(hitWorldObject, hitData);

                    var fireScatterPreset = protoAmmo?.OverrideFireScatterPreset
                                            ?? protoWeapon.FireScatterPreset;
                    var projectilesCount = fireScatterPreset.ProjectileAngleOffets.Length;

                    var objectMaterial = hitData.FallbackObjectMaterial;
                    if (hitWorldObject is ICharacter hitCharacter &&
                        hitCharacter.IsInitialized)
                    {
                        objectMaterial = ((IProtoCharacterCore)hitCharacter.ProtoCharacter)
                                         .SharedGetObjectMaterialForCharacter(hitCharacter);
                    }

                    protoWeapon.ClientPlayWeaponHitSound(hitWorldObject,
                                                         protoWorldObject,
                                                         fireScatterPreset,
                                                         objectMaterial,
                                                         worldObjectPosition);

                    if (weaponTracePreset is null)
                    {
                        return;
                    }

                    var randomRotation = !weaponTracePreset.HasTrace;
                    double?angleRad    = null;
                    if (!randomRotation)
                    {
                        var deltaPos = endPosition - worldPositionSource;
                        ComponentWeaponTrace.CalculateAngleAndDirection(deltaPos,
                                                                        out var angleRadLocal,
                                                                        out _);
                        angleRad = angleRadLocal;
                    }

                    ClientAddHitSparks(weaponTracePreset.HitSparksPreset,
                                       hitData,
                                       hitWorldObject,
                                       protoWorldObject,
                                       worldObjectPosition,
                                       projectilesCount,
                                       objectMaterial,
                                       randomizeHitPointOffset: !weaponTracePreset.HasTrace,
                                       randomRotation: randomRotation,
                                       rotationAngleRad: angleRad,
                                       drawOrder: weaponTracePreset.DrawHitSparksAsLight
                                                          ? DrawOrder.Light
                                                          : DrawOrder.Default);
                });
示例#37
0
 public static PlayCardTask Any(Controller controller, string cardName, ICharacter target = null,
                                int zonePosition = -1, int chooseOne = 0, bool skipPrePhase = false)
 {
     return(new PlayCardTask(controller, controller.HandZone.First(p => p.Card.Name == cardName), target, zonePosition, chooseOne, skipPrePhase));
 }
示例#38
0
        private static double ServerTryConsumeFuelItems(
            ItemFuelRefillActionState state,
            ICharacter character,
            double fuelAmount,
            double fuelCapacity)
        {
            var maxItemsToConsumePerRefill = MaxItemsToConsumePerRefill;
            var consumedItems = new Dictionary <IProtoItem, int>();

            foreach (var itemToConsume in state.ItemsToConsumeForRefill)
            {
                // check if character owns this item
                if (!character.ProtoCharacter
                    .SharedEnumerateAllContainers(character, includeEquipmentContainer: false)
                    .Any(c => c.Items.Contains(itemToConsume)))
                {
                    throw new Exception("The character doesn't own " + itemToConsume + " - cannot use it to reload");
                }

                int itemToConsumeCountToSubstract;

                var itemToConsumeCount = itemToConsume.Count;
                if (itemToConsumeCount == 0)
                {
                    continue;
                }

                if (itemToConsumeCount > maxItemsToConsumePerRefill)
                {
                    itemToConsumeCount = (ushort)maxItemsToConsumePerRefill;
                }

                var fuelAmountPerItem = ((IProtoItemFuel)itemToConsume.ProtoItem).FuelAmount;
                if (fuelAmount + itemToConsumeCount * fuelAmountPerItem
                    >= fuelCapacity)
                {
                    // there are more than enough item count in that item stack to fully refill
                    itemToConsumeCountToSubstract = (int)Math.Ceiling((fuelCapacity - fuelAmount)
                                                                      / fuelAmountPerItem);
                    fuelAmount = fuelCapacity;
                }
                else
                {
                    // consume full item stack
                    itemToConsumeCountToSubstract = itemToConsumeCount;
                    fuelAmount += itemToConsumeCount * fuelAmountPerItem;
                }

                if (itemToConsumeCountToSubstract > 0)
                {
                    maxItemsToConsumePerRefill -= itemToConsumeCountToSubstract;

                    // reduce item count
                    var itemToConsumeNewCount = itemToConsume.Count - itemToConsumeCountToSubstract;
                    Server.Items.SetCount(
                        itemToConsume,
                        itemToConsumeNewCount,
                        byCharacter: character);

                    // ReSharper disable once PossibleNullReferenceException
                    consumedItems.Add(itemToConsume.ProtoItem, -itemToConsumeCountToSubstract);
                }

                if (fuelAmount >= fuelCapacity)
                {
                    // fully refilled
                    break;
                }

                if (maxItemsToConsumePerRefill <= 0)
                {
                    // amount of bottles to consume exceeded
                    break;
                }
            }

            NotificationSystem.ServerSendItemsNotification(character, consumedItems);
            return(fuelAmount);
        }
示例#39
0
        public ItemFuelRefillRequest ClientTryCreateRequest(ICharacter character, IItem item)
        {
            if (item?.ProtoGameObject is not IProtoItemWithFuel protoItemFuelRefillable)
            {
                // no item selected
                return(null);
            }

            if (protoItemFuelRefillable.ItemFuelConfig.FuelProtoItemsList.Count == 0)
            {
                if (IsServer)
                {
                    Logger.Warning("Cannot refill - not refillable: " + item, character);
                }
                else // if (IsClient)
                {
                    NotificationSystem.ClientShowNotification(
                        NotificationNotRefillable,
                        color: NotificationColor.Bad,
                        icon: protoItemFuelRefillable.Icon);
                }

                return(null);
            }

            if (!SharedIsRefuelNeeded(item))
            {
                if (IsClient)
                {
                    NotificationSystem.ClientShowNotification(
                        NotificationNoNeedToRefill,
                        color: NotificationColor.Neutral,
                        icon: protoItemFuelRefillable.Icon);
                }

                return(null);
            }

            if (!protoItemFuelRefillable.ClientCanStartRefill(item))
            {
                return(null);
            }

            var fuelItemsToConsume = ClientSelectItemsToConsume(protoItemFuelRefillable,
                                                                amountNeeded: SharedGetFuelAmountNeeded(item),
                                                                MaxItemsToConsumePerRefill);

            if (fuelItemsToConsume.Count > 0)
            {
                return(new ItemFuelRefillRequest(character, item, fuelItemsToConsume));
            }

            NotificationSystem.ClientShowNotification(
                NotificationNeedFuel_Title,
                message: string.Format(NotificationNeedFuel_MessageFormat,
                                       protoItemFuelRefillable.ItemFuelConfig.FuelProtoItemsList.Select(i => i.Name)
                                       .GetJoinedString(", ")),
                color: NotificationColor.Bad,
                icon: protoItemFuelRefillable.Icon);
            return(null);
        }
示例#40
0
 protected override void ServerOnSpecialEffect(ICharacter damagedCharacter, double damage)
 {
     ServerWeaponSpecialEffectsHelper.OnFirearmHit(damagedCharacter, damage);
 }
示例#41
0
        private void ServerGatheringSystemGatherHandler(ICharacter character, IStaticWorldObject worldObject)
        {
            if (worldObject.ProtoStaticWorldObject is not ObjectCorpse)
            {
                return;
            }

            // corpse looted
            // find the device and vial
            var itemDevice = character.SharedGetPlayerContainerEquipment()
                             .GetItemsOfProto(this)
                             .FirstOrDefault();

            if (itemDevice is null)
            {
                // don't have an equipped device
                return;
            }

            var protoItemVialEmpty = GetProtoEntity <ItemVialEmpty>();

            // require at least one vial
            if (!character.ContainsItemsOfType(protoItemVialEmpty, requiredCount: 1))
            {
                // don't have an empty vial
                this.CallClient(character, _ => _.ClientRemote_NotEnoughEmptyVials());
                return;
            }

            var protoMob = worldObject.GetPublicState <ObjectCorpse.PublicState>()
                           .ProtoCharacterMob;
            var healthMax     = protoMob.StatDefaultHealthMax;
            var maxVialsToUse = (ushort)MathHelper.Clamp(
                Math.Floor(protoMob.BiomaterialValueMultiplier * healthMax / 100.0),
                min: 1,
                max: 10);

            // destroy empty vial
            Server.Items.DestroyItemsOfType(
                character,
                protoItemVialEmpty,
                maxVialsToUse,
                out var destroyedEmptyVialsCount);

            if (destroyedEmptyVialsCount == 0)
            {
                // cannot destroy any empty vial (should be impossible)
                return;
            }

            // spawn biomaterial vials
            var protoItemVialBiomaterial = Api.GetProtoEntity <ItemVialBiomaterial>();
            var createItemResult         = Server.Items.CreateItem(protoItemVialBiomaterial,
                                                                   character,
                                                                   count: destroyedEmptyVialsCount);

            if (!createItemResult.IsEverythingCreated)
            {
                createItemResult.Rollback();
                var groundItemsContainer =
                    ObjectGroundItemsContainer.ServerTryGetOrCreateGroundContainerAtTileOrNeighbors(character,
                                                                                                    character.Tile);
                if (groundItemsContainer is null)
                {
                    Logger.Error("Not enough space around the player to drop a full vial");
                    // restore items
                    Server.Items.CreateItem(protoItemVialEmpty,
                                            character,
                                            destroyedEmptyVialsCount);
                    return;
                }

                createItemResult = Server.Items.CreateItem(protoItemVialBiomaterial,
                                                           groundItemsContainer,
                                                           count: destroyedEmptyVialsCount);
                if (!createItemResult.IsEverythingCreated)
                {
                    createItemResult.Rollback();
                    Logger.Error("Not enough space around the player to drop a full vial");
                    // restore items
                    Server.Items.CreateItem(protoItemVialEmpty,
                                            character,
                                            destroyedEmptyVialsCount);
                    return;
                }

                NotificationSystem.ServerSendNotificationNoSpaceInInventoryItemsDroppedToGround(character,
                                                                                                protoItemVialBiomaterial);
            }

            var itemChangedCount = NotificationSystem.SharedGetItemsChangedCount(createItemResult);

            itemChangedCount.Add(protoItemVialEmpty, -(int)destroyedEmptyVialsCount);
            NotificationSystem.ServerSendItemsNotification(character, itemChangedCount);

            ItemDurabilitySystem.ServerModifyDurability(itemDevice, -DurabilityDecreasePerUse);
            Logger.Info("Biomaterial collected successfully with Biomaterial collector", character);
        }
示例#42
0
 public string Execute(TechGroup group, [CurrentCharacterIfNull] ICharacter player = null)
 {
     player.SharedGetTechnologies().ServerRemoveGroup(group);
     return($"{player} tech group {group.NameWithTierName} removed.");
 }
示例#43
0
 public void BasicAttack(ICharacter c)
 {
     Console.WriteLine("Basic attack from Malphite.");
     c.HealthPoint = c.HealthPoint + c.DefensePoint - AttackPoint;
 }
示例#44
0
 public static PlayCardTask SpellTarget(Controller controller, string cardName, ICharacter target, int chooseOne = 0,
                                        bool skipPrePhase = false)
 {
     return(new PlayCardTask(controller, controller.HandZone.First(p => p.Card.Name == cardName), target, -1, chooseOne, skipPrePhase));
 }
示例#45
0
 public static PlayCardTask SpellTarget(Controller controller, IPlayable source, ICharacter target, int chooseOne = 0,
                                        bool skipPrePhase = false)
 {
     return(new PlayCardTask(controller, source, target, -1, chooseOne, skipPrePhase));
 }
示例#46
0
        protected override void SharedOnActionCompletedInternal(ItemFuelRefillActionState state, ICharacter character)
        {
            if (IsClient)
            {
                return;
            }

            var item = state.Item;
            var protoItemFuelRefillable = (IProtoItemWithFuel)item.ProtoItem;
            var capacity = protoItemFuelRefillable.ItemFuelConfig.FuelCapacity;

            var currentFuelAmount = protoItemFuelRefillable.ItemFuelConfig
                                    .SharedGetFuelAmount(item);

            currentFuelAmount = ServerTryConsumeFuelItems(state,
                                                          character,
                                                          currentFuelAmount,
                                                          capacity);
            if (currentFuelAmount > capacity)
            {
                throw new Exception("Impossible - amount exceeded");
            }

            protoItemFuelRefillable.ItemFuelConfig
            .SharedOnRefilled(item,
                              currentFuelAmount,
                              serverNotifyClients: true);
        }
示例#47
0
 public static PlayCardTask Any(Controller controller, IPlayable source, ICharacter target = null,
                                int zonePosition = -1, int chooseOne = 0, bool skipPrePhase = false)
 {
     return(new PlayCardTask(controller, source, target, zonePosition, chooseOne, skipPrePhase));
 }
示例#48
0
        protected override ItemFuelRefillRequest ClientTryCreateRequest(ICharacter character)
        {
            var item = character.SharedGetPlayerSelectedHotbarItem();

            return(this.ClientTryCreateRequest(character, item));
        }
示例#49
0
 private static NetworkSyncList <ILogicObject> InternalSharedGetStatusEffects(ICharacter character)
 {
     return(character.GetPrivateState <BaseCharacterPrivateState>()
            .StatusEffects);
 }
示例#50
0
 public static bool HeroPower(Controller c, ICharacter target = null)
 {
     return(HeroPowerBlock.Invoke(c, target));
 }
示例#51
0
        public static void ServerAddStatusEffect(
            this ICharacter character,
            IProtoStatusEffect protoStatusEffect,
            double intensity = 1.0)
        {
            if (protoStatusEffect == null)
            {
                throw new ArgumentNullException(nameof(protoStatusEffect));
            }

            if (intensity <= 0)
            {
                throw new ArgumentException(
                          $"Intensity to add must be > 0. Provided value: {intensity:F2}",
                          nameof(intensity));
            }

            if (character.ProtoCharacter is PlayerCharacterSpectator ||
                ServerCharacters.IsSpectator(character))
            {
                // don't add status effects to the spectator characters
                return;
            }

            if (intensity > 1)
            {
                // clamp intensity to add
                intensity = 1;
            }

            ILogicObject statusEffect = null;

            var statusEffects = InternalServerGetStatusEffects(character);

            foreach (var existingStatusEffect in statusEffects)
            {
                if (existingStatusEffect.ProtoGameObject == protoStatusEffect)
                {
                    statusEffect = existingStatusEffect;
                    break;
                }
            }

            if (statusEffect == null)
            {
                // no such status effect instance exists - create and add it
                statusEffect = ServerWorld.CreateLogicObject(protoStatusEffect);
                protoStatusEffect.ServerSetup(statusEffect, character);
                statusEffects.Add(statusEffect);
                Logger.Info($"Status effect added: {statusEffect} to {character}");
            }

            protoStatusEffect.ServerAddIntensity(statusEffect, intensity);

            var publicState = statusEffect.GetPublicState <StatusEffectPublicState>();

            var damageContext = CharacterDamageContext.Current;
            var byCharacter   = damageContext.AttackerCharacter;

            if (!ReferenceEquals(byCharacter, null))
            {
                publicState.ServerStatusEffectWasAddedByCharacter            = byCharacter;
                publicState.ServerStatusEffectWasAddedByCharacterWeaponSkill = damageContext.ProtoWeaponSkill;
            }
        }
示例#52
0
 public IEnemyState(EnemyFSMSystem fsm, ICharacter character)
 {
     mFSM            = fsm;
     mCharacter      = character;
     mTargetPosition = GameFacade.Instance.GetEnemyTargetPosition();
 }
示例#53
0
        public override void SpellEffect(ICharacter caster, ICharacter target)
        {
            var damage = (3.375 * cMD * (cWND / 100) - .15 * tMR) * (100 / tWND);

            DealDamage(damage);
        }
示例#54
0
 public double GetGatheringSpeedMultiplier(IStaticWorldObject worldObject, ICharacter character)
 {
     return(character.SharedGetFinalStatMultiplier(StatName.HuntingLootingSpeed));
 }
示例#55
0
 public FireMonsterBuilder(ICharacter character, int characterID, CharacterRefreshPO characterRefreshPO) : base(character, characterID, characterRefreshPO)
 {
 }
示例#56
0
 public void FirstSkill(ICharacter c)
 {
     Console.WriteLine($"First skill from Malphite and this skill name is {firstSkillName}");
     c.HealthPoint = c.HealthPoint + c.DefensePoint - 20;
 }
示例#57
0
        protected override void SharedOnActionCompletedInternal(GatheringActionState state, ICharacter character)
        {
            var worldObject     = (IStaticWorldObject)state.TargetWorldObject;
            var protoGatherable = (IProtoObjectGatherable)worldObject.ProtoWorldObject;

            Logger.Info($"Gathering completed: {worldObject} by {character}", character);
            if (IsClient)
            {
                return;
            }

            // Server-side only
            if (protoGatherable.ServerGather(worldObject, character))
            {
                Api.SafeInvoke(() => ServerOnGather?.Invoke(character, worldObject));
            }
        }
 private void Awake()
 {
     _character = _characterGO.GetComponent <ICharacter>();
 }
示例#59
0
 public override void SpellEffect(ICharacter caster, ICharacter target)
 {
     BuffAllStats(target, .35);
 }
示例#60
0
        public override void SpellEffect(ICharacter caster, ICharacter target)
        {
            var damage = 1.25 * cAD - .625 * tDEF;

            DealDamage(damage);
        }