Exemple #1
0
 void OnMouseUp()
 {
     lineRenderer.enabled = false;
     if (GeneralManager.generalManager.turns > 0)
     {
         dragging = false;
         Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);
         if (Physics.Raycast(ray, out RaycastHit hit, Mathf.Infinity, 9))
         {
             FloorControl f = hit.transform.GetComponent <FloorControl>();
             if (f != null && f.allowMovement)
             {
                 transform.position  = hit.transform.position;
                 f.occupied          = true;
                 savedFloor.occupied = false;
                 floorManagement.PutFloorsToRed();
                 GeneralManager.generalManager.Turns--;
             }
             else
             {
                 transform.position = originalPosition;
                 floorManagement.PutFloorsToRed();
             }
         }
         else
         {
             transform.position = originalPosition;
         }
     }
Exemple #2
0
    void BonusFloorGenerate()
    {
        // 清除所有任務設定
        if (!manager.isBattle)
        {
            for (int i = 0; i < mMissionImage.Length; i++)
            {
                mMissionImage[i].enabled = false;
            }
            for (int i = 0; i < mMissionText.Length; i++)
            {
                mMissionText[i].text = "";
            }
            mMissionPuzzleImage.enabled = false;

            missions.Clear();
        }

        // 動態生成獎勵地板
        mFloorInstance [mUnuseFloorIndex] = Instantiate(mBonusFloor) as GameObject;

        // 調整獎勵地板的Y軸座標
        mFloorInstance [mUnuseFloorIndex].transform.position
            = new Vector3(mFloorInstance [mUnuseFloorIndex].transform.position.x,
                          mBonusFloor.transform.position.y - mCountOfFloor * mHeight,
                          mFloorInstance [mUnuseFloorIndex].transform.position.z);

        floorControl = mFloorInstance [mUnuseFloorIndex].GetComponent <FloorControl>();
        floorControl.setBonusItems(new GameObject[] { mItemDiamond, mItemDiamondBig });

        // 更新參數
        mCountOfFloor++;
        mUnuseFloorIndex = (mUnuseFloorIndex == 0) ? 1 : 0;
        mPrevFloorIndex  = mCurrFloorIndex;
    }
        private void RemoveFloor(FloorControl floorControl)
        {
            ProjectPlanViewModel vm = DataContext as ProjectPlanViewModel;

            vm.ProjectFile.FloorPlans.Remove(floorControl.FloorAssignment);
            grid.Children.Remove(floorControl);
            vm.SelectedFloorAssignment = null;
            selectedFloorControl       = null;
        }
        private void AddFloors()
        {
            ProjectPlanViewModel vm = DataContext as ProjectPlanViewModel;

            foreach (FloorAssignment floorAssignment in vm.ProjectFile.FloorPlans)
            {
                FloorControl floorControl = new FloorControl(floorAssignment, vm.ProjectFile, planOffset);
                GenerateFloorControl(floorControl);
            }
        }
        private void GenerateFloorControl(FloorControl floorControl)
        {
            floorControl.Tag = tagIndex;
            tagIndex++;

            floorControl.MouseLeftButtonDown += FloorControl_MouseLeftButtonDown;

            Canvas.SetLeft(floorControl, floorControl.FloorAssignment.X);
            Canvas.SetTop(floorControl, floorControl.FloorAssignment.Y);
            grid.Children.Add(floorControl);
        }
        private void FloorPlan_PreviewMouseDoubleClick(object sender, MouseButtonEventArgs e)
        {
            if (sender is DataGridRow clickedRow && clickedRow.DataContext is FloorPlan floorPlan)
            {
                ProjectPlanViewModel vm = DataContext as ProjectPlanViewModel;

                FloorControl floorControl = new FloorControl(floorPlan, vm.ProjectFile, planOffset);
                GenerateFloorControl(floorControl);

                vm.ProjectFile.FloorPlans.Add(floorControl.FloorAssignment);
            }
        }
        private void grid_MouseLeftButtonDown(object sender, MouseButtonEventArgs e)
        {
            if (floorControlClicked)
            {
                floorControlClicked = false;
                return;
            }
            if (selectedFloorControl != null)
            {
                selectedFloorControl.Background = Brushes.Transparent;
            }
            ProjectPlanViewModel vm = DataContext as ProjectPlanViewModel;

            vm.SelectedFloorAssignment = null;
            selectedFloorControl       = null;
        }
