예제 #1
0
파일: btl_cmd.cs 프로젝트: uzoko1/Memoria
 public static void EnqueueCommand(CMD_DATA cmd)
 {
     for (CMD_DATA cp = FF9StateSystem.Battle.FF9Battle.cmd_queue; cp != null; cp = cp.next)
     {
         if (cmd.info.priority != 0 && cp.next != null)
         {
             if (cmd.cmd_no > 59 || cmd.cmd_no == 54)
             {
                 if (cp.next.cmd_no < 60 && cp.next.cmd_no != 54)
                 {
                     InsertCommand(cmd, cp);
                     break;
                 }
             }
             else if (cmd.cmd_no == 59)
             {
                 if (cp.next.cmd_no < 59 && cp.next.cmd_no != 54)
                 {
                     InsertCommand(cmd, cp);
                     break;
                 }
             }
             else if (cp.next.info.priority == 0)
             {
                 InsertCommand(cmd, cp);
                 break;
             }
         }
         else if (cp.next == null)
         {
             InsertCommand(cmd, cp);
             break;
         }
     }
 }
예제 #2
0
    public static void StartBtlSeq(Int32 pBtlID, Int32 pTarID, Int32 pSeqNo)
    {
        if (btlseq.seq_work_set.SeqData[pSeqNo] == 0)
        {
            return;
        }
        BTL_DATA next;

        for (next = FF9StateSystem.Battle.FF9Battle.btl_list.next; next != null; next = next.next)
        {
            if (((Int32)next.btl_id & pBtlID) != 0)
            {
                break;
            }
        }
        if (next == null)
        {
            return;
        }
        CMD_DATA cmd_DATA = next.cmd[0];

        cmd_DATA.cmd_no = 0;
        cmd_DATA.sub_no = (Byte)pSeqNo;
        cmd_DATA.tar_id = (UInt16)pTarID;
        cmd_DATA.regist = next;
        cmd_DATA.aa     = FF9StateSystem.Battle.FF9Battle.enemy_attack[pSeqNo];
        cmd_DATA.info   = new CMD_DATA.SELECT_INFO();
        SEQ_WORK seq_WORK;

        if ((seq_WORK = btlseq.EntrySequence(cmd_DATA)) == null)
        {
            return;
        }
        seq_WORK.Flags.EventMode = true;
    }
예제 #3
0
    private static String FormatMagicSwordAbility(CMD_DATA pCmd)
    {
        // TODO: Move it to an external file
        String abilityName = FF9TextTool.ActionAbilityName(pCmd.sub_no);

        String result;

        if (TryFormatRussianMagicSwordAbility(abilityName, out result))
        {
            return(result);
        }

        String commandTitle = FF9TextTool.BattleCommandTitleText(0);

        switch (Localization.GetSymbol())
        {
        case "JP":
            return($"{abilityName}{commandTitle}");

        case "FR":
        case "IT":
        case "ES":
            return($"{commandTitle}{abilityName}");

        default:
            return($"{abilityName} {commandTitle}");
        }
    }
예제 #4
0
    public static SEQ_WORK EntrySequence(CMD_DATA pCmd)
    {
        SEQ_WORK[] seqWork = btlseq.seq_work_set.SeqWork;
        Int16      num;

        for (num = 0; num < 4; num = (Int16)(num + 1))
        {
            if (seqWork[(Int32)num].CmdPtr == null)
            {
                break;
            }
        }
        if (num < 0)
        {
            return((SEQ_WORK)null);
        }
        seqWork[(Int32)num].Flags     = new SeqFlag();
        seqWork[(Int32)num].CmdPtr    = pCmd;
        seqWork[(Int32)num].CurPtr    = btlseq.seq_work_set.SeqData[(Int32)pCmd.sub_no];
        seqWork[(Int32)num].OldPtr    = 0;
        seqWork[(Int32)num].IncCnt    = 0;
        seqWork[(Int32)num].DecCnt    = 0;
        seqWork[(Int32)num].AnmCnt    = 0;
        seqWork[(Int32)num].AnmIDOfs  = btlseq.seq_work_set.AnmOfsList[(Int32)pCmd.sub_no];
        seqWork[(Int32)num].SfxTime   = 0;
        seqWork[(Int32)num].TurnTime  = 0;
        seqWork[(Int32)num].SVfxTime  = 0;
        seqWork[(Int32)num].FadeTotal = 0;
        FF9StateSystem.Battle.FF9Battle.seq_work_set.CameraNo = 0;
        return(seqWork[(Int32)num]);
    }
