freeslot("sfx_drtalk", "sfx_dialso")

local dialogue = {
	TEST = {
		[1] = {
			dialoguetext = "dongus dongus dongus"
		},
		[2] = {
			sprite = "SONIC4",
			dialoguetext = "Dude, why would you ever, of all things, make these type of sounds, seriously?",
			sound = sfx_dialso
		},
		[3] = {
			sprite = "SONIC4",
			dialoguetext = "I can't even begin with how stupid those sounds were, and yet here we are.",
			sound = sfx_dialso
		},
		[4] = {
			sprite = "SONIC4",
			dialoguetext = "Please, be better in the future, for all of us.",
			sound = sfx_dialso
		},
		[5] = {
			sprite = "SONIC8",
			dialoguetext = "This is just a test.*For making sure linebreaks work.*Yay.",
			sound = sfx_dialso
		}
	},
	BALL = {
		[1] = {
			dialoguetext = "Hey guys, Iizuka here."
		},
		[2] = {
			dialoguetext = "Press M1 (Fire) to boost.*aim for the head, dont forget to press FIRENORMAL to parry"
		}
	},
	BALL2 = {
		[1] = {
			dialoguetext = "Hey guys, Iizuka here again!"
		},
		[2] = {
			dialoguetext = "Parry his moves by pressing FIRENORMAL until you have 3 charges of fire."
		},
		[3] = {
			dialoguetext = "Use the third charge to create a fire pillar, create atleast 3 fire pillars and then use the other 2 charges to push him into them."
		},
		[4] = {
			dialoguetext = "That will break his defense, you can then attack him"
		}
	},
	BALL3 = {
		[1] = {
			dialoguetext = "Hey guys, Iizuka here."
		},
		[2] = {
			dialoguetext = "Some ki attacks are parriable, parry them by pressing FIRENORMAL and then press C1 to dash!"
		}
	},
	BALL4 = {
		[1] = {
			dialoguetext = "Hey guys, Iizuka here."
		},
		[2] = {
			dialoguetext = "Hit him while going fast to deal extra damage! (dont forget to press FIRENORMAL to parry)"
		}
	}
}

local function TriggerDialogue(mo, dialogue)
	mo.dialoguethinker = true
	mo.dialoguecurrent = dialogue
	mo.dialoguenum = 1
	mo.dialoguetimer = 0
	mo.currentline = 1
	mo.linebegin = 1
	mo.spriteless = 0
	mo.textprogress = {
		line1 = nil,
		line2 = nil,
		line3 = nil,
		line4 = nil
	}
	mo.linebreaks = {
		line2 = false,
		line3 = false,
		line4 = false
	}
end