Exemple #8
0
 void OnMouseDown()
 {
     if (GeneralManager.generalManager.turns > 0)
     {
         foreach (FloorControl f in floorManagement.floorControls)
         {
             if (f.transform.position == transform.position)
             {
                 savedFloor = f;
                 break;
             }
         }
         lineRenderer.enabled = true; // turn on the line renderer
         originalPosition     = transform.position;
         //distance = Vector3.Distance(transform.position, Camera.main.transform.position);
         dragging = true;
     }
 }
Exemple #9
0
        /// <summary>
        ///
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void FloorControl_Paint(object sender, PaintEventArgs e)
        {
            if (SpriteBatch == null)
            {
                return;
            }

            FloorControl.MakeCurrent();

            Display.ClearBuffers();

            if (Maze != null)
            {
                SpriteBatch.Begin();
                //Maze.Draw(SpriteBatch, PreviewLoc);
                SpriteBatch.End();
            }

            FloorControl.SwapBuffers();
        }
        private void FloorControl_MouseLeftButtonDown(object sender, MouseButtonEventArgs e)
        {
            floorControlClicked = true;
            ProjectPlanViewModel vm = DataContext as ProjectPlanViewModel;

            if (selectedFloorControl != null)
            {
                selectedFloorControl.Background = Brushes.Transparent;
            }
            FloorControl floorControl = sender as FloorControl;

            FloorAssignment roomAssignment = vm.ProjectFile.FloorPlans.FirstOrDefault(x => x.Control.Tag == floorControl.Tag);

            vm.SelectedFloorAssignment = roomAssignment;

            floorControl.Background = new SolidColorBrush(Color.FromArgb(64, 255, 128, 0));
            selectedFloorControl    = floorControl;
            selectedFloorControl.Focus();
            Keyboard.Focus(selectedFloorControl);
            vm.SelectedTabIndex = 1;
        }
Exemple #11
0
    void FloorGenerate()
    {
        // 清除所有任務設定
        if (!manager.isBattle)
        {
            for (int i = 0; i < mMissionImage.Length; i++)
            {
                mMissionImage[i].enabled = false;
            }
            for (int i = 0; i < mMissionText.Length; i++)
            {
                mMissionText[i].text = "";
            }
            mMissionPuzzleImage.enabled = false;

            missions.Clear();
        }

        // 取得下一層地板,不會與上一層相同
        mCurrFloorIndex = manager.getNextFloorIdx(mPrevFloorIndex, mFloor.Length);
        mFloorInstance [mUnuseFloorIndex] = Instantiate(mFloor [mCurrFloorIndex]) as GameObject;

        // 調整新地板的Y軸座標
        mFloorInstance [mUnuseFloorIndex].transform.position
            = new Vector3(mFloorInstance [mUnuseFloorIndex].transform.position.x,
                          mFloor [mCurrFloorIndex].transform.position.y - mCountOfFloor * mHeight,
                          mFloorInstance [mUnuseFloorIndex].transform.position.z);


        floorControl = mFloorInstance [mUnuseFloorIndex].GetComponent <FloorControl>();
        if (manager.isBattle)
        {
            floorControl.setFixedItems(mItemKey, 1);
        }
        else
        {
            int  num    = mCountOfFloor / 2;
            bool puzzle = false;
            if (num > 5)
            {
                puzzle = (Random.Range(0, 3) == 0?true:false);
                num    = 3;
            }
            else if (num > 3)
            {
                num = 3;
            }

            if (puzzle)
            {
                int    select = Random.Range(0, missionPuzzleType.Length);
                string type   = missionPuzzleType[select];
                missions.Add(new MissionPuzzle(type, mMissionPuzzleImage, missionPuzzleMap[type]));
                mMissionPuzzleImage.enabled = true;

                floorControl.setFixedItems(itemMap[type], missionPuzzleMap[type].Length - 1);
            }
            else
            {
                HashSet <string> tmp = new HashSet <string>();
                for (int i = 0; i < num; i++)
                {
                    int select = Random.Range(0, missionSet.Count);
                    while (tmp.Contains(missionSet[select]))
                    {
                        select = Random.Range(0, missionSet.Count);
                    }
                    tmp.Add(missionSet[select]);

                    string type = missionSet[select];
                    if (missionItemMap.ContainsKey(type))
                    {
                        int need = Random.Range(1, 3);
                        missions.Add(new MissionItem(type, need, mMissionText[i]));
                        mMissionImage[i].enabled = true;
                        mMissionImage[i].sprite  = missionItemMap[type];

                        floorControl.setFixedItems(itemMap[type], need);
                    }
                    else if (missionMoveMap.ContainsKey(type))
                    {
                        int need = Random.Range(2, 5);
                        missions.Add(new MissionItem(type, need, mMissionText[i]));
                        mMissionImage[i].enabled = true;
                        mMissionImage[i].sprite  = missionMoveMap[type];
                    }
                }
            }

            floorControl.setItems(new GameObject[] { mItmeTime, mItemTimeBig, mItemDiamond, mItemBattery });
        }

        // 更新參數
        mCountOfFloor++;
        mUnuseFloorIndex = (mUnuseFloorIndex == 0) ? 1 : 0;
        mPrevFloorIndex  = mCurrFloorIndex;
    }