예제 #5
0
파일: btl_cmd.cs 프로젝트: uzoko1/Memoria
    public static bool KillCommand2(BTL_DATA btl)
    {
        bool flag = false;

        btl.bi.cmd_idle = 0;
        CMD_DATA cmd1 = FF9StateSystem.Battle.FF9Battle.cmd_queue;

        while (cmd1 != null)
        {
            CMD_DATA cmd2 = cmd1.next;
            if (cmd2 != null && cmd2.regist == btl && cmd2.cmd_no < 54)
            {
                if (cmd2.cmd_no < 48)
                {
                    flag = true;
                }
                ResetItemCount(cmd2);
                DequeueCommand(cmd1, true);
            }
            else
            {
                cmd1 = cmd2;
            }
        }
        return(flag);
    }
예제 #6
0
 public static Boolean CheckCounterAbility(BTL_DATA btl, BTL_DATA target, CMD_DATA cmd)
 {
     if (!Status.checkCurStat(btl, 1107300611u) && cmd.cmd_no < 48)
     {
         if ((btl.sa[1] & 16u) != 0u && (cmd.aa.Category & 8) != 0)
         {
             Int32 num = (Int32)btl.elem.wpr;
             if ((btl.sa[1] & 128u) != 0u)
             {
                 num *= 2;
             }
             if (num > Comn.random16() % 100)
             {
                 btl_cmd.SetCounter(btl, 49u, 176, target.btl_id);
                 return(true);
             }
         }
         if ((btl.sa[1] & 4194304u) != 0u && (cmd.aa.Category & 128) != 0)
         {
             btl_cmd.SetCounter(btl, 50u, (Int32)cmd.sub_no, target.btl_id);
             return(true);
         }
     }
     return(false);
 }
예제 #7
0
파일: btl_cmd.cs 프로젝트: uzoko1/Memoria
 private static void ResetItemCount(CMD_DATA cmd)
 {
     if (cmd.cmd_no != 14 && cmd.cmd_no != 15 && cmd.cmd_no != 51)
     {
         return;
     }
     UIManager.Battle.ItemUnuse(cmd.sub_no);
 }
예제 #8
0
파일: btl_cmd.cs 프로젝트: uzoko1/Memoria
    // ReSharper restore PossibleNullReferenceException

    public static bool CheckMagicCondition(CMD_DATA cmd)
    {
        if (!Status.checkCurStat(cmd.regist, 8U) || (cmd.aa.Category & 2) == 0)
        {
            return(true);
        }
        UIManager.Battle.SetBattleFollowMessage(21);
        return(false);
    }
예제 #9
0
파일: btl_cmd.cs 프로젝트: uzoko1/Memoria
 public static void InsertCommand(CMD_DATA cmd, CMD_DATA cp)
 {
     if (cmd == cp)
     {
         return;
     }
     cmd.next      = cp.next;
     cp.next       = cmd;
     cmd.info.stat = 1;
 }
예제 #10
0
        public void TryEscape()
        {
            CMD_DATA curCmdPtr = btl_util.getCurCmdPtr();

            if (curCmdPtr != null && curCmdPtr.regist.bi.player == 0)
            {
                return;
            }

            SByte playerCount  = 0;
            SByte enemyCount   = 0;
            Int16 playerLevels = 0;
            Int16 enemyLevels  = 0;

            for (BTL_DATA next = FF9StateSystem.Battle.FF9Battle.btl_list.next; next != null; next = next.next)
            {
                BattleUnit unit = new BattleUnit(next);
                if (unit.IsPlayer)
                {
                    ++playerCount;
                    playerLevels += next.level;
                }
                else
                {
                    ++enemyCount;
                    enemyLevels += next.level;
                }
            }

            if (enemyCount == 0)
            {
                enemyCount = 1;
            }
            if (playerCount == 0)
            {
                playerCount = 1;
            }
            if (enemyLevels == 0)
            {
                enemyLevels = 1;
            }
            if (playerLevels == 0)
            {
                playerLevels = 1;
            }

            const UInt32 fleeIterationScript = 0056;

            Int16 rate = (Int16)(200 / (enemyLevels / enemyCount) * (playerLevels / playerCount) / 16);

            if (rate > Comn.random16() % 100)
            {
                btl_cmd.SetCommand(FF9StateSystem.Battle.FF9Battle.cmd_escape, fleeIterationScript, 1U, 15, 1U);
            }
        }
