using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Xml.Linq; using UnityEngine.SocialPlatforms; using UnityEngine; using Pml; using Dpr.Trainer; using DPData; using Dpr.UI; using SmartPoint.AssetAssistant; namespace Dpr.EvScript { public class EvDataManager { private const string Path_Parsons = "persons/field/"; private const string Path_Poke_Model = "pokemons/field/"; private const int Graphic_Gimmick = 500; private const int Graphic_Poke = 10000; private const float HitMinSize = 3f; private const int Graphic_SekiZou = 1000; private const int Graphic_SekiZouMAX = 3000; private const int WarpListLength = 30; private const int EntityParamLength = 50; private const int FieldObjectMoveCodesLength = 200; private const int TRAINER_EYE_HITMAX = 2; private const int SCR_EYE_TR_TYPE_SINGLE = 0; private const int SCR_EYE_TR_TYPE_DOUBLE = 1; private const int SCR_EYE_TR_TYPE_TAG = 2; private const float _fallSpd = 0.25f; private const float _fallOffset = 15f; private const float _fallRotSpd = 35f; private const float _fallDiveSpd = 15f; private const float _fallDiveAcce = 0.1f; private const float _fromRotSpd = 50f; private const float _fromRotAcce = 4f; private const float _fromRotSpdMin = 10f; private const float _const_cloudTime = 5f; private const float _app_frame = 0.033333335f; private const int _WORK_TRUE = 1; private const int _WORK_FALSE = 0; private const string SEQ_SE_DP_SELECT = "UI_common_decide"; private const int TRMSG_FIGHT_START = 0; private const int TRMSG_FIGHT_LOSE = 1; private const int TRMSG_FIGHT_AFTER = 2; private const int TRMSG_FIGHT_START_1 = 3; private const int TRMSG_FIGHT_LOSE_1 = 4; private const int TRMSG_FIGHT_AFTER_1 = 5; private const int TRMSG_POKE_ONE_1 = 6; private const int TRMSG_FIGHT_START_2 = 7; private const int TRMSG_FIGHT_LOSE_2 = 8; private const int TRMSG_FIGHT_AFTER_2 = 9; private const int TRMSG_POKE_ONE_2 = 10; private const int TRMSG_FIGHT_NONE_DN = 11; private const int TRMSG_FIGHT_NONE_D = 12; private const int TRMSG_FIGHT_FIRST_DAMAGE = 13; private const int TRMSG_FIGHT_POKE_HP_HALF = 14; private const int TRMSG_FIGHT_POKE_LAST = 15; private const int TRMSG_FIGHT_POKE_LAST_HP_HALF = 16; private const int TRMSG_REVENGE_FIGHT_START = 17; private const int TRMSG_REVENGE_FIGHT_START_1 = 18; private const int TRMSG_REVENGE_FIGHT_START_2 = 19; private const int MUGEN_LOOP = 5000; private const int RockClimbSequence_None = 0; private const int RockClimbSequence_JumpUp = 1; private const int RockClimbSequence_JumpLoop = 2; private const int RockClimbSequence_Climb = 3; private const int RockClimbSequence_EndJumpUp = 4; private const int RockClimbSequence_EndJumpLoop = 5; private const int RockClimbSequence_EndJumpEnd = 6; private const int FashionSeq_Reqest = 0; private const int FashionSeq_Wait = 1; private const int FashionSeq_End = 2; private const int FashionSeq_Error = 999; private const int LIGHT_FILED = 0; private const int LIGHT_CHAR = 1; private const int LIGHT_POKE = 2; private const int LIGHT_MAX = 3; private const int FieldObjectEntityLength = 100; private const int FieldKinomiGrowEntityLength = 30; private const int _PoolLength = 100; private static EvDataManager _instanse; public static bool IsFirstInitializedAfterSaveDataLoad; private static Dictionary KasekiFukugenTable; private static ValueTuple[] PokemonSizeTable; public static bool EventCameraEnable; private Action OnTalkStartCallBack; private bool _isScriptLoad; private EvScriptData[] _eventList; private int _eventListIndex; private Stack _callQueue; private Dictionary _findAllLabel; private GameObject _hit_object; // FieldObjectEntity private GameObject _hit_object_sub; // FieldObjectEntity private Vector3 _hit_position; private CmpResult _cmp_flag; private GameObject _scriptOperation; // AssetRequestOperation private AreaID _areaID; private List _warpList; // List private GameObject _warpData; // MapWarp private GameObject _warpRoot; private PlaySeData[] _se_datas; private PlaySeData[] _voice_datas; private Vector2Int _eventEndPosition; private string _posEventLabelReserve; private EntityParam[] _entityParamList; private GameObject _stopRoot; private bool _isInitFirstMap; private UpdateDelegate _updateDelegate; private EventEndDelegate _eventEndDelegate; private GameObject _doorEntity; // FieldEventDoorEntity private WorpEventData _worpEventData; private Vector2Int _eqZoneWorpGrid; private bool _isEqZoneWorp; private GameObject _liftEntity; // FieldEventLiftEntity private GameObject _tobariGymWallEntity; // FieldTobariGymWallEntity private GameObject _nagisaGymGearEntity; // FieldNagisaGymGearEntity private GameObject _nomoseGymSwitchEntity; // FieldNomoseGymSwitchEntity private GameObject _eyePaintingEntity; // FieldEyePaintingEntity private GameObject _embankmentEntity; // FieldEmbankmentEntity private GameObject _mistPlate; // FieldMistPlate private bool AzukariyaInitEventFlag; private int[] TvCommercials; private int TvCommercialsCurrentIndex; private string _callLabel_SceneChange; private string _callLabel_UpdateSP; private string _callLabel_AdjustHeroPos; public List FieldObjectMoveCodes; // List private bool _lateUpdateMoveCode; private bool _isCall_TrainerBtl; private EvCallData _battleReturnData; private GameObject _battleReturnHitObject; // FieldObjectEntity private GameObject[] _eyeEncountTarget; // FieldObjectMoveCode[] private GameObject[] _eyeEncountBallon; // Balloon[] private float _eyeEncountWait; private int _eyeEncountSeq; private int[] _talkTrinerIndex; public TrainerType Btl_TrainerType1; public TrainerType Btl_TrainerType2; private int _ugSeq; private Vector3 _ugEndPos; private Vector3 _ugHoleRot; private float _ugFallSpdCurrent; private int _ugDiveSeq; private float _ugDiveUpdateTime; private float _ugDiveRotTime; private float _ugDiveRotStart; private float _ugDiveRotEnd; private float _ugDiveJumpingTime; private int _ugFromSeq; private float _ugFromJumpTime; private float _ugFromRotSpdCurrent; private GameObject _ugNextJumpPos; // UgJumpPos.SheetData private GameObject _toUgInvisibleObjects; // FieldToUgInvisibleObjects private ZoneID _cacheZoneID_SceneChange; private bool _pendingInitScripts; public ZoneID SorawotobuZoneId; public int SorawotobuLocatorIndex; private EventCameraTable _evCameraTable; private GameObject _tairyouHasseiMane; // TairyouHasseiPokeManager private bool _isFadeEventReturnInput; private float _cloudSpeed; private float _cloudTime; private int _switch_work_index; private float _timeWait; private GameObject _msgWindowParam; // MsgWindowParam private GameObject _msgWindowParamOther; // MsgWindowParam private MsgOpenParam _msgOpenParam; private bool _isAutoMsg; private MSGSPEED _eMsgSpeed; private float _autoTime; private BOARD _boardState; private GameObject _msgWindow; // MsgWindow private GameObject _msgWindowOther; // MsgWindow private Coroutine _msgWindowCoroutine; private TalkState _talkStart; private EvCmdID.NAME _macroCmd; private EvCmdID.NAME _procCmd; private string _talkOpenMsbt; private string _talkOpenLabel; private float _turnEndFrame_Hero; private float _turnEndFrame_Obj; private float[] _turnTime; private Quaternion[] _turnEndQuaternion; private bool[] _turnDiffFlag; private float _deltatime; private string _mapChangeZoneID; private int _mapChangeIndex; private Quaternion _moveGridCenterStart; private Quaternion _moveGridCenterEnd; private bool _isOpenSubContentsMenu; private bool _isWaitCheckOnlineAccount; private string _custumWindow_msbt; private List _custumWindow_Labels; private List _custumWindow_RetIndex; private GameObject _selectDoorObject; // FieldEventEntity private float _fadeSpeed; private HeroReqBit _heroReqBit; private DIR _heroMoveGridCenterFrontDir; private bool _heroMoveGridCenterFrontStat; private GameObject _fieldObjectMove; // FieldObjectMove private GameObject _fieldObjectRotateYaw; // FieldObjectRotateYaw private GameObject _fieldFloatMove; // FieldFloatMove private int _hidenSequence; private Vector3 _takiTargetPosition; private Vector3 _rockClimbingEndPos; private Vector3 _rockClimbingStandPos; private bool _hidenEffectWait; private bool _rideBicycleReserve; private GameObject _runEventLiftEntity; // FieldEventLiftEntity private int _liftSequence; private int _gearSequence; private int _waterSequence; private int _kinomiSequence; private float _kinomiSequenceTime; private GameObject _kinomiEffect; // EffectInstance private int _warpSequence; private int _warpSpeedSequence; private float _warpSpeedSequenceTime; private int _scopeSequence; private int _azukariyaSequence; private int _pokelistSequence; private int _pokelistBox; private int _pokelistIndex; private int _trainSequence; private int _itemSequence; private int _btwrSequence; private bool _isOpenSpecialWin; private int _openSpecialWinLabelSelected; private TV_PROGRAM _currentTvProgram; private CutInState _cutinState; private bool _isShopOpen; private int _bagSelectItemNo; private GameObject _floorWindow; // FloorWindow private GameObject _moneyWindow; // MoneyWindow private StringBuilder matchingPassword; private int _openTownMapSeq; private bool _isOpenBtlTowerRecode; private int _softwareKeyboardSubState; private int _effSeq; private bool _pc_window_close; private int _dendou; private GameObject[] _umaAnimatorCtr; // FieldAnimatorController[] private bool _isOpenCustomBallTrainer; private int _nicknamePlacementSequence; private GameObject[] _scriptEffects; // EffectInstance[] private Coroutine[] _scriptScaleCorutine; private bool[] _scriptScaleVectol; private GameObject _temp_PokePara; // PokemonParam private bool _isBattleTowerBtl; private bool _isBattleTowerWin; private Vector2 _playerMoveGridCenterAngle; private EvScriptData _evData; private EvData.Script _evScript; private EvData.Command _evCommand; private EvData.Aregment[] _evArg; private int btlsearchSeq; private GameObject btlserchAudio; // AudioInstance private bool _isOpenHallOfFame; private Coroutine _cmdReportSaveCoroutine; private int _seqRankingView; private bool _isOpenCertificate; private int returnSequenceID; private bool _boukennootoTipsOpen; private int _fashionLoadSeq; private string _oldfashionAssetReqUri; private GameObject _fashionAssetReqOp; // AssetRequestOperation private float _fashionYawAngle; private Vector3 _fashionWorldpos; private bool _isTraining; private bool _isOpenTraining; private float[] _setlight_timer; private float[] _setlight_timer_limit; private float[] _start_lightIntensity; private float[] _end_lightIntensity; private bool[] _isRunningLight; public List Debug_01_DebugLabel; public List DebugSceneEventLabel; public List _fieldObjectEntity; // List public List _FieldKinomiGrowEntity; // List private List _AssetReqOpeList; private List _loadObjectList; private int _loadObjectIndex; private Transform _loadObjectParent; private bool _nowInstantiate; private Dictionary _poolLoadObjects; public static EvDataManager Instanse { get { return null; } } public bool IsPosEventReserved { get { return false; } } public GameObject _dummyPlayer // FieldObjectEntity { get { return null; } set { } } public GameObject PokemonCenter // FieldPokemonCenter { get { return null; } set { } } public GameObject Telescope // Telescope { get { return null; } set { } } public GameObject TelescopeNagisa // TelescopeNagisa { get { return null; } set { } } public GameObject FieldWazaCutIn // FieldWazaCutIn { get { return null; } set { } } public GameObject InterviewWork // InterviewWork { get { return null; } set { } } public GameObject FieldShip // FieldShip { get { return null; } set { } } private enum CmpResult { MINUS = 0, EQUAL = 1, PLUS = 2 } public enum EntityType { Stop = 0, Warp = 1, Board = 2, Npc = 3 } private enum MsgWindowType { DEFAULT = 0, NAME_PLATE = 1, BOARD_TYPE_TOWN = 2, BOARD_TYPE_ROAD = 3, BOARD_TYPE_POST = 4, BOARD_TYPE_INFO = 5, ITEM = 6, END = 7 } private enum MsgEndType { Input = 0, Auto = 1, Time = 2, Manual = 3 } private enum BOARD { BOARD_REQ_WAIT = 0, BOARD_REQ_ADD = 1, BOARD_REQ_DOWN = 2, BOARD_REQ_UP = 3, BOARD_REQ_DEL = 4, END = 5 } private enum TalkState { Init = 0, EndWait = 1, CloseWait = 2 } private enum HeroReqBit { Non = 0, Normal = 1, Banzai = 256 } private enum CutInState { None = 0, ResetForm = 1, PostResetForm = 2, Rotate = 3, PoketchAnimeStart = 4, WaitLoad = 5, WaitCutIn = 6, Sorawotobu_WaitPlayEffect = 7, Sorawotobu_WaitPreCaptureInvisible = 8, Sorawotobu_WaitNextCommand = 9, PoketchAnimeEnd = 10, End = 11 } private struct EvCallData { public int EventListIndex; public int LabelIndex; public int CommandIndex; } private struct PlaySeData { public string name; public GameObject AudioInstance; // AudioInstance public uint playEventId; } private struct WorpEventData { public GameObject Entity; // FieldEventDoorEntity public int State; public float Time; } private struct MsgOpenParam { public string MsbtFile; public string Label; public int LabelIndex; public MsgWindowType WindowType; public bool Input; public string[] TrainerName; public MsgEndType EndType; public bool PlayTextFeedSe; } public class EntityParam { public const int NearNone = -10; public string TalkLabel; public string ContactLabel; public int VanishFlagIndex; public bool IsContact; public EvWork.WORK_INDEX WorkIndex; public int WorkValue; public EntityType Type; public RectInt StopGridArea; public bool IsEventRunning; public int MoveCodeIndex; public bool Kairiki; public bool Iwakudaki; public bool Iaigiri; public bool Rockclimb; public int Dowsing; public bool SnowBall; public bool AzukariyaOldMan; public bool HoneyTree; public bool HeightIgnore; public Vector2 ContactSize; public bool IsContactCenter; public bool Sit; public int IdleAnimOverride; public int WalkAnimOverride; public TrainerID TrainerID; public int FieldObjectIndex; public int[] NearObject; public float TalkRange; public bool isTalkHit; public float TalkAngle; public bool SaveObject; public ZoneID LocaitionZoneID; public bool IsObject; public Vector2 TalkSegment; public byte TalkBit; public int CharacterGraphicsIndex; public bool BattleReturnNotRotate; public EntityParam() { // TODO } } private class AssetReqOpeRef { public GameObject ReqOpe; // AssetRequestOperation public int RefCount; public bool isEnd; public AssetReqOpeRef() { // TODO } } private class LoadObjectData { public bool IsLoadFast; public int Distance; public bool IsCreated; public int AssetReqIndex; public string ObjectName; public GameObject PlaceData; // PlaceData.SheetData public Vector2 Position; public float Height; public float Angle; public int MoveCode; public DIR MoveDirHead; public int MoveParam0; public int MoveParam1; public int MoveParam2; public int MoveLimitX; public int MoveLimitZ; public int Ev_Type; public int mv_old_dir; public int mv_dir; public bool useloadData; public int replaceGraphicIndex; public LoadObjectData() { // TODO } } public delegate void UpdateDelegate(float time); public delegate void EventEndDelegate(); private void SetCloudScaleStart() { // TODO } private void SetCloudScaleEnd() { // TODO } private bool EvCmdTimeWait() { if (_evArg.Length > 1) { float frames = GetWorkOrFloatValue(_evArg[1]); if (_evArg.Length > 2) { if (frames * 0.03333334 < _timeWait) { FlagWork.SetWork(_evArg[2].data, 0); return true; } FlagWork.SetWork(_evArg[2].data, 1); _timeWait += _deltatime; return false; } } ThrowIndexOutOfRange(); return true; } private bool EvCmdCmpWkWk() { if (_evArg.Length < 2) { ThrowIndexOutOfRange(); return true; } int workNo1 = GetWorkOrIntValue(_evArg[1]); if (_evArg.Length < 3) { ThrowIndexOutOfRange(); return true; } int workNo2 = GetWorkOrIntValue(_evArg[2]); int workValue1 = FlagWork.GetWork(workNo1); int workValue2 = FlagWork.GetWork(workNo2); if (workValue1 < workValue2) { _cmp_flag = CmpResult.MINUS; } else if (workValue1 == workValue2) { _cmp_flag = CmpResult.EQUAL; } else { _cmp_flag = CmpResult.PLUS; return true; } _cmp_flag = CmpResult.PLUS; // BUG? Will always be returning work1 as greater return true; } public bool CallLabel(string label) { if (!string.IsNullOrEmpty(label) && _findAllLabel.ContainsKey(label)) { if (_eventListIndex < _eventList.Length) { EvCallData call; call.EventListIndex = _eventListIndex; call.LabelIndex = _eventList[_eventListIndex].LabelIndex; call.CommandIndex = _eventList[_eventListIndex].CommandIndex + 1; _callQueue.Push(call); int[] foundLabel = _findAllLabel[label]; //Probably some struct? if (foundLabel[6] != 0) { int nextEventListIndex = foundLabel[8]; if (nextEventListIndex == -1) { SetCloudScaleEnd(); } else if (_eventListIndex == -1) { SetCloudScaleStart(); } _eventListIndex = nextEventListIndex; if (_eventListIndex < _eventList.Length) { if ((uint)foundLabel[6] > 1) { _eventList[_eventListIndex].LabelIndex = foundLabel[9]; _eventList[_eventListIndex].CommandIndex = 0; return true; } } } } ThrowIndexOutOfRange(); return false; } return false; } public bool ReturnEvData() { if (_callQueue.Count > 0) { EvCallData popped = _callQueue.Pop(); if (popped.EventListIndex == -1) { SetCloudScaleEnd(); } else { if (_eventListIndex == -1) { SetCloudScaleStart(); } } _eventListIndex = popped.EventListIndex; if (_eventListIndex < _eventList.Length) { _eventList[popped.EventListIndex].LabelIndex = popped.LabelIndex; _eventList[popped.EventListIndex].CommandIndex = popped.CommandIndex; return true; } ThrowIndexOutOfRange(); return false; } return false; } public bool JumpLabel(string label, EventEndDelegate callback) { if (!string.IsNullOrEmpty(label) && _findAllLabel.ContainsKey(label)) { int[] foundLabel = _findAllLabel[label]; //Probably some struct? if (foundLabel[6] != 0) { int nextEventListIndex = foundLabel[8]; if (nextEventListIndex == -1) { SetCloudScaleEnd(); } else if (_eventListIndex == -1) { SetCloudScaleStart(); } _eventListIndex = nextEventListIndex; if (_eventListIndex < _eventList.Length) { if ((uint)foundLabel[6] > 1) { _eventList[_eventListIndex].LabelIndex = foundLabel[9]; _eventList[_eventListIndex].CommandIndex = 0; XMenuTop.CloseForce(); BoxWindow.CloseForce(); if (callback != null) { _eventEndDelegate += callback; if (_eventEndDelegate != null && !(_eventEndDelegate is EventEndDelegate)) { ThrowInvalidCast(); return false; } } return true; } } } ThrowIndexOutOfRange(); return false; } return false; } private string ReEQType(string eq) { switch (eq) { case "EQUAL": return "EQ"; case "LITTLER": return "LT"; case "GREATER": return "GT"; case "LT_EQ": return "LE"; case "GT_EQ": return "GE"; case "FLGON": return "EQ"; case "FLGOFF": return "LT"; default: return eq; } } private bool IfJump_Call(bool jump, string eq, string label) { string comparison = ReEQType(eq); switch (comparison) { case "EQ": //Exclude Less and Greater if (_cmp_flag != CmpResult.EQUAL) { return false; } break; case "NE": //Exclude Equal if (_cmp_flag == CmpResult.EQUAL) { return false; } break; case "GT": //Exclude Less and Equal if (_cmp_flag != CmpResult.PLUS) { return false; } break; case "GE": //Exclude Less if (_cmp_flag == CmpResult.MINUS) { return false; } break; case "LT": //Exclude Greater and Equal if (_cmp_flag != CmpResult.MINUS) { return false; } break; case "LE": //Exclude Greater if (_cmp_flag == CmpResult.PLUS) { return false; } break; default: return false; } if (jump) { return JumpLabel(label, null); } return CallLabel(label); } private bool EvCmdIfJump() { if (_evArg.Length < 2) { ThrowIndexOutOfRange(); return false; } string eq = ""; if (_evArg[1].argType == EvData.ArgType.String) { eq = _evData.EvData.GetString(_evArg[1].data); } if (_evArg.Length < 3) { ThrowIndexOutOfRange(); return false; } string label = ""; if (_evArg[2].argType == EvData.ArgType.String) { label = _evData.EvData.GetString(_evArg[2].data); } IfJump_Call(true, eq, label); return true; } private bool EvCmdIfCall() { if (_evArg.Length < 2) { ThrowIndexOutOfRange(); return false; } string eq = ""; if (_evArg[1].argType == EvData.ArgType.String) { eq = _evData.EvData.GetString(_evArg[1].data); } if (_evArg.Length < 3) { ThrowIndexOutOfRange(); return false; } string label = ""; if (_evArg[2].argType == EvData.ArgType.String) { label = _evData.EvData.GetString(_evArg[2].data); } IfJump_Call(false, eq, label); return true; } private bool CommandEquals(string eq, int val1, int val2) { string comparison = ReEQType(eq); switch (comparison) { case "EQ": //Equals return val1 == val2; case "NE": //Not Equals return val1 != val2; case "GT": //Greater return val1 > val2; case "GE": //Greater or equal return val1 >= val2; case "LT": //Less return val1 < val2; case "LE": //Less or equal return val1 <= val2; default: return false; } } private bool EvMacro_IFVAL_JUMP() { if (_evArg.Length < 2) { ThrowIndexOutOfRange(); return false; } int val1 = GetWorkOrIntValue(_evArg[1]); if (_evArg.Length < 3) { ThrowIndexOutOfRange(); return false; } string eq = ""; if (_evArg[2].argType == EvData.ArgType.String) { eq = _evData.EvData.GetString(_evArg[2].data); } if (_evArg.Length < 4) { ThrowIndexOutOfRange(); return false; } int val2 = GetWorkOrIntValue(_evArg[3]); if (_evArg.Length < 5) { ThrowIndexOutOfRange(); return false; } string label = ""; if (_evArg[4].argType == EvData.ArgType.String) { label = _evData.EvData.GetString(_evArg[4].data); } if (CommandEquals(eq, val1, val2)) { JumpLabel(label, null); } return true; } private bool EvMacro_IFVAL_CALL() { if (_evArg.Length < 2) { ThrowIndexOutOfRange(); return false; } int val1 = GetWorkOrIntValue(_evArg[1]); if (_evArg.Length < 3) { ThrowIndexOutOfRange(); return false; } string eq = ""; if (_evArg[2].argType == EvData.ArgType.String) { eq = _evData.EvData.GetString(_evArg[2].data); } if (_evArg.Length < 4) { ThrowIndexOutOfRange(); return false; } int val2 = GetWorkOrIntValue(_evArg[3]); if (_evArg.Length < 5) { ThrowIndexOutOfRange(); return false; } string label = ""; if (_evArg[4].argType == EvData.ArgType.String) { label = _evData.EvData.GetString(_evArg[4].data); } if (CommandEquals(eq, val1, val2)) { CallLabel(label); } return true; } private bool EvMacro_CASE_JUMP() { int actualVal = FlagWork.GetWork(_switch_work_index); if (_evArg.Length < 2) { ThrowIndexOutOfRange(); return false; } int checkedVal = GetWorkOrIntValue(_evArg[1]); if (_evArg.Length < 3) { ThrowIndexOutOfRange(); return false; } string label = ""; if (_evArg[2].argType == EvData.ArgType.String) { label = _evData.EvData.GetString(_evArg[2].data); } if (actualVal == checkedVal) { JumpLabel(label, null); } return true; } private bool EvMacro_CASE_CANCEL() { int val1 = FlagWork.GetWork(EvWork.WORK_INDEX.SCWK_REG0); int val2 = FlagWork.GetWork(EvWork.WORK_INDEX.EV_WIN_B_CANCEL); if (val1 < val2) { _cmp_flag = CmpResult.MINUS; } else if (val1 == val2) { _cmp_flag = CmpResult.EQUAL; } _cmp_flag = CmpResult.PLUS; // BUG? Will always be returning SCWK_REG0 as greater if (_evArg.Length < 2) { ThrowIndexOutOfRange(); return false; } string label = ""; if (_evArg[1].argType == EvData.ArgType.String) { label = _evData.EvData.GetString(_evArg[1].data); } IfJump_Call(true, "EQ", label); return true; } private bool EvCmdFlagSet() { if (_evArg.Length < 2) { ThrowIndexOutOfRange(); return false; } int flagNo = _evArg[1].data; if (flagNo > -1) { FlagWork.SetFlag(flagNo, true); if (flagNo == (int)EvWork.FLAG_INDEX.FLAG_STOP_ZONE_PROGRAM) { FieldManager.Instance.eventTownMapPos = EntityManager.activeBattlePlayer.worldPosition; } } return true; } public void SetSysFlag(int index, bool val) { FlagWork.SetSysFlag((EvWork.SYSFLAG_INDEX)index, val); byte badgeCount = 0; if (FlagWork.GetSysFlag(EvWork.SYSFLAG_INDEX.BADGE_ID_C03)) badgeCount++; if (FlagWork.GetSysFlag(EvWork.SYSFLAG_INDEX.BADGE_ID_C04)) badgeCount++; if (FlagWork.GetSysFlag(EvWork.SYSFLAG_INDEX.BADGE_ID_C07)) badgeCount++; if (FlagWork.GetSysFlag(EvWork.SYSFLAG_INDEX.BADGE_ID_C06)) badgeCount++; if (FlagWork.GetSysFlag(EvWork.SYSFLAG_INDEX.BADGE_ID_C05)) badgeCount++; if (FlagWork.GetSysFlag(EvWork.SYSFLAG_INDEX.BADGE_ID_C02)) badgeCount++; if (FlagWork.GetSysFlag(EvWork.SYSFLAG_INDEX.BADGE_ID_C09)) badgeCount++; if (FlagWork.GetSysFlag(EvWork.SYSFLAG_INDEX.BADGE_ID_C08)) badgeCount++; PlayerWork.badge = badgeCount; } private bool EvMacro_IF_FLAGON_JUMP() { if (_evArg.Length < 3) { ThrowIndexOutOfRange(); return false; } string label = ""; if (_evArg[2].argType == EvData.ArgType.String) { label = _evData.EvData.GetString(_evArg[2].data); } if (_evArg.Length < 2) { ThrowIndexOutOfRange(); return false; } bool flagState; int flagNo = _evArg[1].data; switch (_evArg[1].argType) { case EvData.ArgType.SysFlag: flagState = FlagWork.GetSysFlag((EvWork.SYSFLAG_INDEX)flagNo); break; case EvData.ArgType.Flag: if (flagNo < 0 || flagNo == (int)EvWork.FLAG_INDEX.FLAG_END_SAVE_SIZE) { return true; } flagState = FlagWork.GetFlag(flagNo); break; default: return true; } if (flagState) { _cmp_flag = CmpResult.EQUAL; IfJump_Call(true, "FLGON", label); } return true; } private bool EvMacro_IF_FLAGOFF_JUMP() { if (_evArg.Length < 3) { ThrowIndexOutOfRange(); return false; } string label = ""; if (_evArg[2].argType == EvData.ArgType.String) { label = _evData.EvData.GetString(_evArg[2].data); } if (_evArg.Length < 2) { ThrowIndexOutOfRange(); return false; } bool flagState; int flagNo = _evArg[1].data; switch (_evArg[1].argType) { case EvData.ArgType.SysFlag: flagState = FlagWork.GetSysFlag((EvWork.SYSFLAG_INDEX)flagNo); break; case EvData.ArgType.Flag: if (flagNo < 0 || flagNo == (int)EvWork.FLAG_INDEX.FLAG_END_SAVE_SIZE) { _cmp_flag = CmpResult.MINUS; IfJump_Call(true, "FLGOFF", label); return true; } flagState = FlagWork.GetFlag(flagNo); break; default: return true; } if (!flagState) { _cmp_flag = CmpResult.MINUS; IfJump_Call(true, "FLGOFF", label); } return true; } private bool EvMacro_IF_FLAGON_CALL() { if (_evArg.Length < 3) { ThrowIndexOutOfRange(); return false; } string label = ""; if (_evArg[2].argType == EvData.ArgType.String) { label = _evData.EvData.GetString(_evArg[2].data); } if (_evArg.Length < 2) { ThrowIndexOutOfRange(); return false; } bool flagState; int flagNo = _evArg[1].data; switch (_evArg[1].argType) { case EvData.ArgType.SysFlag: flagState = FlagWork.GetSysFlag((EvWork.SYSFLAG_INDEX)flagNo); break; case EvData.ArgType.Flag: if (flagNo < 0 || flagNo == (int)EvWork.FLAG_INDEX.FLAG_END_SAVE_SIZE) { return true; } flagState = FlagWork.GetFlag(flagNo); break; default: return true; } if (flagState) { _cmp_flag = CmpResult.EQUAL; IfJump_Call(false, "FLGON", label); } return true; } private bool EvMacro_IF_FLAGOFF_CALL() { if (_evArg.Length < 3) { ThrowIndexOutOfRange(); return false; } string label = ""; if (_evArg[2].argType == EvData.ArgType.String) { label = _evData.EvData.GetString(_evArg[2].data); } if (_evArg.Length < 2) { ThrowIndexOutOfRange(); return false; } bool flagState; int flagNo = _evArg[1].data; switch (_evArg[1].argType) { case EvData.ArgType.SysFlag: flagState = FlagWork.GetSysFlag((EvWork.SYSFLAG_INDEX)flagNo); break; case EvData.ArgType.Flag: if (flagNo < 0 || flagNo == (int)EvWork.FLAG_INDEX.FLAG_END_SAVE_SIZE) { _cmp_flag = CmpResult.MINUS; IfJump_Call(false, "FLGOFF", label); return true; } flagState = FlagWork.GetFlag(flagNo); break; default: return true; } if (!flagState) { _cmp_flag = CmpResult.MINUS; IfJump_Call(false, "FLGOFF", label); } return true; } private bool EvCmdFlagCheckWk() { if (_evArg.Length < 2) { ThrowIndexOutOfRange(); return false; } int workNo = _evArg[1].data; CmpResult result; switch (_evArg[1].argType) { case EvData.ArgType.Work: int workValue = FlagWork.GetWork(workNo); if (workValue < 0 || workValue == (int)EvWork.FLAG_INDEX.FLAG_END_SAVE_SIZE) { result = CmpResult.EQUAL; } else { result = FlagWork.GetFlag(workValue) ? CmpResult.MINUS : CmpResult.EQUAL; } break; case EvData.ArgType.Float: int floatWorkValue = (int)ConvertToFloat(workNo); if (floatWorkValue < 0 || floatWorkValue == (int)EvWork.FLAG_INDEX.FLAG_END_SAVE_SIZE) { result = CmpResult.EQUAL; } else { result = FlagWork.GetFlag(floatWorkValue) ? CmpResult.MINUS : CmpResult.EQUAL; } break; default: result = FlagWork.GetFlag(0) ? CmpResult.MINUS : CmpResult.EQUAL; break; } if (_evArg.Length < 3) { ThrowIndexOutOfRange(); return false; } FlagWork.SetWork(_evArg[2].data, (int)result); return true; } private TrainerID GetArgTrainerID(EvScriptData ev, EvData.Aregment arg) { switch (arg.argType) { case EvData.ArgType.Work: case EvData.ArgType.Float: return (TrainerID) GetWorkOrIntValue(arg); case EvData.ArgType.String: string trainerName = ev.EvData.GetString(arg.data); for (int i=0; i<(int)TrainerID.MAX; i++) { if (trainerName == Enum.GetName(typeof(TrainerID), i)) { return (TrainerID) i; } } return TrainerID.NONE; default: return TrainerID.NONE; } } private bool EvMacro_IF_TR_FLAGON_JUMP() { if (_evArg.Length < 2) { ThrowIndexOutOfRange(); return false; } TrainerID id = GetArgTrainerID(_evData, _evArg[1]); //_cmp_flag = TrainerWork.GetWinFlag(id) ? CmpResult.EQUAL : CmpResult.MINUS; if (_evArg.Length < 3) { ThrowIndexOutOfRange(); return false; } string label = ""; if (_evArg[2].argType == EvData.ArgType.String) { label = _evData.EvData.GetString(_evArg[2].data); } IfJump_Call(true, "FLGON", label); return true; } private bool EvMacro_IF_TR_FLAGOFF_JUMP() { if (_evArg.Length < 2) { ThrowIndexOutOfRange(); return false; } TrainerID id = GetArgTrainerID(_evData, _evArg[1]); //_cmp_flag = TrainerWork.GetWinFlag(id) ? CmpResult.EQUAL : CmpResult.MINUS; if (_evArg.Length < 3) { ThrowIndexOutOfRange(); return false; } string label = ""; if (_evArg[2].argType == EvData.ArgType.String) { label = _evData.EvData.GetString(_evArg[2].data); } IfJump_Call(true, "FLGOFF", label); return true; } private bool EvMacro_IF_TR_FLAGON_CALL() { if (_evArg.Length < 2) { ThrowIndexOutOfRange(); return false; } TrainerID id = GetArgTrainerID(_evData, _evArg[1]); //if (!TrainerWork.GetWinFlag(id) || TrainerWork.GetBattleSearcher(id)) //{ //_cmp_flag = CmpResult.MINUS; //} //else //{ //_cmp_flag = CmpResult.EQUAL; //} if (_evArg.Length < 3) { ThrowIndexOutOfRange(); return false; } string label = ""; if (_evArg[2].argType == EvData.ArgType.String) { label = _evData.EvData.GetString(_evArg[2].data); } IfJump_Call(false, "FLGON", label); return true; } private bool EvMacro_IF_TR_FLAGOFF_CALL() { if (_evArg.Length < 2) { ThrowIndexOutOfRange(); return false; } TrainerID id = GetArgTrainerID(_evData, _evArg[1]); //if (!TrainerWork.GetWinFlag(id) || TrainerWork.GetBattleSearcher(id)) //{ //_cmp_flag = CmpResult.MINUS; //} //else //{ //_cmp_flag = CmpResult.EQUAL; //} if (_evArg.Length < 3) { ThrowIndexOutOfRange(); return false; } string label = ""; if (_evArg[2].argType == EvData.ArgType.String) { label = _evData.EvData.GetString(_evArg[2].data); } IfJump_Call(false, "FLGOFF", label); return true; } private bool EvCmdWkAdd() { if (_evArg.Length < 2) { ThrowIndexOutOfRange(); return false; } int initialValue = GetWorkOrIntValue(_evArg[1]); if (_evArg.Length < 3) { ThrowIndexOutOfRange(); return false; } int addedValue = GetWorkOrIntValue(_evArg[2]); FlagWork.SetWork(_evArg[1].data, initialValue + addedValue); return true; } private bool EvCmdWkSub() { if (_evArg.Length < 2) { ThrowIndexOutOfRange(); return false; } int initialValue = GetWorkOrIntValue(_evArg[1]); if (_evArg.Length < 3) { ThrowIndexOutOfRange(); return false; } int addedValue = GetWorkOrIntValue(_evArg[2]); FlagWork.SetWork(_evArg[1].data, initialValue - addedValue); return true; } private bool EvCmdLoadWkValue() { if (_evArg.Length < 3) { ThrowIndexOutOfRange(); return false; } int newValue = GetWorkOrIntValue(_evArg[2]); FlagWork.SetWork(_evArg[1].data, newValue); return true; } private bool EvCmdLoadWkWk() { if (_evArg.Length < 3) { ThrowIndexOutOfRange(); return false; } int newValue = GetWorkOrIntValue(_evArg[2]); FlagWork.SetWork(_evArg[1].data, newValue); return true; } private bool EvCmdLoadWkWkValue() { if (_evArg.Length < 3) { ThrowIndexOutOfRange(); return false; } int newValue = GetWorkOrIntValue(_evArg[2]); FlagWork.SetWork(_evArg[1].data, newValue); return true; } private bool Cmd_TalkMsg(EvScriptData ev, bool index = false) { switch (_talkStart) { case TalkState.Init: if (ev.CommandIndex >= ev.GetScript.Commands.Count) { ThrowArgumentOutOfRange(); } EvData.Command command = ev.GetScript.Commands[ev.CommandIndex]; if (index) { if (command.Arg.Count < 2) { ThrowArgumentOutOfRange(); } string file = ""; if (command.Arg[1].argType == EvData.ArgType.String) { file = _evData.EvData.GetString(command.Arg[1].data); } _msgOpenParam.MsbtFile = file; _msgOpenParam.Label = ""; if (command.Arg.Count < 3) { ThrowArgumentOutOfRange(); } int workno = GetWorkOrIntValue(command.Arg[2]); _msgOpenParam.LabelIndex = workno; if (command.Arg.Count < 4) { _msgOpenParam.PlayTextFeedSe = false; } else { _msgOpenParam.PlayTextFeedSe = GetWorkOrIntValue(command.Arg[3]) == 1; } } else { if (command.Arg.Count < 2) { ThrowArgumentOutOfRange(); } string label = ""; if (command.Arg[1].argType == EvData.ArgType.String) { label = _evData.EvData.GetString(command.Arg[1].data); } string[] file = label.Split('%'); if (file.Length < 1) { ThrowIndexOutOfRange(); } _msgOpenParam.MsbtFile = file[0]; if (file.Length < 2) { ThrowIndexOutOfRange(); } _msgOpenParam.Label = file[1]; if (command.Arg.Count < 3) { _msgOpenParam.PlayTextFeedSe = false; } else { _msgOpenParam.PlayTextFeedSe = GetWorkOrIntValue(command.Arg[2]) == 1; } } _msgOpenParam.WindowType = MsgWindowType.DEFAULT; _msgOpenParam.Input = true; _msgOpenParam.EndType = MsgEndType.Input; OpenTalk(_msgOpenParam); _talkStart = TalkState.EndWait; return false; case TalkState.EndWait: if (_msgWindowCoroutine != null) { return false; } _talkStart = TalkState.Init; return true; default: return false; } } private bool OpenTalk(MsgOpenParam msgparam) { if (_msgWindowCoroutine != null) { Sequencer.Stop(_msgWindowCoroutine); } // TODO return true; } private bool EvCmdEventCameraIndex() { if (_evArg.Length < 2) { ThrowIndexOutOfRange(); return false; } int index = GetWorkOrIntValue(_evArg[1]); //GameManager.fieldCamera.EventCamera.SetCameraData(_evCameraTable, index); return true; } private bool EvCmd_CAMERA_CONTROLLER_PLAY() { if (_evArg.Length < 2) { ThrowIndexOutOfRange(); return false; } string statename = ""; if (_evArg[1].argType == EvData.ArgType.String) { statename = _evData.EvData.GetString(_evArg[1].data); } FieldAnimeCamera.instance.Play(statename); return true; } private bool RunEvCmd(EvCmdID.NAME index) { if (index < EvCmdID.NAME.CMD_NAME_END) { switch (index) { case EvCmdID.NAME._NOP: case EvCmdID.NAME._END: { EndScript(); return true; } case EvCmdID.NAME._TIME_WAIT: { return EvCmdTimeWait(); } case EvCmdID.NAME._CMPWK: { EvCmdCmpWkWk(); return true; } case EvCmdID.NAME._CHG_COMMON_SCR: case EvCmdID.NAME._CALL: { if (_evArg.Length < 2) { ThrowIndexOutOfRange(); return true; } string label = ""; if (_evArg[1].argType == EvData.ArgType.String) { label = _evData.EvData.GetString(_evArg[1].data); } CallLabel(label); return true; } case EvCmdID.NAME._CHG_LOCAL_SCR: case EvCmdID.NAME._RET: { bool retResult = ReturnEvData(); if (!retResult) { EndScript(); } return true; } case EvCmdID.NAME._JUMP: { if (_evArg.Length < 2) { ThrowIndexOutOfRange(); return true; } string label = ""; if (_evArg[1].argType == EvData.ArgType.String) { label = _evData.EvData.GetString(_evArg[1].data); } JumpLabel(label, null); return true; } case EvCmdID.NAME._IF_JUMP: { EvCmdIfJump(); return true; } case EvCmdID.NAME._IF_CALL: { EvCmdIfCall(); return true; } case EvCmdID.NAME._IFVAL_JUMP: case EvCmdID.NAME._IFWK_JUMP: { EvMacro_IFVAL_JUMP(); return true; } case EvCmdID.NAME._IFVAL_CALL: case EvCmdID.NAME._IFWK_CALL: { EvMacro_IFVAL_CALL(); return true; } case EvCmdID.NAME._SWITCH: { if (_evArg.Length < 2) { ThrowIndexOutOfRange(); return true; } _switch_work_index = _evArg[1].data; return true; } case EvCmdID.NAME._CASE_JUMP: { EvMacro_CASE_JUMP(); return true; } case EvCmdID.NAME._CASE_CANCEL: { EvMacro_CASE_CANCEL(); return true; } case EvCmdID.NAME._FLAG_SET: { EvCmdFlagSet(); return true; } case EvCmdID.NAME._ARRIVE_FLAG_SET: { if (_evArg.Length < 2) { ThrowIndexOutOfRange(); return true; } SetSysFlag(_evArg[1].data, true); return true; } case EvCmdID.NAME._FLAG_RESET: { if (_evArg.Length < 2) { ThrowIndexOutOfRange(); return true; } int flagNo = _evArg[1].data; if (flagNo > -1) { FlagWork.SetFlag(flagNo, false); } return true; } case EvCmdID.NAME._FLAG_CHECK: { if (_evArg.Length < 2) { ThrowIndexOutOfRange(); return true; } int flagNo = _evArg[1].data; if ((flagNo < 0) || (flagNo == (int)EvWork.FLAG_INDEX.FLAG_END_SAVE_SIZE)) { _cmp_flag = CmpResult.EQUAL; } else if (!FlagWork.GetFlag(flagNo)) { _cmp_flag = CmpResult.EQUAL; } else { _cmp_flag = CmpResult.MINUS; } return true; } case EvCmdID.NAME._IF_FLAGON_JUMP: { EvMacro_IF_FLAGON_JUMP(); return true; } case EvCmdID.NAME._IF_FLAGOFF_JUMP: { EvMacro_IF_FLAGOFF_JUMP(); return true; } case EvCmdID.NAME._IF_FLAGON_CALL: { EvMacro_IF_FLAGON_CALL(); return true; } case EvCmdID.NAME._IF_FLAGOFF_CALL: { EvMacro_IF_FLAGOFF_CALL(); return true; } case EvCmdID.NAME._FLAG_CHECK_WK: { EvCmdFlagCheckWk(); return true; } case EvCmdID.NAME._FLAG_SET_WK: { if (_evArg.Length < 2) { ThrowIndexOutOfRange(); return true; } int flagNo = GetWorkOrIntValue(_evArg[1]); if (flagNo < 0) { return true; } FlagWork.SetFlag(flagNo, true); return true; } case EvCmdID.NAME._TRAINER_FLAG_SET: { if (_evArg.Length < 2) { ThrowIndexOutOfRange(); return true; } TrainerID id = GetArgTrainerID(_evData, _evArg[1]); //TrainerWork.SetWinFlag(id); //TrainerWork.SetBattleSaercher(id); return true; } case EvCmdID.NAME._TRAINER_FLAG_RESET: { if (_evArg.Length < 2) { ThrowIndexOutOfRange(); return true; } TrainerID id = GetArgTrainerID(_evData, _evArg[1]); //TrainerWork.ResetWinFlag(id); //TrainerWork.ReSetBattleSaercher(id); return true; } case EvCmdID.NAME._TRAINER_FLAG_CHECK: { if (_evArg.Length < 2) { ThrowIndexOutOfRange(); return true; } TrainerID id = GetArgTrainerID(_evData, _evArg[1]); //if (!TrainerWork.GetWinFlag(id) || TrainerWork.GetBattleSearcher(id)) //{ //_cmp_flag = CmpResult.MINUS; //} //else //{ //_cmp_flag = CmpResult.EQUAL; //} return true; } case EvCmdID.NAME._IF_TR_FLAGON_JUMP: { EvMacro_IF_TR_FLAGON_JUMP(); return true; } case EvCmdID.NAME._IF_TR_FLAGOFF_JUMP: { EvMacro_IF_TR_FLAGOFF_JUMP(); return true; } case EvCmdID.NAME._IF_TR_FLAGON_CALL: { EvMacro_IF_TR_FLAGON_CALL(); return true; } case EvCmdID.NAME._IF_TR_FLAGOFF_CALL: { EvMacro_IF_TR_FLAGOFF_CALL(); return true; } case EvCmdID.NAME._ADD_WK: { EvCmdWkAdd(); return true; } case EvCmdID.NAME._SUB_WK: { EvCmdWkSub(); return true; } case EvCmdID.NAME._LDVAL: { EvCmdLoadWkValue(); return true; } case EvCmdID.NAME._LDWK: { EvCmdLoadWkWk(); return true; } case EvCmdID.NAME._LDWKVAL: { EvCmdLoadWkWkValue(); return true; } case EvCmdID.NAME._TALKMSG: { return Cmd_TalkMsg(_evData, false); } case EvCmdID.NAME._EVENT_CAMERA_INDEX: { EvCmdEventCameraIndex(); return true; } case EvCmdID.NAME._CAMERA_CONTROLLER_PLAY: { EvCmd_CAMERA_CONTROLLER_PLAY(); return true; } default: { return true; } } } return true; } // Not an actual method, here to simplify the code. // Ends the script. private void EndScript() { SetCloudScaleEnd(); _eventListIndex = -1; } // Not an actual method, here to simplify the code. // Throws an IndexOutOfRange exception. private void ThrowIndexOutOfRange() { // TODO throw new IndexOutOfRangeException(); } // Not an actual method, here to simplify the code. // Throws an InvalidCast exception. private void ThrowInvalidCast() { // TODO throw new InvalidCastException(); } // Not an actual method, here to simplify the code. // Throws an ArgumentOutOfRange exception. private void ThrowArgumentOutOfRange() { // TODO throw new ArgumentOutOfRangeException(); } // Not an actual method, here to simplify the code. // Converts the IEEE-754 formatted int32 into its proper float value. private float ConvertToFloat(int value) { return BitConverter.ToSingle(BitConverter.GetBytes(_evArg[1].data), 0); } // Not an actual method, here to simplify the code. // Returns either the value at the given work variable or the direct int value depending on the given argument's type. // Returns 0 for any other argument type. int GetWorkOrIntValue(EvData.Aregment arg) { EvData.ArgType argType = arg.argType; int data = arg.data; int result = 0; switch (argType) { case EvData.ArgType.Work: result = PlayerWork.GetInt(data); break; case EvData.ArgType.Float: result = (int)ConvertToFloat(data); break; default: break; } return result; } // Not an actual method, here to simplify the code. // Returns either the value at the given work variable or the direct float value depending on the given argument's type. // Returns 0 for any other argument type. float GetWorkOrFloatValue(EvData.Aregment arg) { EvData.ArgType argType = arg.argType; int data = arg.data; float result = 0; switch (argType) { case EvData.ArgType.Work: result = PlayerWork.GetInt(data); break; case EvData.ArgType.Float: result = ConvertToFloat(data); break; default: break; } return result; } // Not an actual method, here to simplify the code. // If the given argument is a work variable, set it to the given value. // Does nothing otherwise. void SetWorkToValue(EvData.Aregment arg, int value) { EvData.ArgType argType = arg.argType; int data = arg.data; if (argType == EvData.ArgType.Work) { PlayerWork.SetInt(data, value); } } } }