Exemple #12
0
 /// <summary>
 ///
 /// </summary>
 /// <param name="sender"></param>
 /// <param name="e"></param>
 private void FloorControl_Load(object sender, EventArgs e)
 {
     FloorControl.MakeCurrent();
     Display.Init();
 }
Exemple #13
0
    void    Update()
    {
        FloorControl room = this.rooms[this.start_model_index];

        // 最后面的模型到达摄像机后面时,使其往里移动
        //
        if (room.transform.position.z + MODEL_LENGTH < this.main_camera.transform.position.z)
        {
            // 使最后的模型往里移动

            Vector3 new_position = room.transform.position;

            new_position.z += MODEL_LENGTH * MODEL_NUM;

            room.transform.position = new_position;

            //

            this.rooms[(this.start_model_index + 0) % MODEL_NUM].attachShouji(null);

            // 增加“位于最前方的模型的索引”
            //
            this.start_model_index = (this.start_model_index + 1) % MODEL_NUM;


            // 最前面的房间 → 将窗户附加在其上,设置为打开的状态

            if (this.scene_control.step.get_current() == SceneControl.STEP.GAME)
            {
                this.rooms[(this.start_model_index + 0) % MODEL_NUM].attachShouji(this.shoji_control);
                this.rooms[(this.start_model_index + 0) % MODEL_NUM].setOpen();
            }
            else
            {
                this.shoji_control.gameObject.SetActive(false);
            }

            // 第二个房间 → 开始打开拉门

            this.rooms[(this.start_model_index + 1) % MODEL_NUM].beginOpen();

            // 第三个房间 → 拉门的状态为关闭

            this.rooms[(this.start_model_index + 2) % MODEL_NUM].setClose();

            // 将多次穿过的格子眼设置为铁板

            foreach (var paper_control in this.shoji_control.papers)
            {
                if (this.level_control.getChangeSteelCount() > 0)
                {
                    if (paper_control.through_count >= this.level_control.getChangeSteelCount())
                    {
                        paper_control.beginSteel();
                    }
                }
            }

            //

            this.room_count++;
            this.is_closed = false;
        }

        // 摄像机靠近后,关闭
        //
        // 虽然事实上应该看到玩家,但由于重复处理房间模型时看到摄像机的关系,这里设置为摄像机

        float close_distance = MODEL_LENGTH - this.level_control.getCloseDistance();

        if (room.transform.position.z + close_distance < this.main_camera.transform.position.z)
        {
            do
            {
                if (this.is_closed)
                {
                    break;
                }

                // 开始后设置为不关闭
                if (this.room_count < 1)
                {
                    break;
                }

                // 关闭窗户

                if (this.scene_control.step.get_current() == SceneControl.STEP.GAME)
                {
                    FloorControl.CLOSING_PATTERN_TYPE type;
                    bool is_flip;
                    FloorControl.ClosingPatternParam param;

                    this.level_control.getClosingPattern(out type, out is_flip, out param);

                    this.rooms[(this.start_model_index + 0) % MODEL_NUM].setClosingPatternType(type, is_flip, param);
                    this.rooms[(this.start_model_index + 0) % MODEL_NUM].beginCloseShoji();
                }

                this.is_closed = true;
            } while(false);
        }

        #if false
        // 调试功能
        // 通过全键盘的数字键,查看窗户出现的模式

        for (int i = (int)KeyCode.Alpha1; i <= (int)KeyCode.Alpha9; i++)
        {
            if (Input.GetKeyDown((KeyCode)i))
            {
                FloorControl.CLOSING_PATTERN_TYPE type = (FloorControl.CLOSING_PATTERN_TYPE)(i - (int)KeyCode.Alpha1);

                bool is_flip = Input.GetKey(KeyCode.RightShift);

                this.rooms[(this.start_model_index + 0) % MODEL_NUM].attachShouji(this.shoji_control);
                this.rooms[(this.start_model_index + 0) % MODEL_NUM].setClosingPatternType(type, is_flip);
                this.rooms[(this.start_model_index + 0) % MODEL_NUM].beginCloseShoji();
            }
        }
        #endif
    }
