Scriptname RenRadioTestScript extends ObjectReference
{; Radio Test Script should run on radio activator}

import debug
import activator
import message

float currentfrequency = 0.0
float radiolistfrequency = 0.0

int formlistindex = 0
int arrayindex = 0
int prevarrayindex = 0

FormList Property RenRadioList Auto
; 002462e3 is the workshop radio list
 
ObjectReference oReference

Float[] FrequencyArray

float myvolume = 0.0

Message Property RenRadioMSG01 Auto

Bool RunMenu

int radiobutton = 0

; 0019D6C3 - atom cats transmitter

RenRadioQuestScript Property renradioquest Auto
RenRadioMorseCodeScript Property renmorsequest Auto

bool firstsearch = false
float testfrequency = 0.0

Function ResetOriginalFrequency()
	
endFunction

float Function RoundtoFirstDecimal(float number)
	int total = ((number * 10.0) As Int)
	float output = 0.0
	output = ((total As Float) / 10.0)
	return output
endFunction

Function ClearFrequencyArray()
	int itr = 0
	while (itr < FrequencyArray.length)
		FrequencyArray[itr] = 0.0
		itr += 1
	endWhile
endFunction

Function SearchForFreqs()
	; fPipboyRadioMinFrequency
	; fPipboyRadioMaxFrequency
	ClearFrequencyArray()
	testfrequency = Game.GetGameSettingFloat("fPipboyRadioMinFrequency")
	while (testfrequency <= Game.GetGameSettingFloat("fPipboyRadioMaxFrequency"))
		if (Game.IsPlayerInRadioRange(testfrequency) == true)
			int emptyfreq = FrequencyArray.Find(0.0)
			if (emptyfreq >= 0 && FrequencyArray.Find(testfrequency) == -1)
				FrequencyArray[emptyfreq] = testfrequency
			endif
		endif
		testfrequency = testfrequency + 0.5
		;testfrequency = RoundtoFirstDecimal(testfrequency)		
	endWhile
	arrayindex = 0
endFunction	

Function GetStations()

	if (FrequencyArray == none)
		FrequencyArray = New Float[128]
	endif
	
	if (renmorsequest != none && (renmorsequest.MorseA == none || renmorsequest.Morse0 == none || renmorsequest.MorseRadioTransmitter == none || renmorsequest.morsecodescene == none))
		renmorsequest.Reset()
	endif
	
	Int formsize = RenRadioList.GetSize() 
	; Indices are offset by 1 relative to size	
	
	myvolume = GetRadioVolume()
	
	SearchForFreqs()
	
	;/
	; no longer needed?
	while (formlistindex < formsize)
		oReference = PlaceAtMe(RenRadioList.GetAt(formlistindex), 1, false, true, true)
		radiolistfrequency = oReference.GetRadioFrequency()
		oReference.BlockActivation(true, true)
		
		if (FrequencyArray.Find(radiolistfrequency) < 0)
			FrequencyArray[formlistindex] = radiolistfrequency
		endif
		 
		formlistindex += 1
		oReference.DisableNoWait(false)
		oReference.Delete()
		oReference = none
	endWhile
	
	int freqitr = 0
	formlistindex = FrequencyArray.Find(0.0)
	
	if (renradioquest != none && renradioquest.rencustomfreqs != none)
		while (renradioquest.rencustomfreqs[freqitr] != 0.0 && formlistindex >= 0)
			float newfreq = renradioquest.rencustomfreqs[freqitr]
			if (FrequencyArray.Find(newfreq) < 0)
				FrequencyArray[formlistindex] = renradioquest.rencustomfreqs[freqitr]
				formlistindex += 1
			endif
			freqitr += 1
		endWhile
	endif
	/;
	
EndFunction

