예제 #1
0
        public bool UseItem(GameCharacter character, UsableItem item, Tile targetTile)
        {
            bool usedItem = false;

            if (!CoreHelper.checkEffect(character.activeEffects, character.passiveEffects, StatType.Stun))
            {
                if (character.CheckAP(item.actionPoints))
                {
                    if (item.activeEffects != null)
                    {
                        foreach (var a in item.activeEffects)
                        {
                            character.AddActiveEffect(a, this);
                        }
                        usedItem = true;
                        character.SpendAP(item.actionPoints);
                        item.uses--;
                    }

                    else if (item.itemAbility != null)
                    {
                        bool usedAbility = AbilityHelper.UseAbility(ActiveCharacter, item.itemAbility, targetTile, this);
                        if (usedAbility)
                        {
                            usedItem = true;
                            character.SpendAP(item.actionPoints);
                            item.uses--;
                        }
                    }

                    if (item.uses <= 0)
                    {
                        //should this logic be here?
                        battleLog.AddEntry(string.Format("{0} has no more uses.", item.name));

                        ActiveCharacter.removeUsableItem(item);
                        //ActiveCharacter.inventory.Remove(item);
                    }
                }

                if (usedItem)
                {
                    battleLog.AddEntry(string.Format("{0} used item {1}", character.name, item.name));
                    return(true);
                }
                else
                {
                    battleLog.AddEntry(string.Format("{0} was unable to use item {1}", character.name, item.name));
                    return(false);
                }
            }
            else
            {
                battleLog.AddEntry(string.Format("{0} is stunned and unable to use {1}.", character.name, item.name));
            }

            return(false);
        }
예제 #2
0
        public Task Jump(MoveJumpRequest request)
        {
            VerifyIngame();

            return(Task.WhenAll(
                       Move(request),
                       ActiveCharacter.Jump()
                       ));
        }
예제 #3
0
 public void StartMainTurn()
 {
     Log("Start main turn for " + ActiveCharacter.ToString());
     IsMainTurn = true;
     foreach (CharacterEnum target in UserDict.Keys.ToList())
     {
         UserDict[target].Write(new ResponseMessage(new MainTurnResponse()));
     }
 }
예제 #4
0
 public void OnInteract(SquadType interactorSquadType)
 {
     if (squadType != interactorSquadType)
     {
         return;
     }
     ActiveCharacter?.HideVisual();
     ActiveCharacter = this;
     UpdateVisual();
 }
예제 #5
0
        public void Init()
        {
            //Initialise the Unit stats.
            _HP = MaxHP;
            _EN = MaxEN;
            foreach (Character ActiveCharacter in ArrayCharacterActive)
            {
                ActiveCharacter.Init();
            }

            _UnitStat.Init();
            DoInit();
        }
예제 #6
0
        public Task SetTarget(ObjectID unitId)
        {
            VerifyIngame();

            if (unitId == ObjectID.Null)
            {
                return(ActiveCharacter.ClearTarget());
            }
            else
            {
                return(ActiveCharacter.SetTarget(unitId));
            }
        }
예제 #7
0
        public void NextTurnActiveDied()
        {
            TurnCounter++;
            NewTurn = true;
            if (currentCharacter >= characterList.Count)
            {
                currentCharacter = 0;
            }

            ActiveCharacter.ResetAP();
            ActiveCharacter.UpdateCooldownTimers();

            battleLog.AddEntry(string.Format("{0}'s turn", ActiveCharacter.name));
        }