Exemple #14
0
    void    Update()
    {
        FloorControl room = this.rooms[this.start_model_index];

        // 一番後ろのモデルがカメラの後ろに来たら、奥に移動させる.
        //
        if (room.transform.position.z + MODEL_LENGTH < this.main_camera.transform.position.z)
        {
            // 一番後ろのモデルを奥に移動させる.

            Vector3 new_position = room.transform.position;

            new_position.z += MODEL_LENGTH * MODEL_NUM;

            room.transform.position = new_position;

            //

            this.rooms[(this.start_model_index + 0) % MODEL_NUM].attachShouji(null);

            // 「一番手前にあるモデルのインデックス」を進める.
            //
            this.start_model_index = (this.start_model_index + 1) % MODEL_NUM;


            // 一番手前の部屋 → 障子をアタッチして、開けた状態にしておく.

            if (this.scene_control.step.get_current() == SceneControl.STEP.GAME)
            {
                this.rooms[(this.start_model_index + 0) % MODEL_NUM].attachShouji(this.shoji_control);
                this.rooms[(this.start_model_index + 0) % MODEL_NUM].setOpen();
            }
            else
            {
                this.shoji_control.gameObject.SetActive(false);
            }

            // 二番目の部屋 → ふすまを開き始める.

            this.rooms[(this.start_model_index + 1) % MODEL_NUM].beginOpen();

            // 三番目番目の部屋 → ふすまが閉めきった状態にする.

            this.rooms[(this.start_model_index + 2) % MODEL_NUM].setClose();

            // 何度も通過した穴を鉄板にする.

            foreach (var paper_control in this.shoji_control.papers)
            {
                if (this.level_control.getChangeSteelCount() > 0)
                {
                    if (paper_control.through_count >= this.level_control.getChangeSteelCount())
                    {
                        paper_control.beginSteel();
                    }
                }
            }

            //

            this.room_count++;
            this.is_closed = false;
        }

        // カメラが近づいたら、閉める.
        //
        // 本当はプレイヤーを見るべきだけど、部屋モデルのリピート処理がカメラを.
        // みている関係上、こちらもカメラを見る.

        float close_distance = MODEL_LENGTH - this.level_control.getCloseDistance();

        if (room.transform.position.z + close_distance < this.main_camera.transform.position.z)
        {
            do
            {
                if (this.is_closed)
                {
                    break;
                }

                // スタート直後は閉まらないようにする.
                if (this.room_count < 1)
                {
                    break;
                }

                // 障子を閉める.

                if (this.scene_control.step.get_current() == SceneControl.STEP.GAME)
                {
                    FloorControl.CLOSING_PATTERN_TYPE type;
                    bool is_flip;
                    FloorControl.ClosingPatternParam param;

                    this.level_control.getClosingPattern(out type, out is_flip, out param);

                    this.rooms[(this.start_model_index + 0) % MODEL_NUM].setClosingPatternType(type, is_flip, param);
                    this.rooms[(this.start_model_index + 0) % MODEL_NUM].beginCloseShoji();
                }

                this.is_closed = true;
            } while(false);
        }

        #if false
        // デバッグ機能.
        // フルキーの数字キーで、障子の登場パターンを再生する.

        for (int i = (int)KeyCode.Alpha1; i <= (int)KeyCode.Alpha9; i++)
        {
            if (Input.GetKeyDown((KeyCode)i))
            {
                FloorControl.CLOSING_PATTERN_TYPE type = (FloorControl.CLOSING_PATTERN_TYPE)(i - (int)KeyCode.Alpha1);

                bool is_flip = Input.GetKey(KeyCode.RightShift);

                this.rooms[(this.start_model_index + 0) % MODEL_NUM].attachShouji(this.shoji_control);
                this.rooms[(this.start_model_index + 0) % MODEL_NUM].setClosingPatternType(type, is_flip);
                this.rooms[(this.start_model_index + 0) % MODEL_NUM].beginCloseShoji();
            }
        }
        #endif
    }
