Пример #1
0
    private void SaveSideScrollMap()
    {
        var playerGameObject = GameObject.Find("Player");
        var player           = playerGameObject.GetComponent <Player>();
        var lastMapPosition  = player.PlayerDataModel.LastMapPosition;

        levelDataModel = GameManager.Instance.Savables.Find(obj => obj.GetType() == typeof(LevelDataModel) && obj.name == string.Format("Level_{0}-{1}", lastMapPosition.x, lastMapPosition.y)) as LevelDataModel;
        var objectsContainer = GameObject.Find("ObjectsContainer");

        levelDataModel.GeneratedObjects = new List <GeneratedItemDataModel>();

        foreach (Transform child in objectsContainer.transform)
        {
            var gameStaticObject = child.GetComponent <GameStaticObject>();
            levelDataModel.GeneratedObjects.Add(
                new GeneratedItemDataModel()
            {
                Prefab   = child.gameObject.name.Replace("(Clone)", string.Empty),
                Position = child.position,
                Type     = gameStaticObject.Type
            }
                );
        }
        levelDataModel.Position        = player.PlayerDataModel.LastMapPosition;
        levelDataModel.IsVisitedBefore = true;
        levelDataModel.LastVisitTime   = DateTime.Now.Ticks;

        //Debug.Log("generated objects count " + levelDataModel.GeneratedObjects.Count);
    }
Пример #2
0
    void Start()
    {
        var playerDataModel = GameManager.Instance.PlayerDataModel;

        levelDataModel = GameManager.Instance.Savables.Find(obj => obj.GetType() == typeof(LevelDataModel) && obj.name == string.Format("Level_{0}-{1}", playerDataModel.LastMapPosition.x, playerDataModel.LastMapPosition.y)) as LevelDataModel;
        var levelGenerationDataModel = GetLevelGenerationDataModel(levelDataModel.LevelType);

        if (!levelDataModel.IsVisitedBefore)
        {
            //this is new map lets generate it
            if (levelGenerationDataModel == null)
            {
                return;
            }
            CreateSideScrollMap(levelGenerationDataModel);
            SaveSideScrollMap();
        }
        else
        {
            LoadSideScrollMap(levelDataModel, levelGenerationDataModel);
            SaveSideScrollMap();
        }



        EventManager.StartListening("OnBeforeSave", OnBeforeSave);
    }
    private void OnLevelLoadedHandler(object obj)
    {
        Debug.Log("Updating loaded level");
        LevelDataModel levelDataModel = (LevelDataModel)obj;

        best.text = $"Best: {levelDataModel.GridData.Count/2}";
    }
Пример #4
0
        protected override void Init()
        {
            LevelDataModel = LevelDataModel.Instance;
            parser         = ParserFactory.Get <JsonParser>() as JsonParser;

            ParseLevel(levelAsset.text);
        }
Пример #5
0
 private void RemoveListener(LevelDataModel levelDataModel)
 {
     if (levelDataModel != null)
     {
         levelDataModel.OnLevelListUpdated -= HandleOnLevelDataListUpdated;
     }
 }
Пример #6
0
    public void ParseMidiSong(byte[] midiSong, SongDataModel songModel)
    {
        //read midi file
        var data = new MidiData();

        MidiParser.ParseNotesData(midiSong, ref data);

        LevelDataModel lv = new LevelDataModel();

        lv.noteData     = data.notesData[NoteTrack];
        lv.playbackData = data.notesData[PlaybackTrack];

        lv.playbackData.Sort((x, y) => (x.timeAppear.CompareTo(y.timeAppear)));
        lv.noteData.Sort((x, y) => (x.timeAppear.CompareTo(y.timeAppear)));

        lv.BPM                = data.beatsPerMinute;
        lv.denominator        = data.denominator;
        lv.tickPerQuarterNote = (int)data.deltaTickPerQuarterNote;

        var ticksPerTile   = songModel.tickPerTile;
        var minTickPerTile = Mathf.FloorToInt(ticksPerTile * (1 - tickTolerance));
        var maxTickPerTile = Mathf.CeilToInt(ticksPerTile * (1 + tickTolerance));

        StartCoroutine(PrepareTileData(lv, minTickPerTile, maxTickPerTile, songModel));
    }