addHook("PlayerThink", function(player)
	if (player.mo and player.mo.valid) and player.mo.dialoguethinker == true 
		player.pflags = $|PF_STASIS|PF_JUMPSTASIS
		local dialogue = player.mo.dialoguecurrent
		local num =  player.mo.dialoguenum
		if dialogue[num].sprite ~= nil
			player.mo.spriteless = 0
		else
			player.mo.spriteless = 1
		end
		if player.mo.dialoguetimer < string.len(dialogue[num].dialoguetext) then
			if player.cmd.buttons & BT_SPIN
				for i = player.mo.dialoguetimer, string.len(dialogue[num].dialoguetext)
					player.mo.dialoguetimer = $ + 1
					player.mo.textprogress["line"..player.mo.currentline] = string.sub(dialogue[num].dialoguetext, player.mo.linebegin, player.mo.dialoguetimer)
					if string.sub(dialogue[num].dialoguetext, player.mo.dialoguetimer, player.mo.dialoguetimer) == "*"
						local length = player.mo.dialoguetimer - player.mo.linebegin
						if length > 0 then
							player.mo.textprogress["line"..player.mo.currentline] = string.sub(dialogue[num].dialoguetext, player.mo.linebegin, player.mo.dialoguetimer - 1)
						else
							player.mo.textprogress["line"..player.mo.currentline] = ""
						end
						player.mo.currentline = $ + 1
				     	player.mo.linebreaks["line"..player.mo.currentline] = true
						player.mo.linebegin = player.mo.dialoguetimer + 1
						if string.sub(dialogue[num].dialoguetext, player.mo.linebegin, player.mo.linebegin) == " " then
							player.mo.linebegin = player.mo.linebegin + 1
						end
						return
					end
					if string.len(player.mo.textprogress["line"..player.mo.currentline]) > (26 + player.mo.spriteless*8)
						local linestring = player.mo.textprogress["line"..player.mo.currentline]
						local reverso = string.reverse(linestring)
						local ending = string.len(linestring) - ((string.find(reverso, " ") or 1) - 1)
						player.mo.textprogress["line"..player.mo.currentline] = string.sub(dialogue[num].dialoguetext, player.mo.linebegin, player.mo.linebegin + ending - 1)
						player.mo.currentline = $ + 1
						player.mo.linebegin = $ + ending
						if string.sub(dialogue[num].dialoguetext, player.mo.linebegin, player.mo.linebegin) == " " then
							player.mo.linebegin = player.mo.linebegin + 1
						end
						return
					end
				end
			else
				player.mo.dialoguetimer = $ + 1
			end
			if player.mo.dialoguetimer % 2 == 0 then 
				if dialogue[num].sound ~= nil
					S_StartSound(player.mo, dialogue[num].sound, player) 
				else
					S_StartSound(player.mo, sfx_drtalk, player)
				end
			end
		end
		if player.mo.dialoguetimer >= string.len(dialogue[num].dialoguetext)
			if player.cmd.buttons & BT_JUMP and not (player.lastbuttons & BT_JUMP)
				if dialogue[num + 1] == nil
					player.mo.dialoguethinker = false
				else
					player.mo.dialoguenum = $ + 1
					player.mo.dialoguetimer = 0
					player.mo.currentline = 1
					player.mo.linebegin = 0
					player.mo.textprogress = {
						line1 = nil,
						line2 = nil,
						line3 = nil,
						line4 = nil
					}
					player.mo.linebreaks = {
						line2 = false,
						line3 = false,
						line4 = false
					}
				end
			end
		end
		player.mo.textprogress["line"..player.mo.currentline] = string.sub(dialogue[num].dialoguetext, player.mo.linebegin, player.mo.dialoguetimer)
		if string.sub(dialogue[num].dialoguetext, player.mo.dialoguetimer, player.mo.dialoguetimer) == "*"
			local length = player.mo.dialoguetimer - player.mo.linebegin
			if length > 0 then
				player.mo.textprogress["line"..player.mo.currentline] = string.sub(dialogue[num].dialoguetext, player.mo.linebegin, player.mo.dialoguetimer - 1)
			else
				player.mo.textprogress["line"..player.mo.currentline] = ""
			end
			player.mo.currentline = $ + 1
			player.mo.linebreaks["line"..player.mo.currentline] = true
			player.mo.linebegin = player.mo.dialoguetimer + 1
			if string.sub(dialogue[num].dialoguetext, player.mo.linebegin, player.mo.linebegin) == " " then
				player.mo.linebegin = player.mo.linebegin + 1
			end
			return
		end
		if string.len(player.mo.textprogress["line"..player.mo.currentline]) > (26 + player.mo.spriteless*8)
			local linestring = player.mo.textprogress["line"..player.mo.currentline]
			local reverso = string.reverse(linestring)
			local ending = string.len(linestring) - ((string.find(reverso, " ") or 1) - 1)
			player.mo.textprogress["line"..player.mo.currentline] = string.sub(dialogue[num].dialoguetext, player.mo.linebegin, player.mo.linebegin + ending - 1)
			player.mo.currentline = $ + 1
			player.mo.linebegin = $ + ending
			if string.sub(dialogue[num].dialoguetext, player.mo.linebegin, player.mo.linebegin) == " " then
				player.mo.linebegin = player.mo.linebegin + 1
			end
			return
		end
	end
end)

local function DialogueDrawer(v, player)
	if (player.mo and player.mo.valid) and player.mo.dialoguethinker == true 
		local dialogue = player.mo.dialoguecurrent
		local num =  player.mo.dialoguenum
		v.draw(12, 0, v.cachePatch("DIALOBOX"))
		if dialogue[num].sprite ~= nil then v.draw(24, 8, v.cachePatch(dialogue[num].sprite)) end
		v.drawString(84 - (player.mo.spriteless*64), 10, "*")
		for i = 1, 4 do
			local line = player.mo.textprogress["line"..i]
			local broke = player.mo.linebreaks["line"..i]
			if line == nil then return end
			v.drawString(98 - (player.mo.spriteless*64), 10 + (i-1)*15, line)
			if broke == true then v.drawString(84  - (player.mo.spriteless*64), 10 + (i-1)*15, "*") end
		end
	end
end

hud.add(DialogueDrawer, "game")

addHook("LinedefExecute", function(line, mo, sec)
	TriggerDialogue(mo, dialogue[line.stringargs[1]])
end, "DTDIALOG")