Exemple #15
0
        private void SavePlanAsImage(string imagePath)
        {
            Canvas canvas = new Canvas()
            {
                Width      = projectFile.DocumentSize.Width,
                Height     = projectFile.DocumentSize.Height,
                Background = new DrawingBrush()
                {
                    TileMode      = TileMode.Tile,
                    Viewport      = new Rect(1.5, 1.5, 50, 50),
                    Viewbox       = new Rect(0, 0, 49, 49),
                    ViewboxUnits  = BrushMappingMode.Absolute,
                    ViewportUnits = BrushMappingMode.Absolute,
                    Drawing       = new GeometryDrawing()
                    {
                        Geometry = new RectangleGeometry(new Rect(0, 0, 50, 50)),
                        Pen      = new Pen(Brushes.Black, 2)
                        {
                            DashStyle = new DashStyle(new List <double>()
                            {
                                2, 4
                            }, 0)
                        }
                    }
                }
            };

            foreach (FloorAssignment floorAssignment in ProjectFile.FloorPlans)
            {
                FloorControl floorControl = new FloorControl(floorAssignment, projectFile, 0, false)
                {
                    BorderThickness = new Thickness(0)
                };

                Canvas.SetLeft(floorControl, floorControl.FloorAssignment.X + 2);
                Canvas.SetTop(floorControl, floorControl.FloorAssignment.Y + 2);

                canvas.Children.Add(floorControl);
            }

            TextBlock dungeonTitle = new TextBlock()
            {
                Text          = projectFile.Name,
                FontSize      = 64,
                Padding       = new Thickness(8),
                Width         = canvas.Width,
                TextAlignment = TextAlignment.Center,
                Foreground    = Brushes.Black,
                FontFamily    = new FontFamily(new Uri("pack://application:,,,/DungeonMapEditor;component/Resources/Fonts/"), "./#Ace Records")
            };

            canvas.Children.Add(dungeonTitle);

            TextBlock footNote = new TextBlock()
            {
                Text       = "1 tile = 5 ft.",
                Foreground = Brushes.Black,
                FontSize   = 32,
                Background = Brushes.White,
                Padding    = new Thickness(8, 4, 8, 4)
            };

            Canvas.SetBottom(footNote, 0);
            canvas.Children.Add(footNote);

            Helper.ExportToPng(imagePath, canvas, Brushes.White);
        }