Exemple #1
0
        public void move(gridCoordinate.direction dir, Floor fl)
        {
            int MonsterID = -1;
            Doodad target_doodad = null;
            bool opened_door = false;
            gridCoordinate test_coord = new gridCoordinate(my_grid_coord);
            test_coord.shift_direction(dir);

            if (is_spot_free(fl, test_coord))
            {
                my_grid_coord = test_coord;
                reset_my_drawing_position();
            }
            else
            {
                int DoodadID = -1;
                //Check for monsters / doodads first.
                fl.is_monster_here(test_coord, out MonsterID);
                if (fl.is_impassible_doodad_here(test_coord, out DoodadID))
                    target_doodad = fl.Doodad_by_index(DoodadID);
                //Check to see if there's a door there. If there is, attempt to open it.
                fl.open_door_here(test_coord, out opened_door);
            }

            if (MonsterID != -1)
                melee_attack(fl, my_grid_coord, test_coord);

            if (target_doodad != null)
            {
                switch (target_doodad.get_my_doodad_type())
                {
                    case Doodad.Doodad_Type.Door:
                        fl.open_door_here(test_coord, out opened_door);
                        if (!opened_door)
                            melee_attack(fl, my_grid_coord, test_coord);
                        break;
                    case Doodad.Doodad_Type.TreasureBox:
                        if (!target_doodad.is_chest_open())
                            target_doodad.open_chest(fl);
                        else
                            if (target_doodad.chest_contains_stuff())
                                target_doodad.loot_chest(fl, this);
                        break;
                    default:
                        melee_attack(fl, my_grid_coord, test_coord);
                        break;
                }
            }
            //after moving, loot the current tile, and set sound / smell values.
            loot(fl);
            total_sound = my_sound_value();
            total_scent = my_scent_value();
        }