예제 #8
0
        public void StartTurn()
        {
            Log("Start turn for " + ActiveCharacter.ToString());
            IsMainTurn = false;

            // Draw card
            int  damage    = 0;
            Card drawnCard = UserDict[ActiveCharacter].Player.Draw();

            if (drawnCard == null)                                         // Handle if deck is finished
            {
                if (UserDict[ActiveCharacter].Player.Deck.Count == 0)
                {
                    damage = 1;
                }
            }

            // Give mana
            UserDict[ActiveCharacter].Player.Mana += CurrentRound * AmaruConstants.MANA_TURN_FACTOR;

            // Add EP and execute onturnstart for each card on table
            OnTurnStartVisitor OTSVisitor = new OnTurnStartVisitor(ActiveCharacter, AmaruConstants.GAME_PREFIX + Id);
            List <Card>        Modified   = new List <Card>();

            foreach (CreatureCard card in UserDict[ActiveCharacter].Player.Inner)
            {
                card.Energy++;
                card.Visit(OTSVisitor, ActiveCharacter, null);
                Modified.Add(card);
            }
            foreach (CreatureCard card in UserDict[ActiveCharacter].Player.Outer)
            {
                card.Energy++;
                card.Visit(OTSVisitor, ActiveCharacter, null);
                Modified.Add(card);
            }

            // Disable immunity
            if (UserDict[ActiveCharacter].Player.IsImmune)
            {
                UserDict[ActiveCharacter].Player.IsImmune = false;
            }

            UserDict[ActiveCharacter].Write(new ResponseMessage(new NewTurnResponse(CurrentRound, ActiveCharacter, UserDict[ActiveCharacter].Player.Mana, drawnCard, Modified, damage)));
            foreach (CharacterEnum target in CharacterManager.Instance.Others(ActiveCharacter))
            {
                UserDict[target].Write(new ResponseMessage(new NewTurnResponse(CurrentRound, ActiveCharacter, UserDict[ActiveCharacter].Player.Mana, drawnCard != null, Modified, damage)));
            }
        }
        private void UnloadCharacter()
        {
            if (ActiveCharacter != null)
            {
                ActiveCharacter.Deactivate();
            }

            ActiveCharacter = null;
            if (this.OptionGroups != null)
            {
                foreach (IOptionGroupViewModel ogVM in this.OptionGroups)
                {
                    ogVM.RemoveDesktopKeyEventHandlers();
                }
            }
        }
예제 #10
0
    private void Update()
    {
        if (RpguiPauseGame.IsVisible())
        {
            Time.timeScale = 0;
            return;
        }

        if (IsAutoPlay != isAutoPlayDirty)
        {
            if (IsAutoPlay)
            {
                uiUseSkillManager.Hide();
                if (ActiveCharacter != null)
                {
                    ActiveCharacter.RandomAction();
                }
            }
            isAutoPlayDirty = IsAutoPlay;
        }

        Time.timeScale = !isEnding && IsSpeedMultiply ? 2 : 1;

        if (Input.GetMouseButtonDown(0) && ActiveCharacter != null && ActiveCharacter.IsPlayerCharacter)
        {
            //Ray ray = inputCamera.ScreenPointToRay(RPGInputManager.MousePosition());
            //Debug.DrawRay(ray.origin, ray.direction, Color.red);
            //RaycastHit hitInfo;
            //if (!Physics.Raycast(ray, out hitInfo))
            //    return;
            if (CurrentSelectedEntity == null)
            {
                return;
            }
            //var targetCharacter = hitInfo.collider.GetComponent<CharacterEntity>();
            var targetCharacter = CurrentSelectedEntity.GetComponent <CharacterEntity>();
            if (targetCharacter != null)
            {
                if (ActiveCharacter.DoAction(targetCharacter))
                {
                    playerFormation.SetCharactersSelectable(false);
                    foeFormation.SetCharactersSelectable(false);
                }
            }
        }
    }
예제 #11
0
 private void CreateCharacterRosterDependencies()
 {
     foreach (Character ActiveCharacter in TeamCharacters.ListAll)
     {
         foreach (KeyValuePair <string, Character.CharacterLinkTypes> CharacterLink in ActiveCharacter.DicCharacterLink)
         {
             foreach (Character ActiveLinkCharacter in TeamCharacters.ListAll)
             {
                 if (ActiveLinkCharacter.FullName == CharacterLink.Key)
                 {
                     ActiveCharacter.ShareStats(ActiveLinkCharacter, CharacterLink.Value);
                     break;
                 }
             }
         }
     }
 }
예제 #12
0
        public void OnDisconnect()
        {
            AccountManager.Instance.RemoveAccount(Id);

            if (ActiveCharacter == null)
            {
                return;
            }

            if (!ActiveCharacter.IsInternalDisconnect)
            {
                ActiveCharacter.Save();
            }

            ActiveCharacter.Friends.GetOffline();
            WorldManager.Instance.Despawn(ActiveCharacter);
        }
예제 #13
0
        public bool SetAccountActive(bool active, DateTime?statusUntil)
        {
            var acc = AccountMgr.GetAccount(Name);

            if (acc == null)
            {
                return(false);
            }
            acc.StatusUntil = statusUntil;
            acc.IsActive    = active;
            acc.SaveLater();
            IsActive    = active;
            StatusUntil = statusUntil;
            if (ActiveCharacter != null && !active)
            {
                ActiveCharacter.Kick("Banned");
            }
            return(true);
        }