Пример #7
0
 private void AddListener(LevelDataModel levelDataModel)
 {
     if (levelDataModel != null)
     {
         levelDataModel.OnLevelListUpdated += HandleOnLevelDataListUpdated;
     }
 }
Пример #8
0
 protected override void Start()
 {
     base.Start();
     screen = Camera.main.ScreenToWorldPoint(new Vector3(Screen.width, Screen.height));
     Debug.Log(screen);
     LevelDataModel = LevelDataModel.Instance;
     cellSize       = screen.x / LevelDataModel.BoardValue;
     Debug.Log(cellSize);
 }
Пример #9
0
    // Use this for initialization
    //void Start () {

    //}

    //// Update is called once per frame
    //void Update () {

    //}
    public override void Press(TouchCover _touchCover)
    {
        if (!isClickable)
        {
            return;
        }
        InGameUIController.Instance.gameplay.StartGame();
        isClickable = false;
        gameObject.SetActive(false);
        //EffectWhenFinish ();
        LevelDataModel level = GameManager.Instance.SessionData.currentLevel;

        Mio.Utils.AnalyticsHelper.Instance.LogSongstart(level.songData.name);
    }
Пример #10
0
    private void LoadSideScrollMap(LevelDataModel levelDataModel, LevelGenerationDataModel levelGenerationDataModel)
    {
        var mapStaticObject  = CreateStatics(levelGenerationDataModel);
        var objectsContainer = GameObject.Find("ObjectsContainer");

        // In here we are give a chance to createing harvested or destroyed game objects again.
        foreach (var probabilityDataModel in levelGenerationDataModel.ItemGenerationProbabilityDataModels)
        {
            var alreadyGeneratedItemsForThisModel = levelDataModel.GeneratedObjects.FindAll(obj => obj.Prefab.StartsWith(probabilityDataModel.BasePrefabName));
            var deltaCount = probabilityDataModel.Intensity - alreadyGeneratedItemsForThisModel.Count;
            if (deltaCount <= 0)
            {
                deltaCount = 0;
            }

            //calculating new delta count according to lastVisitTime
            var currentTime            = DateTime.Now;
            var timePastSinceLastVisit = new TimeSpan(currentTime.Ticks - levelDataModel.LastVisitTime);
            var newDeltaCount          = Math.Floor(((float)(timePastSinceLastVisit.TotalSeconds) / (float)levelGenerationDataModel.FullyGenerationTimeInSeconds) * deltaCount);
            if (newDeltaCount >= deltaCount)
            {
                newDeltaCount = deltaCount;
            }
            Debug.Log("deltacount " + deltaCount);
            Debug.Log("newdeltacount " + newDeltaCount);
            // trying to create game objects per amount of delta count
            var counter = 0;
            for (int i = 0; i < newDeltaCount; i++)
            {
                var gameObject = TryInstantiateGameObject(probabilityDataModel, levelGenerationDataModel, objectsContainer, false);
                if (gameObject != null)
                {
                    counter++;
                }
            }

            Debug.Log(counter + " " + probabilityDataModel.BasePrefabName + " is created since last visit.");
        }


        // crateing game objects those are already there
        foreach (var generatedObject in levelDataModel.GeneratedObjects)
        {
            var prefab = Resources.Load("Prefabs/" + generatedObject.Prefab, typeof(GameObject));
            if (prefab != null)
            {
                Instantiate(prefab, generatedObject.Position, Quaternion.identity, objectsContainer.transform);
            }
        }
    }
Пример #11
0
        private void UpdateMap()
        {
            LevelDataModel level     = DataModels.Level;
            float          marioRelY = DataModels.Mario.PURelative_Y;
            MapLayout      bestMap   = Config.MapAssociations.GetBestMap(
                level.Index, level.Area, level.LoadingPoint, level.MissionLayout, marioRelY);

            object mapLayoutChoice = Config.MapGui.ComboBoxLevel.SelectedItem;

            if (mapLayoutChoice is MapLayout)
            {
                bestMap = (MapLayout)mapLayoutChoice;
            }

            ChangeCurrentMap(bestMap);
        }
