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(); }