예제 #11
0
파일: btl_cmd.cs 프로젝트: uzoko1/Memoria
 public static void KillSpecificCommand(BTL_DATA btl, byte cmd_no)
 {
     for (CMD_DATA cmd = FF9StateSystem.Battle.FF9Battle.cmd_queue; cmd != null; cmd = cmd.next)
     {
         if (cmd.next != null && cmd.next.regist == btl && cmd.next.cmd_no == cmd_no)
         {
             DequeueCommand(cmd, true);
             break;
         }
     }
 }
예제 #12
0
파일: btl_cmd.cs 프로젝트: uzoko1/Memoria
    public static bool CheckSpecificCommand(BTL_DATA btl, byte cmd_no)
    {
        for (CMD_DATA cmdData = FF9StateSystem.Battle.FF9Battle.cmd_queue; cmdData != null; cmdData = cmdData.next)
        {
            if (cmdData.regist == btl && cmdData.cmd_no == cmd_no)
            {
                return(true);
            }
        }
        CMD_DATA curCmdPtr = btl_util.getCurCmdPtr();

        return(curCmdPtr != null && curCmdPtr.cmd_no == cmd_no);
    }
예제 #13
0
파일: btl_cmd.cs 프로젝트: uzoko1/Memoria
    public static bool CheckUsingCommand(CMD_DATA cmd)
    {
        for (CMD_DATA cmdData = FF9StateSystem.Battle.FF9Battle.cmd_queue; cmdData != null; cmdData = cmdData.next)
        {
            if (cmd == cmdData)
            {
                return(true);
            }
        }
        CMD_DATA curCmdPtr = btl_util.getCurCmdPtr();

        return(curCmdPtr != null && curCmdPtr == cmd);
    }
예제 #14
0
파일: btl_cmd.cs 프로젝트: uzoko1/Memoria
    private static void DequeueCommand(CMD_DATA cmd, bool escape_check)
    {
        CMD_DATA cmdData = cmd.next;

        cmd.next              = cmdData.next;
        cmdData.info.stat     = 0;
        cmdData.info.priority = 0;
        if (!escape_check || cmdData.cmd_no != 56)
        {
            return;
        }
        FF9StateSystem.Battle.FF9Battle.cmd_status &= 65534;
    }
예제 #15
0
    private static String FormatMagicSwordAbility(CMD_DATA pCmd)
    {
        // TODO: Move it to an external file
        String abilityName = FF9TextTool.ActionAbilityName(pCmd.sub_no);

        switch (abilityName)
        {
        case "Огонь":
            return("Огненный клинок");

        case "Огонь II":
            return("Огненный клинок II");

        case "Огонь III":
            return("Огненный клинок III");

        case "Буран":
            return("Ледяной клинок");

        case "Буран II":
            return("Ледяной клинок II");

        case "Буран III":
            return("Ледяной клинок III");

        case "Молния":
            return("Электрический клинок");

        case "Молния II":
            return("Электрический клинок II");

        case "Молния III":
            return("Электрический клинок III");

        case "Био":
            return("Ядовитый клинок");

        case "Вода":
            return("Водный клинок");

        case "Взрыв":
            return("Взрывной клинок");

        case "Судный день":
            return("Клинок Судного дня");
        }

        String str2 = Localization.GetSymbol() == "JP" ? String.Empty : " ";

        return(abilityName + str2 + FF9TextTool.BattleCommandTitleText(0));
    }
예제 #16
0
파일: btl_cmd.cs 프로젝트: uzoko1/Memoria
    private static bool CheckMpCondition(CMD_DATA cmd)
    {
        short mp = cmd.aa.MP;

        if (battle.GARNET_SUMMON_FLAG != 0 && (cmd.aa.Type & 4) != 0)
        {
            mp *= 4;
        }
        if (cmd.cmd_no == 50 || btl_calc.ConsumeMp(cmd.regist, mp))
        {
            return(true);
        }
        UIManager.Battle.SetBattleFollowMessage(22);
        return(false);
    }
