Sacrafice::BurntOffering()
{
   /* Information taken from the following sources:
    * Leviticus 1:1-17
    * Leviticus 6:8-13
    */
   Worshipper->bring(Animal);
   if (isMale(Animal) && withoutDefect(Animal)) { // Does the bird have to be male?
      if (isBull(Animal)) {
         Worshipper->layHandOn(Animal->Head);
         Worshipper->slaughter(Animal);
         Priest->sprinkleBloodOn(BurntAlter->Sides);
         Worshipper->skin(Animal);
         Worshipper->cutIntoPieces(Animal);
         Priest->placeOn(BurntAlter, Animal->Pieces);
         Priest->placeOn(BurntAlter, Animal->Head);
         Priest->placeOn(BurntAlter, Animal->Fat);
      } else if (isGoat(Animal)) {
         Worshipper->layHandOn(Animal->Head);
         Worshipper->slaughter(Animal);
         Priest->sprinkleBloodOn(BurntAlter->Sides);
         Worshipper->skin(Animal);
         Worshipper->cutIntoPieces(Animal);
         Priest->placeOn(BurntAlter, Animal->Pieces);
         Priest->placeOn(BurntAlter, Animal->Head);
         Priest->placeOn(BurntAlter, Animal->Fat);
      } else if (isPigeon(Animal) or isDove(Animal)) {
         Worshipper->layHandOn(Animal->Head);
         Priest->wringOff(Animal->Head);
         Priest->drainBloodOn(BurntAlter->Side);
         Priest->removeCropAndContentsOf(Animal);
         Priest->throwCropAndContentsTo(BurntAlter->EastSide);
         Priest->tearOpen(Animal);
         Priest->placeOn(BurntAlter, Animal);
      }
   }

   while (Priest->waitTillNextMorning)
      Priest->keepFireBurningOn(BurntAlter);

   Priest->putOn(LinenGarments);
   Priest->removeAshes(BurntAlter);
   Priest->placeAshes(BurntAlter->Side);
   Priest->changeGarments();
   Priest->carry(Ashes, CeremoniallyCleanPlaceOutsideOfCamp);
   while (true)
      Priest->keepFireBurningOn(BurntAlter);
}

Sacrafice::GrainOffering()
{
   /* Information taken from the following sources:
    * Leviticus 2:1-16
    * Leviticus 6:14-23
    */
   switch(Offering->type) {
      case UNCOOKED_FLOUR:
         Worshipper->bring(FineFlour);
         Worshipper->bring(Oil);
         Worshipper->bring(Frankincense);
         MemorialPortion = Priest->mix(FineFlour.portion, Oil, Frankincense);
         PriestlyPortion = FineFlour;
         break;
      case BAKED_CAKE:
         Worshipper->bring(FineFlour);
         Worshipper->bring(Oil);
         Worshipper->bring(Frankincense);
         Cake = Worshipper->mix(FineFlour, Oil);
         Worshipper->bake(Cake);
         MemorialPortion = Cake.portion + Frankincense; // Does incense need to be added
         PriestlyPortion = Cake;
         break;
      case BAKED_WAFER:
         Worshipper->bring(FineFlour);
         Worshipper->bring(Oil);
         Worshipper->bring(Frankincense);
         Wafer = Worshipper->mix(FineFlour, Oil);
         Worshipper->bake(Wafer);
         Worshipper->spread(Oil, Wafer);
         MemorialPortion = Wafer.portion + Frankincense; // Does incense need to be added
         PriestlyPortion = Wafer;
         break;
      case GRIDDLE_BREAD:
         Worshipper->bring(FineFlour);
         Worshipper->bring(Oil);
         Worshipper->bring(Frankincense);
         GriddleCake = Worshipper->mix(FineFlour, Oil);
         Worshipper->bakeOnGriddle(GriddleCake);
         Worshipper->crumble(GriddleCake);
         Worshipper->pour(Oil, GriddleCake);
         MemorialPortion = GriddleCake.portion + Frankincense; // Does incense need to be added
         PriestlyPortion = GriddleCake;
         break;
      case PAN_BREAD:
         Worshipper->bring(FineFlour);
         Worshipper->bring(Oil);
         Worshipper->bring(Frankincense);
         GriddleCake = Worshipper->mix(FineFlour, Oil);
         Worshipper->bakeInPan(PanCake);
         MemorialPortion = PanCake.portion + Frankincense; // Does incense need to be added
         PriestlyPortion = PanCake;
         break;
      case UNCOOKED_CRUSHED_GRAIN:
         Worshipper->bring(CrushedGrain);
         Worshipper->bring(Oil);
         Worshipper->bring(Frankincense);
         MemorialPortion = Priest->mix(CrushedGrain.portion, Oil, Frankincense);
         PriestlyPortion = CrushedGrain;
         break;
   }

   if (seasonedWithSalt(MemorialPortion)
         and noHoney(MemorialPortion)
         and noYeast(MemorialPortion)) {
      Priest->burn(MemorialPortion, BurntAlter);
      Priest->keep(PriestlyPortion);
   }
}