예제 #14
0
    private void SetActiveCharacter()
    {
        switch (activeCharacter)
        {
        case ActiveCharacter.NONE:
            femaleCharacter.SetActive(false);
            maleCharacter.SetActive(false);
            m_demoCharacter = null;
            break;

        case ActiveCharacter.FEMALE:
            femaleCharacter.SetActive(true);
            maleCharacter.SetActive(false);
            m_demoCharacter = femaleCharacter;
            break;

        case ActiveCharacter.MALE:
            femaleCharacter.SetActive(false);
            maleCharacter.SetActive(true);
            m_demoCharacter = maleCharacter;
            break;

        default:
            break;
        }

        previousActiveCharacter = activeCharacter;

        if (m_demoCharacter)
        {
            if (m_demoCharacter.GetComponent <Animator>())
            {
                m_characterAnimator = m_demoCharacter.GetComponent <Animator>();
                SetWlakingAnimationTransition(enableCharacterWalking);
            }

            else
            {
                Debug.LogWarning("No demo character animator.");
            }
        }
    }
예제 #15
0
        public Task SendChatMessage(ChatMessageRequest request)
        {
            VerifyIngame();

            switch (request.MessageType)
            {
            case ChatMessageType.Say:
                return(ActiveCharacter.Say(request.Message, request.Language));

            case ChatMessageType.Yell:
                return(ActiveCharacter.Yell(request.Message, request.Language));

            case ChatMessageType.Whisper:
                return(SendWhisper(request));

            default:
                // not yet implemented or nonsense
                return(Task.CompletedTask);
            }
        }
예제 #16
0
        private async Task SendWhisper(ChatMessageRequest request)
        {
            var characterList = GrainFactory.GetGrain <ICharacterList>(ShardName);
            var characterId   = await characterList.GetCharacterByName(request.TargetName);

            if (characterId != null)
            {
                var character = GrainFactory.GetGrain <ICharacter>(characterId.Value);

                // technically a race condition, but probably okay
                if (await character.IsOnline())
                {
                    var myEntity = await ActiveCharacter.GetCharacterEntity();

                    await character.ReceiveWhisper(myEntity.Id, request.Message, request.Language);

                    var chatConfirm = new ChatMessageResponse()
                    {
                        // TODO: language support needed here
                        Language    = ChatLanguage.Universal,
                        Message     = request.Message,
                        MessageType = ChatMessageType.WhisperConfirm,
                        // sender and target are reversed for WhisperConfirm
                        SenderId = characterId.Value,
                        Tag      = ChatTag.None,
                        TargetId = myEntity.Id,
                    };

                    await Send(chatConfirm);
                }
                else
                {
                    // TODO: "character is not online" notification
                }
            }
            else
            {
                // TODO: "character does not exist" notification
            }
        }
예제 #17
0
        public Task Move(MovementInPacket request)
        {
            VerifyIngame();

            Jump jump = null;

            if (request.Falling != null)
            {
                jump = new Jump()
                {
                    Velocity    = request.Falling.Velocity,
                    SineAngle   = request.Falling.SinAngle,
                    CosineAngle = request.Falling.CosAngle,
                    XYSpeed     = request.Falling.XYSpeed,
                };
            }

            return(Task.WhenAll(
                       ActiveCharacter.SetPosition(request.Position, request.Orientation),
                       ActiveCharacter.SetMovementState(request.MovementFlags, request.Time, request.FallTime, jump)
                       ));
        }