예제 #17
0
 public static void RunSequence(CMD_DATA pCmd)
 {
     if (FF9StateSystem.Battle.FF9Battle.seq_work_set.SeqData[(Int32)pCmd.sub_no] == 0)
     {
         return;
     }
     if (btlseq.EntrySequence(pCmd) == null)
     {
         return;
     }
     if (pCmd.regist.bi.player == 0)
     {
         Vector3 eulerAngles = pCmd.regist.rot.eulerAngles;
         pCmd.regist.rot.eulerAngles = new Vector3(eulerAngles.x, 0f, eulerAngles.z);
     }
 }
예제 #18
0
    public static Int32 SeqExecCalc(SEQ_WORK pSeqWork, BTL_DATA pMe)
    {
        btlseq.BattleLog("SeqExecCalc");
        CMD_DATA cmdPtr = pSeqWork.CmdPtr;
        UInt16   tar_id = cmdPtr.tar_id;

        for (BTL_DATA next = FF9StateSystem.Battle.FF9Battle.btl_list.next; next != null; next = next.next)
        {
            if ((next.btl_id & tar_id) != 0)
            {
                btl_cmd.ExecVfxCommand(next);
            }
        }
        pSeqWork.CurPtr++;
        return(1);
    }
예제 #19
0
    public void SetBattleCommandTitle(CMD_DATA pCmd)
    {
        String str1 = String.Empty;

        switch (pCmd.cmd_no)
        {
        case 14:
        case 15:
            str1 = FF9TextTool.ItemName(pCmd.sub_no);
            break;

        case 50:
            str1 = pCmd.aa.Name;
            break;

        default:
            if (pCmd.sub_no < 192)
            {
                Int32 id = CmdTitleTable[pCmd.sub_no].MappedId;
                switch (id)
                {
                case 254:         // Magic sword
                    str1 = FormatMagicSwordAbility(pCmd);
                    break;

                case 255:
                    str1 = FF9TextTool.ActionAbilityName(pCmd.sub_no);
                    break;

                case 0:
                    break;

                default:
                    str1 = id >= 192 ? FF9TextTool.BattleCommandTitleText((id & 63) + 1) : FF9TextTool.ActionAbilityName(id);
                    break;
                }
            }
            break;
        }

        if (String.IsNullOrEmpty(str1) || (pCmd.cmd_no == 7 && pCmd.sub_no == 96))
        {
            return;
        }

        SetBattleTitle(str1, 1);
    }
예제 #20
0
파일: btl_cmd.cs 프로젝트: uzoko1/Memoria
    private static bool CheckTargetCondition(FF9StateBattleSystem btlsys, CMD_DATA cmd)
    {
        ushort num1 = 0;

        if (cmd.tar_id == 0)
        {
            return(false);
        }
        ushort num2;

        switch (cmd.cmd_no)
        {
        case 14:
        case 51:
            num2 = ff9item._FF9Item_Info[btl_util.btlItemNum(cmd.sub_no)].info.dead;
            break;

        case 59:
            return(true);

        default:
            num2 = cmd.aa.Info.dead;
            break;
        }
        for (BTL_DATA btl = btlsys.btl_list.next; btl != null; btl = btl.next)
        {
            if (btl.bi.target != 0 && (btl.btl_id & cmd.tar_id) != 0 && (num2 != 0 && btl.bi.player != 0 || !Status.checkCurStat(btl, 256U)))
            {
                num1 |= btl.btl_id;
            }
        }
        if (num1 != 0)
        {
            cmd.tar_id = num1;
            return(true);
        }
        if (cmd.info.cursor == 0 && num2 == 0)
        {
            cmd.tar_id = btl_util.GetRandomBtlID(cmd.tar_id & 15U);
            if (cmd.tar_id != 0)
            {
                return(true);
            }
        }
        return(false);
    }
