quest event_halloween_hair begin
	state start begin
		function is_running()
			return (game.get_event_flag("halloween_hair") > 0)    --npc spawn
		end

		function setting()
			return {  
			["pumpkin"]	= 30321,		-- Halloween Pumpkin
			["wand"]	= 30322,		-- Halloween magic wand 
			["coupon"]	= 30323,		-- Hair coupon
			["box"]		= 50215,		-- Halloween giftbox
			["pumpkin_head"]= 33008		-- Pumpkin head NPC
			}
		end

		function get_hair_option(index)
			local option_list = {
				{ 
					["apply"]		= apply.ATTBONUS_MONSTER,
					["value"]		= 10,
					["duration"]	= 604800,	-- 7 days
				},
				{ 
					["apply"]		= apply.ATTBONUS_SURA,
					["value"]		= 10,
					["duration"]	= 604800,	-- 7 days
				},
				{ 
					["apply"]		= apply.ATTBONUS_SHAMAN,
					["value"]		= 10,
					["duration"]	= 604800,	-- 7 days
				},
				{ 
					["apply"]		= apply.ATTBONUS_WARRIOR,
					["value"]		= 10,
					["duration"]	= 604800,	-- 7 days
				},
				{ 
					["apply"]		= apply.ATTBONUS_ASSASSIN,
					["value"]		= 10,
					["duration"]	= 604800,	-- 7 days
				},
				{ 
					["apply"]		= apply.MAX_HP_PCT,
					["value"]		= 1,
					["duration"]	= 21600,	-- 6 hours
				},
				{ 
					["apply"]		= apply.MAX_SP_PCT,
					["value"]		= 1,
					["duration"]	= 86400,	-- 24 hours
				},
			}

			return option_list[index]
		end

		function get_random_hair_option_index()
			local index = 1

			-- hair_option[1] ~ [5] : 5%
			-- hair_option[6] : 15%
			-- hair_option[7] ~ 80%

			local rand = number(1, 100)
			if rand <= 5 then
				index = rand
			elseif rand <= 85 then
				index = 7
			else
				index = 6
			end

			return index
		end

		function get_hair_info_by_race(race)
			hair_info_by_race = {
			--    VNUM, SHAPE
				{ 74020, 1018 },		-- 1 : Warrior(M)
				{ 74270, 2018 },		-- 2 : Assassin(W)
				{ 74520, 3018 },		-- 3 : Sura(M)
				{ 74770, 4018 },		-- 4 : Shaman(W)
				{ 75020, 1018 },		-- 5 : Warrior(W)
				{ 75220, 2018 },		-- 6 : Assassin(M)
				{ 75420, 3018 },		-- 7 : Sura(W)
				{ 75620, 4018 },		-- 8 : Shaman(M)
			}

			return hair_info_by_race[race]
		end
			
		when login or enter with game.get_event_flag("halloween_hair") > 0 begin
			local setting = event_halloween_hair.setting()
			local mapIndex = pc.get_map_index()
			if mapIndex == 1 or mapIndex == 21 or mapIndex == 41 then
				if find_npc_by_vnum(setting.pumpkin_head) == 0 then  
					if mapIndex == 1 then
						mob.spawn(setting.pumpkin_head, 608, 617, 1, 1, 1)
					elseif mapIndex == 21 then
						mob.spawn(setting.pumpkin_head, 596, 610, 1, 1, 1)
					elseif mapIndex == 41 then
						mob.spawn(setting.pumpkin_head, 357, 743, 1, 1, 1)
					end
				end
			end

		end

		when 33008.chat.gameforge.event_halloween_hair._10_npcChat with pc.getqf("first_notice") < 1 begin
			local setting = event_halloween_hair.setting()

			say_title(gameforge.event_halloween_hair._20_sayTitle)
			say(gameforge.event_halloween_hair._30_say)
			wait()

			say_title(gameforge.event_halloween_hair._20_sayTitle)
			say(gameforge.event_halloween_hair._40_say)
			wait()

			say_title(gameforge.event_halloween_hair._20_sayTitle)
			say(gameforge.event_halloween_hair._50_say)

			pc.setqf("first_notice", 1)

			if not event_halloween_hair.is_running() then
				npc.purge()
			end
		end  

		when 33008.chat.gameforge.event_halloween_hair._60_npcChat with pc.getqf("first_notice") == 1 begin
			local setting = event_halloween_hair.setting()

			say_title(gameforge.event_halloween_hair._20_sayTitle)
			say(gameforge.event_halloween_hair._70_say)
			wait()

			say_title(gameforge.event_halloween_hair._20_sayTitle)
			say(gameforge.event_halloween_hair._80_say)
			wait()

			if pc.count_item(setting.coupon) == 0 then
				say_title(gameforge.event_halloween_hair._20_sayTitle)
				say(gameforge.event_halloween_hair._90_say)
				wait()

				say_title(gameforge.event_halloween_hair._20_sayTitle)
				say(gameforge.event_halloween_hair._100_say)
				wait()
			else
				say_title(gameforge.event_halloween_hair._20_sayTitle)
				say(gameforge.event_halloween_hair._110_say)
				wait()

				say_title(gameforge.event_halloween_hair._20_sayTitle)
				say(gameforge.event_halloween_hair._120_say)
				wait()
				say(gameforge.event_halloween_hair._130_say)
				local s = select(gameforge.event_halloween_hair._140_select_1, gameforge.event_halloween_hair._140_select_2)
				if s == 2 then
					return
				end
				-- remove a hair coupon
				pc.remove_item(setting.coupon, 1)

				-- Give a hair item to user, and prepare for setting random options to it
				local race	= pc.get_race() + 1
				local index	= event_halloween_hair.get_random_hair_option_index()		-- 
				local option= event_halloween_hair.get_hair_option(index)				-- hair option (apply, value, duration)
				local hair_info = event_halloween_hair.get_hair_info_by_race(race)		
				local vnum, shape = hair_info[1], hair_info[2]

				pc.give_item2_select(vnum)
				item.set_socket(0, option.duration)
				item.set_value(0, option.apply, option.value)
			end -- if

			if not event_halloween_hair.is_running() then
				npc.purge()
			end
		end	  --when


		-- When using 'Halloween magic wand'
		when 30322.use begin
			local setting = event_halloween_hair.setting()
			if pc.count_item(setting.pumpkin) > 0 then
				pc.remove_item(setting.pumpkin, 1)
				pc.remove_item(setting.wand, 1)
				pc.give_item2(setting.box, 1)
			end
		end

		when 74020.use or 74270.use or 74520.use or 74770.use or 75020.use or 75220.use or 75420.use or 75620.use begin

			local index = item.get_socket(1)

			-- If this item was created by command(ex: /i 74020) then socket value is zero. Thus, give a random option.
			if 0 == index then
				index = event_halloween_hair.get_random_hair_option_index()
			end

			local option = event_halloween_hair.get_hair_option(index)
			local hair_info = event_halloween_hair.get_hair_info_by_race(pc.get_race() + 1)
			local vnum, shape = hair_info[1], hair_info[2]

			pc.set_part(PART_HAIR, shape)
			affect.remove_hair()
			affect.add_hair(option.apply, option.value, option.duration)

			pc.setf("hair", "limit_time", get_time() + option.duration)

			-- Copied from "hair.leave_log" function in "hair.quest" file
			char_log(0, "CHANGE_HAIR", string.format("USE_ITEM(%d)", vnum)) 
			char_log(0, "CHANGE_HAIR", string.format("END_SEC(%d)", get_time() + option.duration))
			char_log(0, "CHANGE_HAIR", "CHANGE_HAIR_END")

			item.remove()
		end
	end  --state
end		--quest