Heat oil in a large pot on medium heat.
Once the oil is hot, add all the whole spices (bay leaves, cardamom, cinnamon, star anise, peppercorn. Let it cook for 1-2 mins until the spices start giving out a fragrant aroma.
Add the onions to the spices, and set the heat to low-medium. Sweat the onions for about 20 mins on low-medium heat until they become translucent and then start caramelizing into a golden color. Keep stirring the onions every few minutes during this time.
Once the onions start getting golden, add the ginger and garlic and cook for another 5 mins while continuing to stir.
Add the remaining of the dry spices (tikka masala, garam masala, turmeric, cumin powder, coriander powder and red chili powder). Add a few drops of water if the spices are sticking to the bottom of the pot.
Add 4 tablespoon of butter, 1 tablespoon at a time. Making sure the spices and butter mix well together.
Add the tomato puree and stir it in well with the onion-spices-butter mixture.
Cover the pot with a lid, decrease the heat to low and let it cook for 20-25 mins. The longer you let it cook at this step, the deeper the flavor will develop. Cooking the tomato puree for long also helps to remove the tangy taste of the tomatoes.
Add 1 tsp of sugar to balance the tanginess from the tomatoes.
Add the remaining 2 tbsp of butter and heavy cream at this point. Add the paneer and kasuri methi to the gravy. Mix well, season with salt to taste.
Serve with roti/ paratha/ rice.