예제 #21
0
파일: btl_cmd.cs 프로젝트: uzoko1/Memoria
 public static void ClearCommand(CMD_DATA cmd)
 {
     cmd.next              = null;
     cmd.aa                = null;
     cmd.tar_id            = 0;
     cmd.cmd_no            = 0;
     cmd.sub_no            = 0;
     cmd.info.cursor       = 0;
     cmd.info.stat         = 0;
     cmd.info.priority     = 0;
     cmd.info.cover        = 0;
     cmd.info.dodge        = 0;
     cmd.info.reflec       = 0;
     cmd.info.meteor_miss  = 0;
     cmd.info.short_summon = 0;
     cmd.info.mon_reflec   = 0;
 }
예제 #22
0
파일: btl_cmd.cs 프로젝트: uzoko1/Memoria
    public static void KillCommand(CMD_DATA cmd)
    {
        BTL_DATA btlData = cmd.regist;

        for (CMD_DATA cmd1 = FF9StateSystem.Battle.FF9Battle.cmd_queue; cmd1 != null; cmd1 = cmd1.next)
        {
            if (cmd1.next == cmd)
            {
                if (btlData != null && cmd != btlData.cmd[3] && cmd != btlData.cmd[4])
                {
                    btlData.bi.cmd_idle = 0;
                }
                DequeueCommand(cmd1, false);
                break;
            }
        }
    }
예제 #23
0
파일: btl_cmd.cs 프로젝트: uzoko1/Memoria
    public static void KillNormalCommand(FF9StateBattleSystem btlsys)
    {
        CMD_DATA cp = btlsys.cmd_queue;

        while (cp != null)
        {
            CMD_DATA ncp = cp.next;
            if (ncp != null && ncp.cmd_no != 54 && ncp.cmd_no < 58)
            {
                ManageDequeueCommand(cp, ncp);
            }
            else
            {
                cp = ncp;
            }
        }
    }
예제 #24
0
파일: btl_cmd.cs 프로젝트: uzoko1/Memoria
    public static ushort CheckReflec(CMD_DATA cmd)
    {
        ushort num1 = 0;

        if (cmd.cmd_no != 14 && cmd.cmd_no != 15 && (cmd.cmd_no != 51 && (cmd.aa.Category & 1) != 0) && ((int)cmd.regist.sa[0] & 1073741824) == 0)
        {
            uint     num2     = cmd.tar_id >= 16 ? 1U : 0U;
            ushort[] numArray = new ushort[4];
            short    num3;
            short    num4 = num3 = 0;
            for (BTL_DATA btl = FF9StateSystem.Battle.FF9Battle.btl_list.next; btl != null; btl = btl.next)
            {
                if ((btl.btl_id & cmd.tar_id) != 0)
                {
                    if (!Status.checkCurStat(btl, 1U) && btl_stat.CheckStatus(btl, 536870912U))
                    {
                        num1 |= btl.btl_id;
                        ++num4;
                    }
                }
                else if (!Status.checkCurStat(btl, 256U) && btl.bi.player == (int)num2 && btl.bi.target != 0)
                {
                    numArray[num3++] = btl.btl_id;
                }
            }
            if (num4 != 0 && num3 != 0)
            {
                for (int index = 0; index < 4; ++index)
                {
                    cmd.regist.reflec.tar_id[index] = index >= num4 ? (ushort)0 : numArray[Comn.random8() % num3];
                }
                if (num1 == cmd.tar_id)
                {
                    cmd.info.reflec = 1;
                    cmd.tar_id      = MargeReflecTargetID(cmd.regist.reflec);
                }
                else
                {
                    cmd.info.reflec = 2;
                    cmd.tar_id      = (ushort)(cmd.tar_id & (uint)~num1);
                }
            }
        }
        return(num1);
    }
예제 #25
0
파일: btl_cmd.cs 프로젝트: uzoko1/Memoria
    public static void KillCommand3(BTL_DATA btl)
    {
        CMD_DATA cmd1 = FF9StateSystem.Battle.FF9Battle.cmd_queue;

        while (cmd1 != null)
        {
            CMD_DATA cmd2 = cmd1.next;
            if (cmd2 != null && cmd2.regist == btl)
            {
                ResetItemCount(cmd2);
                DequeueCommand(cmd1, true);
            }
            else
            {
                cmd1 = cmd2;
            }
        }
    }
