Scriptname RenWireless:RenWirelessMorseScript extends Quest

float Property waitBetweenMorse = 0.05 Auto
{ Update time / dot time. Roughly 25 WPM. }

float Property morsespace = 0.35 Auto
{ ~7 dots }

; Hey, this is an Easter egg. Please don't spoil it. :)

int playTimerID = 10

Sound Property RenWirelessMorse0 Auto
Sound Property RenWirelessMorse1 Auto
Sound Property RenWirelessMorse2 Auto
Sound Property RenWirelessMorse3 Auto
Sound Property RenWirelessMorse4 Auto
Sound Property RenWirelessMorse5 Auto
Sound Property RenWirelessMorse6 Auto
Sound Property RenWirelessMorse7 Auto
Sound Property RenWirelessMorse8 Auto
Sound Property RenWirelessMorse9 Auto

Sound Property RenWirelessMorseA Auto
Sound Property RenWirelessMorseB Auto
Sound Property RenWirelessMorseC Auto
Sound Property RenWirelessMorseD Auto
Sound Property RenWirelessMorseE Auto
Sound Property RenWirelessMorseF Auto
Sound Property RenWirelessMorseG Auto
Sound Property RenWirelessMorseH Auto
Sound Property RenWirelessMorseI Auto
Sound Property RenWirelessMorseJ Auto
Sound Property RenWirelessMorseK Auto
Sound Property RenWirelessMorseL Auto
Sound Property RenWirelessMorseM Auto
Sound Property RenWirelessMorseN Auto
Sound Property RenWirelessMorseO Auto
Sound Property RenWirelessMorseP Auto
Sound Property RenWirelessMorseQ Auto
Sound Property RenWirelessMorseR Auto
Sound Property RenWirelessMorseS Auto
Sound Property RenWirelessMorseT Auto
Sound Property RenWirelessMorseU Auto
Sound Property RenWirelessMorseV Auto
Sound Property RenWirelessMorseW Auto
Sound Property RenWirelessMorseX Auto
Sound Property RenWirelessMorseY Auto
Sound Property RenWirelessMorseZ Auto

int randommorse = 0

sound[] Property morsesounds Auto

string[] Property morsebuffer Auto
string[] Property morsebuffer_extend Auto

float[] Property soundtime Auto

string[] Property morsetexts Auto

message[] Property morsemessages Auto

string morseoutput
int Property asciilength Auto

int Property textreplacenum = 120 Auto

bool Property playmorsesoundbool = false Auto Conditional

int Property morsenum Auto Conditional

Book Property RenMorseCodeTemplateNote Auto
ObjectReference Property RenMorseCodeNote Auto

bool createpage = false

ObjectReference Property SurveillanceRadio01 Auto

GlobalVariable Property DN041_Elevator Auto Const

String[] Property CQ_Start Auto

String[] Property Ham01 Auto
String[] Property Ham02 Auto

String[] DEFCON

String[] state_ma
String[] state_ny
String[] state_ri
String[] state_me

String[] michigan_easteregg

String Function GetRandomLetter()
	return morsetexts[Utility.RandomInt(10, 35)]
endFunction

String Function GetRandomNumber()
	return morsetexts[Utility.RandomInt(0, 9)]
endFunction

Function SetupDEFCON()
	if (DEFCON == none)
		DEFCON.Add("J")
		DEFCON.Add("C")
		DEFCON.Add("S")
		DEFCON.Add(" ")
		DEFCON.Add("O")
		DEFCON.Add("R")
		DEFCON.Add("D")
		DEFCON.Add(" ")
		DEFCON.Add("D")
		DEFCON.Add("E")
		DEFCON.Add("F")
		DEFCON.Add("C")
		DEFCON.Add("O")		
		DEFCON.Add("N")		
		DEFCON.Add("1")		
		DEFCON.Add(" ")		
	endif
endFunction

String[] Function GetRandomState()
	if (state_ma == none)
		state_ma = new String[0]
		state_ma.Add("M")
		state_ma.Add("A")
		
		state_ri = new String[0]
		state_ri.Add("R")
		state_ri.Add("I")
		
		state_ny = new String[0]
		state_ny.Add("N")
		state_ny.Add("Y")
		
		state_me = new String[0]
		state_me.Add("M")
		state_me.Add("E")
		
		michigan_easteregg = new String[0]
		; Artes, Scientia, Veritas
		michigan_easteregg.Add("A")
		michigan_easteregg.Add("R")
		michigan_easteregg.Add("T")
		michigan_easteregg.Add("E")
		michigan_easteregg.Add("S")
		michigan_easteregg.Add(" ")
		michigan_easteregg.Add("S")
		michigan_easteregg.Add("C")				
		michigan_easteregg.Add("I")		
		michigan_easteregg.Add("E")		
		michigan_easteregg.Add("N")				
		michigan_easteregg.Add("T")
		michigan_easteregg.Add("I")		
		michigan_easteregg.Add("A")		
		michigan_easteregg.Add(" ")		
		michigan_easteregg.Add("V")
		michigan_easteregg.Add("E")
		michigan_easteregg.Add("R")
		michigan_easteregg.Add("I")
		michigan_easteregg.Add("T")		
		michigan_easteregg.Add("A")		
		michigan_easteregg.Add("S")		
	endif		

	int randomnum = Utility.RandomInt(0, 3)
	
	if (randomnum == 0)
		return state_ma
	elseif (randomnum == 1)
		return state_ri
	elseif (randomnum == 2)
		return state_ny
	elseif (randomnum == 3)
		return state_me
	else
		return state_ma
	endif	