Пример #12
0
    void Start()
    {
        IsEnabled = true;

        sideScrollMap = GetComponent <SideScrollMap>();
        if (sideScrollMap == null)
        {
            IsEnabled = false;
            // Debug.Log("ItemSpawner: Item Spawner is not working because it could not reach the SideScrollMap.");
            return;
        }

        levelDataModel           = sideScrollMap.GetLevelDataModel();
        levelGenerationDataModel = sideScrollMap.GetLevelGenerationDataModel(levelDataModel.LevelType);
        objectsContainer         = GameObject.Find("ObjectsContainer");
    }
Пример #13
0
        private void UpdateBackground()
        {
            LevelDataModel level     = DataModels.Level;
            float          marioRelY = DataModels.Mario.PURelative_Y;
            MapLayout      bestMap   = Config.MapAssociations.GetBestMap(
                level.Index, level.Area, level.LoadingPoint, level.MissionLayout, marioRelY);

            object backgroundChoice = Config.MapGui.ComboBoxBackground.SelectedItem;

            if (backgroundChoice is BackgroundImage background)
            {
                ChangeBackground(background.Image);
            }
            else
            {
                ChangeBackground(bestMap.BackgroundImage);
            }
        }
Пример #14
0
        /// <summary>
        /// Create GUI elements for operations with level creation or loading.
        /// </summary>
        private void DisplayCreateLevelGui()
        {
            EditorGUILayout.BeginVertical(_innerContainerGuiStyle);

            EditorGUILayout.LabelField("Level Creation", EditorStyles.boldLabel);

            _levelName = EditorGUILayout.TextField("Level Name", _levelName);

            EditorGUILayout.LabelField("How much tiles will have level with and height.", EditorStyles.miniLabel);
            _levelSize = EditorGUILayout.Vector2IntField("Level Size: ", _levelSize);

            EditorGUILayout.Space();

            if (GUILayout.Button("Create New Level", GUILayout.ExpandWidth(true), GUILayout.Height(PRIMARY_BUTTON_HEIGHT)))
            {
                _currentLevelDataModel = new LevelDataModel(_levelSize.x, _levelSize.y)
                {
                    levelName = _levelName
                };
            }

            EditorGUILayout.Space();

            EditorGUILayout.LabelField("Level Loading", EditorStyles.boldLabel);

            _savedLevelJSON = (TextAsset)EditorGUILayout.ObjectField("JSON Level:", _savedLevelJSON, typeof(TextAsset), false);

            if (GUILayout.Button("Load Level", GUILayout.ExpandWidth(true), GUILayout.Height(PRIMARY_BUTTON_HEIGHT)))
            {
                var deserializedData = JsonUtility.FromJson <LevelDataModel>(_savedLevelJSON.text);
                _currentLevelDataModel = deserializedData;
                _levelSize             = _currentLevelDataModel.GetLevelSize();
                _levelName             = _currentLevelDataModel.levelName;
            }

            EditorGUILayout.Space();

            if (_currentLevelDataModel == null)
            {
                EditorGUILayout.HelpBox("Click at the button \"Create New Level\" to create new Level Data.\nOr \"Load Level\" to load levels JSON config.", MessageType.Warning);
            }

            EditorGUILayout.EndVertical();
        }