예제 #26
0
파일: btl_cmd.cs 프로젝트: uzoko1/Memoria
    public static bool CheckSpecificCommand2(byte cmd_no)
    {
        bool flag = false;

        for (CMD_DATA cmdData = FF9StateSystem.Battle.FF9Battle.cmd_queue; cmdData != null; cmdData = cmdData.next)
        {
            if (cmdData.cmd_no == cmd_no)
            {
                flag = true;
            }
        }
        CMD_DATA curCmdPtr = btl_util.getCurCmdPtr();

        if (curCmdPtr != null && curCmdPtr.cmd_no == cmd_no)
        {
            flag = true;
        }
        return(flag);
    }
예제 #27
0
파일: btl_cmd.cs 프로젝트: uzoko1/Memoria
    public static void KillAllCommand(FF9StateBattleSystem btlsys)
    {
        CMD_DATA cp = btlsys.cmd_queue;

        while (cp != null)
        {
            CMD_DATA ncp = cp.next;
            if (ncp != null && ncp.cmd_no < 59)
            {
                ManageDequeueCommand(cp, ncp);
            }
            else
            {
                cp = ncp;
            }
        }
        btlsys.cmd_status &= 65523;
        btlsys.phantom_no  = (byte)(btlsys.phantom_cnt = 0);
    }
예제 #28
0
파일: btl_cmd.cs 프로젝트: uzoko1/Memoria
    public static void ReqFinishCommand()
    {
        FF9StateBattleSystem stateBattleSystem = FF9StateSystem.Battle.FF9Battle;
        CMD_DATA             cmd = stateBattleSystem.cur_cmd;

        if (cmd.info.reflec == 2)
        {
            cmd.tar_id = MargeReflecTargetID(cmd.regist.reflec);
            btl_vfx.SetBattleVfx(cmd, (uint)cmd.aa.Info.vfx_no, null);
            stateBattleSystem.cmd_mode = 2;
        }
        else
        {
            if (Status.checkCurStat(cmd.regist, 8192U) && cmd.cmd_no == 60 && !btl_mot.checkMotion(cmd.regist, 4))
            {
                return;
            }
            stateBattleSystem.cmd_mode = 4;
        }
    }
예제 #29
0
    private void SendAutoAttackCommand(Int32 playerIndex)
    {
        BattleUnit player = FF9StateSystem.Battle.FF9Battle.GetUnit(playerIndex);
        CMD_DATA   cmd    = player.Data.cmd[0];

        if (cmd != null && btl_cmd.CheckUsingCommand(cmd))
        {
            return;
        }
        CurrentPlayerIndex   = playerIndex;
        _currentCommandIndex = CommandMenu.Attack;

        BattleUnit enemy = GetFirstAliveEnemy();

        if (enemy != null)
        {
            btl_cmd.SetCommand(player.Data.cmd[0], 1U, 176U, enemy.Id, 0U);
            InputFinishList.Add(CurrentPlayerIndex);
        }
        CurrentPlayerIndex = -1;
    }
예제 #30
0
파일: btl_cmd.cs 프로젝트: uzoko1/Memoria
    public static void ManageDequeueCommand(CMD_DATA cp, CMD_DATA ncp)
    {
        if (cp == null)
        {
            return;
        }
        FF9StateBattleSystem stateBattleSystem = FF9StateSystem.Battle.FF9Battle;
        BTL_DATA             btl = ncp.regist;

        if (ncp.cmd_no < 48 && btl != null && !Status.checkCurStat(btl, 256U))
        {
            btl.sel_mode = 0;
            if (btl_mot.checkMotion(btl, 9) && (btl.bi.slot_no != 6 || stateBattleSystem.cur_cmd != null && stateBattleSystem.cur_cmd.cmd_no != 21) && (btl.bi.slot_no != 1 || stateBattleSystem.cur_cmd != null && stateBattleSystem.cur_cmd.cmd_no != 31 && stateBattleSystem.cur_cmd.cmd_no != 23))
            {
                btl_mot.setMotion(btl, 32);
                btl.evt.animFrame = 0;
                btl.bi.cmd_idle   = 0;
            }
        }
        ResetItemCount(ncp);
        DequeueCommand(cp, true);
    }