public bool submitTicket(LotteryTicket ticket)
        {
            if (ticket == null || ticket.Deleted ||
                mode != LotteryBasketMode.Open ||
                !ticket.Writable ||
                ticket.Data == null)
            {
                return(false);
            }

            /* register the ticket */
            ticket.Drawing = drawing;
            RegisteredTicket rt = new RegisteredTicket(ticket);

            incoming[(int)ticket.Serial] = rt;

            /* half the value of a submitted ticket goes to the
             * jackpot, the other half is destroyed */
            award     += LotteryConstants.TicketPrice / 2;
            destroyed += LotteryConstants.TicketPrice / 2;

            return(true);
        }
        public override bool OnDragDrop(Mobile from, Item dropped)
        {
            if (from == null || from.Deleted ||
                dropped == null || dropped.Deleted)
            {
                return(false); /* pedantic check */
            }
            if (!(dropped is LotteryTicket))
            {
                from.SendMessage("Only lottery tickets are accepted");
                return(false);
            }

            LotteryTicket ticket = (LotteryTicket)dropped;

            if (mode != LotteryBasketMode.Open)
            {
                from.SendMessage("The lottery is currently closed.");
                return(false);
            }

            if (ticket.Data == null)
            {
                from.SendMessage("Please fill out your ticket first.");
                return(false);
            }
            else if (ticket.Writable)
            {
                /* submit ticket */
                if (submitTicket(ticket))
                {
                    from.SendMessage("Your lottery ticket was submitted. Good luck!");
                }
                return(false);
            }
            else if (ticket.Drawing == drawing)
            {
                from.SendMessage("This lottery ticket is already submitted. Please wait for the drawing.");
                return(false);
            }
            else if (ticket.Drawing == drawing - 1)
            {
                /* hand out the award */
                RegisteredTicket rt          = (RegisteredTicket)tickets[(int)ticket.Serial];
                bool             mainwinning = false;
                if (rt.Class == 0)
                {
                    mainwinning = true;
                }
                ulong award = rt == null || rt.Class == -1
                    ? 0 : awards[rt.Class];
                if (award == 0)
                {
                    ticket.Delete();
                    from.SendMessage("Sorry, you havn't won. Better luck next time.");
                    return(false);
                }
                else
                {
                    if (debug)
                    {
                        Console.WriteLine("Checking winners ticket: Class " + rt.Class);
                    }

                    if (!giveMoney(from, (int)award, mainwinning))
                    {
                        return(false);
                    }

                    ticket.Delete();

                    if (mainwinning && itemPrize)
                    {
                        from.SendMessage("Congratulations! You won the main prize! A Deed has placed in your Bagpack.");
                        destroyed += award;
                    }
                    else
                    {
                        from.SendMessage("Congratulations! You won " + award + " gold!");
                        given += award;
                    }
                    return(false);
                }
            }
            else
            {
                ticket.Delete();
                from.SendMessage("Sorry, your lottery ticket has expired.");
                return(false);
            }
        }
        public bool submitTicket(LotteryTicket ticket) {
            if (ticket == null || ticket.Deleted ||
                mode != LotteryBasketMode.Open ||
                !ticket.Writable ||
                ticket.Data == null)
                return false;

            /* register the ticket */
            ticket.Drawing = drawing;
            RegisteredTicket rt = new RegisteredTicket(ticket);
            incoming[(int)ticket.Serial] = rt;

            /* half the value of a submitted ticket goes to the
               jackpot, the other half is destroyed */
            award += LotteryConstants.TicketPrice / 2;
            destroyed += LotteryConstants.TicketPrice / 2;

            return true;
        }
        public override void Deserialize(GenericReader reader)
        {
            base.Deserialize(reader);

            int version = reader.ReadInt();

            switch (version)
            {
            case 0:
                drawing = reader.ReadUInt();

                for (uint i = 0; i < jackpot.Length; i++)
                {
                    jackpot[i] = reader.ReadULong();
                }

                for (uint i = 0; i < awards.Length; i++)
                {
                    awards[i] = reader.ReadULong();
                }

                award     = reader.ReadULong();
                given     = reader.ReadULong();
                destroyed = reader.ReadULong();
                mode      = (LotteryBasketMode)reader.ReadInt();

                if (reader.ReadBool())
                {
                    outcome = new uint[LotteryConstants.Picks];
                    for (uint p = 0; p < LotteryConstants.Picks; p++)
                    {
                        outcome[p] = reader.ReadUInt();
                    }
                }

                uint count = reader.ReadUInt();
                for (uint i = 0; i < count; i++)
                {
                    int    id   = reader.ReadInt();
                    uint[] data = new uint[LotteryConstants.Picks];
                    for (uint p = 0; p < LotteryConstants.Picks; p++)
                    {
                        data[p] = reader.ReadUInt();
                    }
                    RegisteredTicket rt = new RegisteredTicket(id, data);
                    rt.Class    = reader.ReadInt();
                    tickets[id] = rt;
                }

                count = reader.ReadUInt();
                for (uint i = 0; i < count; i++)
                {
                    int    id   = reader.ReadInt();
                    uint[] data = new uint[LotteryConstants.Picks];
                    for (uint p = 0; p < LotteryConstants.Picks; p++)
                    {
                        data[p] = reader.ReadUInt();
                    }
                    incoming[id] = new RegisteredTicket(id, data);
                }

                board     = reader.ReadItem();
                itemPrize = reader.ReadBool();
                break;

            case 1:
                drawing = reader.ReadUInt();

                for (uint i = 0; i < drawingCount.Length; i++)
                {
                    drawingCount[i] = reader.ReadUInt();
                }

                for (uint i = 0; i < jackpot.Length; i++)
                {
                    jackpot[i] = reader.ReadULong();
                }

                for (uint i = 0; i < awards.Length; i++)
                {
                    awards[i] = reader.ReadULong();
                }

                for (uint i = 0; i < winners.Length; i++)
                {
                    winners[i] = reader.ReadInt();
                }

                oldParticipants = reader.ReadUInt();

                award     = reader.ReadULong();
                given     = reader.ReadULong();
                destroyed = reader.ReadULong();
                mode      = (LotteryBasketMode)reader.ReadInt();

                if (reader.ReadBool())
                {
                    outcome = new uint[LotteryConstants.Picks];
                    for (uint p = 0; p < LotteryConstants.Picks; p++)
                    {
                        outcome[p] = reader.ReadUInt();
                    }
                }

                count = reader.ReadUInt();
                for (uint i = 0; i < count; i++)
                {
                    int    id   = reader.ReadInt();
                    uint[] data = new uint[LotteryConstants.Picks];
                    for (uint p = 0; p < LotteryConstants.Picks; p++)
                    {
                        data[p] = reader.ReadUInt();
                    }
                    RegisteredTicket rt = new RegisteredTicket(id, data);
                    rt.Class    = reader.ReadInt();
                    tickets[id] = rt;
                }

                count = reader.ReadUInt();
                for (uint i = 0; i < count; i++)
                {
                    int    id   = reader.ReadInt();
                    uint[] data = new uint[LotteryConstants.Picks];
                    for (uint p = 0; p < LotteryConstants.Picks; p++)
                    {
                        data[p] = reader.ReadUInt();
                    }
                    incoming[id] = new RegisteredTicket(id, data);
                }

                board     = reader.ReadItem();
                itemPrize = reader.ReadBool();
                break;
            }
        }
        public override void Deserialize(GenericReader reader) {
            base.Deserialize(reader);

            int version = reader.ReadInt();

            switch ( version ) {
            case 0:
                drawing = reader.ReadUInt();

                for (uint i = 0; i < jackpot.Length; i++)
                    jackpot[i] = reader.ReadULong();

                for (uint i = 0; i < awards.Length; i++)
                    awards[i] = reader.ReadULong();

                award = reader.ReadULong();
                given = reader.ReadULong();
                destroyed = reader.ReadULong();
                mode = (LotteryBasketMode)reader.ReadInt();

                if (reader.ReadBool()) {
                    outcome = new uint[LotteryConstants.Picks];
                    for (uint p = 0; p < LotteryConstants.Picks; p++)
                        outcome[p] = reader.ReadUInt();
                }

                uint count = reader.ReadUInt();
                for (uint i = 0; i < count; i++) {
                    int id = reader.ReadInt();
                    uint[] data = new uint[LotteryConstants.Picks];
                    for (uint p = 0; p < LotteryConstants.Picks; p++)
                        data[p] = reader.ReadUInt();
                    RegisteredTicket rt = new RegisteredTicket(id, data);
                    rt.Class = reader.ReadInt();
                    tickets[id] = rt;
                }

                count = reader.ReadUInt();
                for (uint i = 0; i < count; i++) {
                    int id = reader.ReadInt();
                    uint[] data = new uint[LotteryConstants.Picks];
                    for (uint p = 0; p < LotteryConstants.Picks; p++)
                        data[p] = reader.ReadUInt();
                    incoming[id] = new RegisteredTicket(id, data);
                }

		board = reader.ReadItem();
		itemPrize = reader.ReadBool();
                break;

	    case 1:
	        drawing = reader.ReadUInt();

                for (uint i = 0; i < drawingCount.Length; i++)
                    drawingCount[i] = reader.ReadUInt();

                for (uint i = 0; i < jackpot.Length; i++)
                    jackpot[i] = reader.ReadULong();

                for (uint i = 0; i < awards.Length; i++)
                    awards[i] = reader.ReadULong();

		for (uint i = 0; i < winners.Length; i++)
                    winners[i] = reader.ReadInt();

		oldParticipants = reader.ReadUInt();

		award = reader.ReadULong();
                given = reader.ReadULong();
                destroyed = reader.ReadULong();
                mode = (LotteryBasketMode)reader.ReadInt();

                if (reader.ReadBool()) {
                    outcome = new uint[LotteryConstants.Picks];
                    for (uint p = 0; p < LotteryConstants.Picks; p++)
                        outcome[p] = reader.ReadUInt();
                }

                count = reader.ReadUInt();
                for (uint i = 0; i < count; i++) {
                    int id = reader.ReadInt();
                    uint[] data = new uint[LotteryConstants.Picks];
                    for (uint p = 0; p < LotteryConstants.Picks; p++)
                        data[p] = reader.ReadUInt();
                    RegisteredTicket rt = new RegisteredTicket(id, data);
                    rt.Class = reader.ReadInt();
                    tickets[id] = rt;
                }

                count = reader.ReadUInt();
                for (uint i = 0; i < count; i++) {
                    int id = reader.ReadInt();
                    uint[] data = new uint[LotteryConstants.Picks];
                    for (uint p = 0; p < LotteryConstants.Picks; p++)
		        data[p] = reader.ReadUInt();
                    incoming[id] = new RegisteredTicket(id, data);
                }

		board = reader.ReadItem();
		itemPrize = reader.ReadBool();
	      break;
            }
        }