Пример #15
0
    IEnumerator Load()
    {
        isLoading = true;
        string path =
#if UNITY_ANDROID && !UNITY_EDITOR
            Application.streamingAssetsPath + "/SecondWeaponsdata.txt";
#elif UNITY_IPHONE && !UNITY_EDITOR
            "file://" + Application.streamingAssetsPath + "/SecondWeaponsdata.txt";
#elif UNITY_STANDLONE_WIN || UNITY_EDITOR
            "file://" + Application.streamingAssetsPath + "/SecondWeaponsdata.txt";
#else
            string.Empty;
#endif
        //string path = Application.streamingAssetsPath + "/SecondWeaponsdata.txt";
        WWW www = new WWW(path);
        yield return(www);

        if (www.isDone && string.IsNullOrEmpty(www.error))
        {
            List <WeaponModel> weapons = JsonConvert.DeserializeObject <List <WeaponModel> >(www.text);
            for (int i = 0; i < weapons.Count; i++)
            {
                AllSecondWeapons.Add(weapons[i].Id, weapons[i]);
            }
        }
        else
        {
            Debug.Log(www.isDone + www.error);
        }
        //LoadDataFromLocal();
        LevelData = new LevelDataModel();
        Test();
        isLoading = false;

        var p = ObjectPool.GetInstance().GetObj("Player");
        CurrentPlayer = p.GetComponent <Player>();
    }
    private void OnLevelDataLoadedHandler(object obj)
    {
        LevelDataModel levelData = (LevelDataModel)obj;

        _totalLinesToBeCompleted = levelData.GridData.Count / 2;
    }
Пример #17
0
        protected override void Init()
        {
            LevelDataModel = LevelDataModel.Instance;

            StartGame();
        }