endFunction

Function RandomCallsigns()
	Ham01 = new String[0]
	Ham02 = new String[0]
	
	; PNSSS
	Ham01.Add("N")
	Ham01.Add(GetRandomNumber())
	Ham01.Add(GetRandomLetter())
	Ham01.Add(GetRandomNumber())	
	Ham01.Add(GetRandomLetter())	
	
	Ham02.Add("N")	
	Ham02.Add(GetRandomNumber())
	Ham02.Add(GetRandomLetter())
	Ham02.Add(GetRandomNumber())	
	Ham02.Add(GetRandomLetter())	
endFunction

Function AddHamConvo()
	if (CQ_Start == none)
		CQ_Start = new String[0]	
		CQ_Start.Add("C")
		CQ_Start.Add("Q")
		CQ_Start.Add(" ")
		CQ_Start.Add("C")
		CQ_Start.Add("Q")
		CQ_Start.Add(" ")	
		CQ_Start.Add("C")
		CQ_Start.Add("Q")
		CQ_Start.Add(" ")	
		CQ_Start.Add("D")
		CQ_Start.Add("E")	
		CQ_Start.Add(" ")	
		CQ_Start.Add(" ")			
	endif
	
	RandomCallsigns()
	
	AddWord(CQ_Start) ; 12
	AddWord(Ham01) ; 5
	AddLetter(" ", "K", " ", " ", " ", " ", " ") ; 7
	AddWord(Ham01) ; 5
	AddLetter(" ", "D", "E", " ") ; 4
	AddWord(Ham02) ; 5
	AddLetter(" ", "T", "N", "X", " ", "C", "A", "L", "L", " ") ; 10
	AddLetter("U", "R", " ", (Utility.RandomInt(3, 5) As String), (Utility.RandomInt(7, 9) As String), (Utility.RandomInt(7, 9) As String), " ") ; 7
	AddLetter("I", "N", " ") ; 3
	AddWord(GetRandomState()) ; 2
	AddLetter(" ", "C", "L", " ", " ", " ", " ", " ") ; 8
endFunction

Function AddWord(String[] stringadd)
	int arrindex = -1
	
	arrindex = morsebuffer.Find("")	
	if (arrindex >= 0 && (stringadd.length + arrindex) <= 127)
		int itr = 0
		while (itr < stringadd.length)
			morsebuffer[(arrindex + itr)] = stringadd[itr]
			itr += 1
		endWhile
	endif
endFunction

Function AddLetter(string letterone = "", string lettertwo = "", string letterthree = "", string letterfour = "", string letterfive = "", string lettersix = "", string letterseven = "", string lettereight = "", string letternine = "", string letterten = "")
	int arrindex = -1
	
	arrindex = morsebuffer.Find("")
	if (arrindex >= 0)		
		morsebuffer[arrindex] = letterone
	endif
	
	if (arrindex >= 0)		
		morsebuffer[arrindex+1] = lettertwo	
	endif

	if (arrindex >= 0)		
		morsebuffer[arrindex+2] = letterthree	
	endif

	if (arrindex >= 0)		
		morsebuffer[arrindex+3] = letterfour
	endif

	if (arrindex >= 0)		
		morsebuffer[arrindex+4] = letterfive
	endif

	if (arrindex >= 0)		
		morsebuffer[arrindex+5] = lettersix
	endif

	if (arrindex >= 0)		
		morsebuffer[arrindex+6] = letterseven
	endif
	
	if (arrindex >= 0)		
		morsebuffer[arrindex+7] = lettereight
	endif
	
	if (arrindex >= 0)	
		morsebuffer[arrindex+8] = letternine
	endif

	if (arrindex >= 0)
		morsebuffer[arrindex+9] = letterten	
	endif
EndFunction