예제 #18
0
        public async Task Login(ObjectID characterId)
        {
            VerifyAuthenticated();

            var character = GrainFactory.GetGrain <ICharacter>(characterId);

            if (await character.Exists())
            {
                var entity = await character.GetCharacterEntity();

                // sanity checks
                if (entity.Account != AuthenticatedIdentity)
                {
                    GetLogger().Warn($"received login request from account {AuthenticatedIdentity} for character {entity.Name}, owned by {entity.Account}");
                    return;
                }
                if (entity.Shard != ShardName)
                {
                    GetLogger().Warn($"received login request from account {AuthenticatedIdentity} for character {entity.Name} which exists in shard {entity.Shard}, but this shard is {ShardName}");
                    return;
                }

                GetLogger().Info($"account {AuthenticatedIdentity} logs in as character {entity.Name}");

                ActiveCharacter = character;
                await ActiveCharacter.Login(this.GetPrimaryKey());

                var sendTasks = new LinkedList <Task>();

                var loginVerifyWorld = new LoginVerifyWorldRequest()
                {
                    MapId       = entity.MapId,
                    Position    = entity.Position,
                    Orientation = entity.Orientation,
                };
                sendTasks.AddLast(Send(loginVerifyWorld));

                var accountDataTimes = new AccountDataTimesRequest();
                sendTasks.AddLast(Send(accountDataTimes));

                var loginSetRestStart = new LoginSetRestStartRequest();
                sendTasks.AddLast(Send(loginSetRestStart));

                var updateBindPoint = new UpdateBindPointRequest()
                {
                    // TODO: implement bind point
                    Position = entity.Position,
                    MapId    = entity.MapId,
                    ZoneId   = entity.ZoneId,
                };
                sendTasks.AddLast(Send(updateBindPoint));

                var loginInitializeTutorial = new LoginTutorialRequest();
                sendTasks.AddLast(Send(loginInitializeTutorial));

                var loginInitializeSpells = new LoginInitializeSpellsRequest();
                sendTasks.AddLast(Send(loginInitializeSpells));

                var loginInitializeActionButtons = new LoginInitializeActionButtonsRequest();
                sendTasks.AddLast(Send(loginInitializeActionButtons));

                var timeService          = GrainFactory.GetGrain <ITimeService>(0);
                var loginSetTimeAndSpeed = new LoginSetTimeAndSpeedRequest()
                {
                    // TODO: configurize this?
                    GameSpeed  = 0.01666667f,
                    ServerTime = await timeService.GetNow(),
                };
                sendTasks.AddLast(Send(loginSetTimeAndSpeed));

                var friendList = new FriendListResponse();
                sendTasks.AddLast(Send(friendList));

                var ignoreList = new IgnoreListResponse();
                sendTasks.AddLast(Send(ignoreList));

                var initializeWorldState = new InitializeWorldStateRequest()
                {
                    MapId  = entity.MapId,
                    ZoneId = entity.ZoneId,
                };
                sendTasks.AddLast(Send(initializeWorldState));

                await Task.WhenAll(sendTasks);
            }
            else
            {
                GetLogger().Warn($"received login request from account {AuthenticatedIdentity} for non-existing character id {characterId}");
            }
        }
예제 #19
0
    public void NewTurn()
    {
        if (ActiveCharacter != null)
        {
            ActiveCharacter.currentTimeCount = 0;
        }

        CharacterEntity            activatingCharacter = null;
        var                        maxTime             = int.MinValue;
        List <BaseCharacterEntity> characters          = new List <BaseCharacterEntity>();

        characters.AddRange(playerFormation.Characters.Values);
        characters.AddRange(foeFormation.Characters.Values);
        for (int i = 0; i < characters.Count; ++i)
        {
            CharacterEntity character = characters[i] as CharacterEntity;
            if (character != null)
            {
                if (character.Hp > 0)
                {
                    int spd = (int)character.GetTotalAttributes().spd;
                    if (spd <= 0)
                    {
                        spd = 1;
                    }
                    character.currentTimeCount += spd;
                    if (character.currentTimeCount > maxTime)
                    {
                        maxTime             = character.currentTimeCount;
                        activatingCharacter = character;
                    }
                }
                else
                {
                    character.currentTimeCount = 0;
                }
            }
        }
        ActiveCharacter = activatingCharacter;
        bool isStun = activatingCharacter.IsStun();

        ActiveCharacter.ApplySkillAndBuff(CustomSkill.TriggerType.beforeFight);
        ActiveCharacter.DecreaseBuffsTurn();
        ActiveCharacter.DecreaseSkillsTurn();
        ActiveCharacter.ResetStates();
        if (ActiveCharacter.Hp > 0 && !isStun)
        {
            if (ActiveCharacter.IsPlayerCharacter)
            {
                if (IsAutoPlay)
                {
                    ActiveCharacter.RandomAction();
                }
                else
                {
                    //RpguiCharacterActionManager.Show();
                    uiUseSkillManager.SetData(ActiveCharacter);
                }
            }
            else
            {
                ActiveCharacter.RandomAction();
            }
        }
        else
        {
            ActiveCharacter.NotifyEndAction();
        }
    }
예제 #20
0
 public void Setup()
 {
     myCollider = GetComponent<BoxCollider2D>();
     character = GetComponentInParent<ActiveCharacter>();
     animator = GetComponentInParent<ActiveAnimator>();
 }
예제 #21
0
        public Task Logout()
        {
            VerifyIngame();

            return(ActiveCharacter.Logout());
        }