Sacrafice::FellowshipOffering()
{
   /* Information taken from the following sources:
    * Leviticus 3:1-17
    * Leviticus 7:11-21
    * Leviticus 7:28-38
    */
   Worshipper->bring(Animal); // Bull, Cow, Lamb, Goat
   if (withoutDefect(Animal)) {
      Worshipper->layHandOn(Animal->Head);
      Worshipper->slaughter(Animal);
      Priest->sprinkleBloodOn(BurntAlter->Sides);
      Priest->burnOn(BurntAlter, Animal->Fat);
      Priest->burnOn(BurntAlter, Animal->Kidneys);
      Priest->burnOn(BurntAlter, Animal->LiverLobe);

      switch(Offering->type) {
         case THANKSGIVING: // Eph 2:13
            Cakes += Worshipper->makeCakes(Cake - Yeast + Oil); // 1 Cor 5:6-8
            Cakes += Worshipper->makeCakes(Wafer - Yeast + Oil);
            Cakes += Worshipper->makeCakes(FineFlour + Oil);

            /* Don't understand the purpose of leaven in the offering */
            Cakes += Worshipper->makeCakes(Cake + Yeast); // Matt 13:33 / Amos 4:5

            Priest->getsOneOfEach(Cakes);
            Priest->gets(Animal->Breast);
            Priest->gets(Animal->RightThigh);
            Priest->waveOffering(Animal->Breast);
            Priest->waveOffering(Animal->RightThigh);

            switch(Offering->eatingTime) {
               case TODAY:
                  if (Eater->isCeremoniallyUnclean()) {
                     Eater->cutOffFromPeople();
                  }
                  break;
               case  AFTER_TODAY
                  Eater->punished();
                  break;
            }
            break;
         case VOW:
         case FREEWILL:
            switch(Offering->eatingTime) {
               case TODAY:
                  if (Eater->isCeremoniallyUnclean()) {
                     Eater->cutOffFromPeople();
                  }
                  break;
               case NEXT_DAY:
                  if (Eater->isCeremoniallyUnclean()) {
                     Eater->cutOffFromPeople();
                  }
                  break;
               case  AFTER_NEXT_DAY
                  Eater->punished();
                  break;
            }
            break;
      }
   }
}

Sacrafice::SinOffering()
{
   /* Information taken from the following sources:
    * Leviticus 4:1-5:13
    * Leviticus 6:24-30
    */

   switch(Worshipper->type)
   {
      case PRIEST:
         Animal = Worshipper->bring(MaleBull);
         if (withoutDefect(Animal))
         {
            Worshipper->layHandOn(Animal->Head);
            Worshipper->slaughter(Animal);
            for (int x=0;x<7;x++)
               Priest->sprinkleBloodOn(Tabernacle->Curtain);
            Priest->placeBloodOn(IncenceAlter->Horns);
            Priest->pourBloodAt(BurntAlter->Base);
            Priest->burn(Animal->Fat + Animal->Kidneys + Animal->LiverLobe, BurntAlter);
            Priest->burn(Animal->Remains, CeremoniallyCleanPlaceOutsideOfCamp);
         }
         break;
      case WHOLE_COMMUNITY:
         Animal = Elders->bring(MaleBull);
         if (withoutDefect(Animal))
         {
            Elders->layHandOn(Animal->Head);
            Elders->slaughter(Animal);
            for (int x=0;x<7;x++)
               Priest->sprinkleBloodOn(Tabernacle->Curtain);
            Priest->placeBloodOn(IncenceAlter->Horns);
            Priest->pourBloodAt(BurntAlter->Base);
            Priest->burn(Animal->Fat + Animal->Kidneys + Animal->LiverLobe, BurntAlter);
            Priest->burn(Animal->Remains, CeremoniallyCleanPlaceOutsideOfCamp);
         }
         break;
      case COMMUNITY_LEADER:
         Animal = Worshipper->bring(MaleGoat);
         if (withoutDefect(Animal))
         {
            Worshipper->layHandOn(Animal->Head);
            Worshipper->slaughter(Animal);
            Priest->placeBloodOn(BurntAlter->Horns);
            Priest->pourBloodAt(BurntAlter->Base);
            Priest->burn(Animal->Fat, BurntAlter);
            Priest->canEat(Animal->Remains, CeremoniallyCleanPlace);
         }
         break;
      case COMMUNITY_MEMBER:
         if (Worshipper->canAfford(FemaleGoat) or Worshipper->canAfford(Lamb))
         {
            Animal = Worshipper->bring(FemaleGoat or Lamb);
            if (withoutDefect(Animal))
            {
               Worshipper->layHandOn(Animal->Head);
               Worshipper->slaughter(Animal);
               Priest->placeBloodOn(BurntAlter->Horns);
               Priest->pourBloodAt(BurntAlter->Base);
               Priest->burn(Animal->Fat, BurntAlter);
               Priest->canEat(Animal->Remains, CeremoniallyCleanPlace);
            }
         }
         else if (Worshipper->canAfford(2 * Dove))
         {
            Bird1 = Worshipper->bring(Dove);
            Bird2 = Worshipper->bring(Dove);

            Priest->wringOff(Bird1->Head);
            Priest->sprinkleBloodOn(BurntAlter->Side);
            Priest->drainBloodAt(BurntAlter->Base);
            Priest->canEat(Bird1->Remains, CeremoniallyCleanPlace);

            Sacrafice::BurntOffering(Bird2);

         }
         else
         {
            Offering = Worshipper->bring(1/10 * ephah * FineFlour);
            Sacrafice::GrainOffering();
         }
         break;
   }
}

Sacrafice::GuiltOffering()
{
   /* Information taken from the following sources:
    * Leviticus
    * Leviticus
    * Coming Soon ...
    */
}