Event OnTimer(int timerid)
	if (timerid == playTimerID)
		
		if (SurveillanceRadio01 == none)
			SurveillanceRadio01 = Game.GetFormFromFile(0x0018F2F2, "Fallout4.esm") As ObjectReference
		endif
		
		morsenum = Utility.RandomInt(0, (morsesounds.Find(none) - 1))
		
		if (morsebuffer[0] != "")
			if (morsebuffer[0] == "a")
				morsenum = 10
			elseif (morsebuffer[0] == "b")
				morsenum = 11
			elseif (morsebuffer[0] == "c")
				morsenum = 12
			elseif (morsebuffer[0] == "d")
				morsenum = 13			
			elseif (morsebuffer[0] == "e")			
				morsenum = 14
			elseif (morsebuffer[0] == "f")
				morsenum = 15			
			elseif (morsebuffer[0] == "g")
				morsenum = 16			
			elseif (morsebuffer[0] == "h")
				morsenum = 17			
			elseif (morsebuffer[0] == "i")
				morsenum = 18			
			elseif (morsebuffer[0] == "j")
				morsenum = 19			
			elseif (morsebuffer[0] == "k")
				morsenum = 20			
			elseif (morsebuffer[0] == "l")
				morsenum = 21			
			elseif (morsebuffer[0] == "m")
				morsenum = 22				
			elseif (morsebuffer[0] == "n")
				morsenum = 23											
			elseif (morsebuffer[0] == "o")
				morsenum = 24			
			elseif (morsebuffer[0] == "p")
				morsenum = 25			
			elseif (morsebuffer[0] == "q")
				morsenum = 26			
			elseif (morsebuffer[0] == "r")
				morsenum = 27			
			elseif (morsebuffer[0] == "s")
				morsenum = 28			
			elseif (morsebuffer[0] == "t")
				morsenum = 29			
			elseif (morsebuffer[0] == "u")
				morsenum = 30			
			elseif (morsebuffer[0] == "v")	
				morsenum = 31			
			elseif (morsebuffer[0] == "w")
				morsenum = 32			
			elseif (morsebuffer[0] == "x")
				morsenum = 33			
			elseif (morsebuffer[0] == "y")
				morsenum = 34			
			elseif (morsebuffer[0] == "z")
				morsenum = 35
			elseif (morsebuffer[0] == " ")
				morsenum = 36
			else
				morsenum = morsebuffer[0] As Int
			endif
			
			; need to shift the buffer by -1
			int itr = 0
			while (itr < morsebuffer.Length)
				if ((itr+1) < morsebuffer.Length)
					morsebuffer[itr] = morsebuffer[(itr+1)]
				endif
				itr += 1
			endWhile
		endif	
		
		bool broadcast = true		
		bool easteregg = false

		if (broadcast == true && SurveillanceRadio01 != none && (DN041_Elevator.GetValue() As Int) == 1)
			if (SurveillanceRadio01.IsRadioOn() == true)
				if (morsenum == 36)
					Utility.Wait(morsespace)
				else
					bool soundplayed = morsesounds[morsenum].PlayAndWait(SurveillanceRadio01)
					Utility.Wait(waitBetweenMorse)
				endif
			else
				Utility.Wait(morsespace)
			endif
		endif		
		
		if (easteregg == true && morsebuffer[0] == "")
			AddLetter("A", "L", "L", " ", "H", "A", "I", "L", " ")
			AddLetter("T", "H", "E", " ", "E", "N", "C", "L", "A", "V")
			AddLetter("E", " ")
			
			;/
			int itr = 0
			
			while (itr <= 30)
				morsenum = Utility.RandomInt(0, (morsesounds.Find(none) - 1))			
				AddLetter(morsetexts[morsenum])
				itr += 1
			endwhile
			
			AddLetter("K", "W", "2", "6", "E", "N", "D")
			/;
		elseif (easteregg == false && morsebuffer[0] == "")
			AddHamConvo()		
		endif
		
		bool testmode = false		
		
		if (testmode == true)
			AddLetter("0", "1", "2", "3", "4", "5", "6", "7", "8", "9")
			AddLetter("A", "B", "C", "D", "E", "F", "G", "H", "I", "J")
			AddLetter("K", "L", "M", "N", "O", "P", "Q", "R", "S", "T")
			AddLetter("U", "V", "W", "X", "Y", "Z")	
		endif
		Self.StartTimer(0.01, playTimerID)		
	endif
endEvent