Пример #18
0
    IEnumerator PrepareTileData(LevelDataModel lv, int minTickPerTile, int maxTickPerTile, SongDataModel songDataModel, Action <float> onProgress = null, Action onComplete = null, Action <string> onError = null)
    {
        //listNoteData = noteData;
        var listTilesData = new List <TileData>(1000);
        var noteData      = lv.noteData;
        var playbackData  = lv.playbackData;
        //float BPM = lv.BPM;

        //we know that note data will always less or equals to playback data
        //so we will start by traverse through list note data
        NoteData currentNote, nextNote;
        int      currentNoteIndex;
        //int loopCount = 0;
        //int maxLoop = 10;
        float lastReleaseThreadTime = Time.realtimeSinceStartup;
        float maxTimeLockThread     = 1;
        //this variable is used to reduce number of cast operation
        float noteDataCount = noteData.Count;

        //for each note in view list
        for (int i = 0; i < noteData.Count; i++)
        {
            currentNoteIndex = i;

            //set up range for checking song data
            currentNote = noteData[currentNoteIndex];
            nextNote    = null;

            //don't hog up all the CPU, save some for rendering task
            if (lastReleaseThreadTime + maxTimeLockThread >= Time.realtimeSinceStartup)
            {
                lastReleaseThreadTime = Time.realtimeSinceStartup;
                Helpers.CallbackWithValue(onProgress, ((i / noteDataCount)));
                yield return(null);
            }

            //try to get next view note (must be different at timestamp with current note)
            while (++i < noteData.Count)
            {
                //++i;
                nextNote = noteData[i];
                //stop the loop right when next note is found
                if (nextNote.timeAppear != currentNote.timeAppear)
                {
                    //decrease i so that at the end of the loop, it can be increased gracefully
                    --i;
                    break;
                }
            }

            if (i >= noteData.Count)
            {
                i = noteData.Count - 1;
            }

            //how many notes existed at the same timestamp
            int numConcurrentNotes = i - currentNoteIndex + 1;
            //print("Num concurrent notes" + numConcurrentNotes + " at " + i);

            //for each note, create a tile
            for (int j = currentNoteIndex; j <= i; j++)
            {
                //print(string.Format("i {0}, j {1}, Concurrent notes: {2}", i, j, numConcurrentNotes));
                //print(string.Format("Current note: {0}, timestamp {1}; Next note; {2}, timestamp: {3}", currentNote.nodeID, currentNote.timeAppear, nextNote.nodeID, nextNote.timeAppear));
                //with each note data, there is a tile
                TileData tileData = new TileData();

                tileData.type             = TileType.Normal;
                tileData.notes            = new List <NoteData>();
                tileData.startTime        = currentNote.timeAppear;
                tileData.startTimeInTicks = currentNote.tickAppear;
                tileData.soundDelay       = 0;

                //fetch midi data for tile
                //float endTime = ((nextNote == null) ? currentNote.timeAppear + currentNote.duration : nextNote.timeAppear);
                //AddConcurrentMidiData(
                //        ref tileData,
                //        playbackData,
                //        currentNote.timeAppear,
                //        endTime,
                //        currentNoteIndex
                //        );
                int startTime, endTime;
                startTime = endTime = -1;
                switch (numConcurrentNotes)
                {
                //only 1 tile
                case 1:
                    tileData.subType = TileType.Normal;
                    startTime        = currentNote.tickAppear;
                    endTime          = ((nextNote == null) ? currentNote.tickAppear + currentNote.durationInTick : nextNote.tickAppear);
                    break;

                //dual tile
                case 2:
                    tileData.subType = TileType.Dual;
                    if (j % 2 == 0)
                    {
                        startTime = currentNote.tickAppear;
                        endTime   = currentNote.tickAppear + (int)(currentNote.durationInTick * 0.5f);
                    }
                    else
                    {
                        tileData.soundDelay = currentNote.duration * 0.5f;
                        startTime           = currentNote.tickAppear + (int)(currentNote.durationInTick * 0.5f);
                        endTime             = ((nextNote == null) ? currentNote.tickAppear + currentNote.durationInTick : nextNote.tickAppear);
                    }

                    break;

                //big tile
                case 3:
                    tileData.subType = TileType.Big;
                    if (listTilesData.Count > 1)
                    {
                        TileData lastTileData = listTilesData[listTilesData.Count - 1];
                        if (lastTileData.startTimeInTicks != currentNote.tickAppear)
                        {
                            startTime = currentNote.tickAppear;
                            endTime   = ((nextNote == null) ? currentNote.tickAppear + currentNote.durationInTick : nextNote.tickAppear);
                        }
                        else
                        {
                            startTime = endTime = -1;
                        }
                    }
                    break;
                }


                if (startTime >= 0 && endTime >= 0)
                {
                    //print("Adding note data into tile " + j);
                    AddConcurrentMidiDataByTick(
                        ref tileData,
                        playbackData,
                        startTime,
                        endTime,
                        j
                        );

                    tileData.durationInTicks = currentNote.durationInTick;
                    tileData.duration        = currentNote.duration;
                    //Debug.Log(string.Format("Duration of note {0}, ID: {2} is {1}", i, tileData.duration, currentNote.nodeID));

                    //if a tile has duration belong to the normal tile's range
                    if (minTickPerTile <= tileData.durationInTicks && tileData.durationInTicks <= maxTickPerTile)
                    {
                        //set it as so
                        tileData.type = TileType.Normal;
                        listTilesData.Add(tileData);
                    }
                    else
                    {
                        //else, it is either a long note...
                        if (maxTickPerTile < tileData.durationInTicks)
                        {
                            tileData.type = TileType.LongNote;
                            listTilesData.Add(tileData);
                        }
                        else
                        {
                            //... or just an error note, f**k that shit
                            //Debug.LogWarning(string.Format("A tile data has duration of {0}, which is less than a normal tile ({1}), please check. It has Index of {2}, midi note {3}", tileData.durationInTicks, currentLevelData.songData.tickPerTile, currentNoteIndex, currentNote.nodeID));
                        }
                    }
                }
            }
        }

        //Debug.Log("Prepare tile data completed");
        //easy, start render in the next frame
        SongTileData b_data = new SongTileData();

        b_data.BPM                = lv.BPM;
        b_data.denominator        = lv.denominator;
        b_data.tickPerQuarterNote = lv.tickPerQuarterNote;
        b_data.titledata          = listTilesData;
        b_data.songDataModel      = songDataModel;
        SaveTileData(b_data, "songs/parsed/" + b_data.songDataModel.storeID);
        JobCompleted();
        yield return(null);
        //Helpers.Callback(onComplete);
    }
Пример #19
0
 private void Start()
 {
     LevelDataModel = LevelDataModel.Instance;
 }