Function RadioMenu()

	if (prevarrayindex != arrayindex)
		arrayindex = prevarrayindex
	endif

	if (firstsearch == false)
		; do an initial search
		GetStations()
		firstsearch = true
	endif

	if (IsRadioOn() == false)
		SetRadioOn(true)
	endif
	
	;/
	Int iIndex = 0
	while (FrequencyArray[iIndex] != 0.0)
		iIndex += 1
	endWhile
	iIndex -= 1
	; Indices are offset by 1 relative to size, so we need to drop it down by 1
	/;
	
	if (FrequencyArray.Find(GetRadioFrequency()) < 0)
		int emptyslot = FrequencyArray.Find(0.0)
		FrequencyArray[emptyslot] = GetRadioFrequency()
		arrayindex = emptyslot
	endif
	
	if (Game.IsPlayerRadioOn() && Game.IsPlayerInRadioRange(Game.GetPlayerRadioFrequency()))
		; player is listening to a radio station on
		; the Pipboy
		
		int emptyslot = FrequencyArray.Find(0.0)
		currentfrequency = Game.GetPlayerRadioFrequency()
		if (FrequencyArray.Find(currentfrequency) < 0)
			FrequencyArray[emptyslot] = currentfrequency
		endif
		;/
		if (renradioquest.rencustomfreqs.Find(currentfrequency) < 0)
			int cfreq = renradioquest.rencustomfreqs.Find(0.0)
			if (cfreq >= 0)
				renradioquest.rencustomfreqs[cfreq] = currentfrequency
			endif
		endif
		/;
		arrayindex = emptyslot
	endif		
	
	RunMenu = true
	
	While RunMenu && RenRadioMSG01 != none
		if (radiobutton != -1)
			radiobutton = RenRadioMSG01.Show(GetRadioFrequency(), (GetRadioVolume() * 100), 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0)
			
			if (radiobutton == 0)
				; frequency up
				if (FrequencyArray[(arrayindex+1)] != 0.0)
					arrayindex += 1
				else
					arrayindex = 0
				endif
			elseif (radiobutton == 1)
				; frequency down
				if (arrayindex > 0)
					arrayindex -= 1		
				else
					arrayindex = (FrequencyArray.Find(0.0) - 1)
				endif
			elseif (radiobutton == 2)
				; volume up
				if (myvolume + 0.1 < 1)
					myvolume += 0.1
				else
					myvolume = 1
				endif
			elseif (radiobutton == 3)
				; volume down
				if (myvolume - 0.1 > 0)
					myvolume -= 0.1
				else
					myvolume = 0
				endif
			elseif (radiobutton == 4)
				; turn off radio
				SetRadioOn(false)
			elseif (radiobutton == 5)
				; do nothing
				if (IsRadioOn() == false)
					SetRadioOn(false)
				else
					SetRadioOn(true)					
				endif
				return
			endif
			
			if (FrequencyArray[arrayindex] != 0.0)
				currentfrequency = FrequencyArray[arrayindex]
				SetRadioFrequency(FrequencyArray[arrayindex])				
				SetRadioVolume(myvolume)
				prevarrayindex = arrayindex
			endif
		endif
	endWhile
endFunction

Event OnLoad()
	GetStations()
	firstsearch = true	
endEvent

Event OnActivate(ObjectReference akActionRef)
	
	Form myself = Self As Form
	Activator myradio = myself as Activator
	
	if (myradio != none && myradio.IsRadio() == false)
		; make this ObjRef a radio!
		; MakeRadioReceiver(float afFrequency, float afVolume, outputmodel aOverrideModel, bool abActive, bool abNoStatic)
		Self.MakeRadioReceiver(91.0, 1.0, none, false, true)
	endif	
	
	renradioquest = Game.GetFormFromFile(0x010008B0, "RenRadioMod.esp") As RenRadioQuestScript
	renmorsequest = Game.GetFormFromFile(0x010008D6, "RenRadioMod.esp") As RenRadioMorseCodeScript	
	
	Utility.Wait(0.1)
	
	RadioMenu()
	
endEvent

Event OnEquipped(Actor akActor)
	
	Form myself = Self As Form
	Activator myradio = myself as Activator
	
	if (myradio != none && myradio.IsRadio() == false)
		; make this ObjRef a radio!
		; MakeRadioReceiver(float afFrequency, float afVolume, outputmodel aOverrideModel, bool abActive, bool abNoStatic)
		Self.MakeRadioReceiver(91.0, 1.0, none, false, true)
	endif	
	
	renradioquest = Game.GetFormFromFile(0x010008B0, "RenRadioMod.esp") As RenRadioQuestScript
	renmorsequest = Game.GetFormFromFile(0x010008D6, "RenRadioMod.esp") As RenRadioMorseCodeScript		
	
	Utility.Wait(0.1)
	
	RadioMenu()
	
endEvent