Function InitializeVariables()
	if (morsesounds == none || soundtime == none)
		morsesounds = new sound[128]
		morsebuffer = new string[128]
		soundtime = new float[128]
		morsetexts = new string[128]
		morsemessages = new message[128]
	endif
	
	textreplacenum = 120
	
	morsesounds[0] = RenWirelessMorse0
	morsesounds[1] = RenWirelessMorse1
	morsesounds[2] = RenWirelessMorse2
	morsesounds[3] = RenWirelessMorse3
	morsesounds[4] = RenWirelessMorse4
	morsesounds[5] = RenWirelessMorse5
	morsesounds[6] = RenWirelessMorse6
	morsesounds[7] = RenWirelessMorse7
	morsesounds[8] = RenWirelessMorse8
	morsesounds[9] = RenWirelessMorse9
	morsesounds[10] = RenWirelessMorseA
	morsesounds[11] = RenWirelessMorseB
	morsesounds[12] = RenWirelessMorseC
	morsesounds[13] = RenWirelessMorseD
	morsesounds[14] = RenWirelessMorseE
	morsesounds[15] = RenWirelessMorseF
	morsesounds[16] = RenWirelessMorseG
	morsesounds[17] = RenWirelessMorseH
	morsesounds[18] = RenWirelessMorseI
	morsesounds[19] = RenWirelessMorseJ
	morsesounds[20] = RenWirelessMorseK
	morsesounds[21] = RenWirelessMorseL
	morsesounds[22] = RenWirelessMorseM		
	morsesounds[23] = RenWirelessMorseN	
	morsesounds[24] = RenWirelessMorseO
	morsesounds[25] = RenWirelessMorseP
	morsesounds[26] = RenWirelessMorseQ
	morsesounds[27] = RenWirelessMorseR
	morsesounds[28] = RenWirelessMorseS
	morsesounds[29] = RenWirelessMorseT	
	morsesounds[30] = RenWirelessMorseU
	morsesounds[31] = RenWirelessMorseV
	morsesounds[32] = RenWirelessMorseW
	morsesounds[33] = RenWirelessMorseX
	morsesounds[34] = RenWirelessMorseY
	morsesounds[35] = RenWirelessMorseZ
	; note how space is not here.
	
	morsetexts[0] = "0"
	morsetexts[1] = "1"
	morsetexts[2] = "2"
	morsetexts[3] = "3"
	morsetexts[4] = "4"
	morsetexts[5] = "5"
	morsetexts[6] = "6"
	morsetexts[7] = "7"
	morsetexts[8] = "8"
	morsetexts[9] = "9"
	morsetexts[10] = "A"
	morsetexts[11] = "B"
	morsetexts[12] = "C"
	morsetexts[13] = "D"
	morsetexts[14] = "E"
	morsetexts[15] = "F"
	morsetexts[16] = "G"
	morsetexts[17] = "H"
	morsetexts[18] = "I"
	morsetexts[19] = "J"
	morsetexts[20] = "K"
	morsetexts[21] = "L"
	morsetexts[22] = "M"		
	morsetexts[23] = "N"	
	morsetexts[24] = "O"
	morsetexts[25] = "P"
	morsetexts[26] = "Q"
	morsetexts[27] = "R"
	morsetexts[28] = "S"
	morsetexts[29] = "T"	
	morsetexts[30] = "U"
	morsetexts[31] = "V"
	morsetexts[32] = "W"
	morsetexts[33] = "X"
	morsetexts[34] = "Y"
	morsetexts[35] = "Z"
	morsetexts[36] = " "	
	
	soundtime[0] = 2.2
	soundtime[1] = 2.0
	soundtime[2] = 1.8
	soundtime[3] = 1.6
	soundtime[4] = 1.4
	soundtime[5] = 1.2
	soundtime[6] = 1.4
	soundtime[7] = 1.6
	soundtime[8] = 1.8
	soundtime[9] = 2.0
	soundtime[10] = 0.8
	soundtime[11] = 1.2
	soundtime[12] = 1.4
	soundtime[13] = 1.0
	soundtime[14] = 0.4
	soundtime[15] = 1.2
	soundtime[16] = 1.2
	soundtime[17] = 1.0
	soundtime[18] = 0.6
	soundtime[19] = 1.6
	soundtime[20] = 1.2
	soundtime[21] = 1.2
	soundtime[22] = 1.0		
	soundtime[23] = 0.8	
	soundtime[24] = 1.4
	soundtime[25] = 1.4
	soundtime[26] = 1.6
	soundtime[27] = 1.0
	soundtime[28] = 0.8
	soundtime[29] = 0.6	
	soundtime[30] = 1.0
	soundtime[31] = 1.2
	soundtime[32] = 1.2
	soundtime[33] = 1.4
	soundtime[34] = 1.6
	soundtime[35] = 1.4
	soundtime[36] = morsespace
	
	AddLetter("A", "L", "L", " ", "H", "A", "I", "L", " ") ; 9
	AddLetter("T", "H", "E", " ", "E", "N", "C", "L", "A", "V") ; 10
	AddLetter("E", " ")	
	
	Self.StartTimer(0.1, playTimerID)	
EndFunction

Event OnInit()	
	InitializeVariables()
EndEvent
