Substring selecting the wrong areas?

:information_source: Attention Topic was automatically imported from the old Question2Answer platform.
:bust_in_silhouette: Asked By lyji
extends Node


var dialogue = ["i am [i]extremely[/i] confused but that's ok", 

		
var dialogueIndex := 0
var stringFinished := false
var textSpeed := .005


func _ready(): 
	load_dialogue()
	
	
func _process(delta):
	$"textIndicator".visible = stringFinished
	if Input.is_action_just_pressed("ui_accept"):
		load_dialogue()


func load_dialogue():
	if dialogueIndex < dialogue.size():
		$TextureRect.set_visible(true)
		stringFinished = false
		var temp := ""
		var foundBold = -1
		var boldDone = false
		
		$dialogueText.clear()
		$dialogueText.set_visible(true)
		$charText.set_visible(true)
		
		var t = Timer.new()
		t.set_wait_time(textSpeed)
		t.set_one_shot(true)
		
		for letter in dialogue[dialogueIndex]:
			
			
			temp = dialogue[dialogueIndex]
			var findBold = temp.find("[i]")
			var findEndBold = temp.find("[/i]")
			var restOfSentence = ""
			
			if (temp.find("[i]") != -1) and (boldDone == false):
				stringFinished = false
				var beginning = temp.substr(0, findBold)
				var boldedEnd
				

				if findEndBold != -1:

					restOfSentence = temp.substr(findEndBold+4, temp.length())
					boldedEnd = temp.substr(findBold+3, findEndBold)
					
				elif findEndBold == -1:
					boldedEnd = temp.substr(findBold+3, temp.length())
					
					
				$dialogueText.set_bbcode("") 
				
				for letter in beginning:
					t.start()
					$dialogueText.append_bbcode(letter)
					yield(t, "timeout")
					boldDone = true
					
					
				for letter in boldedEnd:
					t.start()
					$dialogueText.append_bbcode("[i]" + letter + "[/i]")
					yield(t, "timeout")
					boldDone = true
					

				for letter in restOfSentence:
					t.start()
					$dialogueText.append_bbcode(letter)
					yield(t, "timeout")
					boldDone = true
					
				$dialogueText.append_bbcode(beginning + "\n" + boldedEnd + "\n" + restOfSentence)
				stringFinished = true
				
			elif stringFinished == false:
				for letter in temp:
					t.start()
					$dialogueText.append_bbcode(letter)
					yield(t, "timeout")
					stringFinished = true
			
			
	else:
		queue_free()

	dialogueIndex += 1 

I would have used a tween function, but I wanted to add sound effects for each letter displayed. This probably isn’t the most efficient way to do it, but I wanted to get some practice in anyways.

I thought that for example:
a _ [ i ] w o r d [ / i ] .
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14

Would print something like “a word.” if I called word.substr(2,14). When I run the code it gives me the correct beginning and end but not middle.

I know it says bold in the variables, but I was just testing italics lol. Thanks in advance!

:bust_in_silhouette: Reply From: lyji
extends Node

"""
match [textSpeedInput]:
	[immediate]
		immediateText = 0
	[slow]
		textSpeed = .025
	_
		textSpeed = .005
"""


var dialogue = ["yi er san si", "wu [b]liu![/b] qi", "wo [b]de pong yo[/b]u", "[b]zai na li"]
var dialogueIndex := 0
var stringFinished := false
var textSpeed := .005
var boldDone = false
#":" makes it so that it will never change the variable type


func _ready(): 
	load_dialogue()
	#When ready, call on the load_dialogue() func and 
	#display text inside the dialogue array
	
	
func _process(delta):
	$"textIndicator".visible = stringFinished
	#Doesn't need a .play() because it is set to 
	#"Autoplay on Load" already
	if Input.is_action_just_pressed("ui_accept") and stringFinished and boldDone:
		load_dialogue()


func load_dialogue():
	if dialogueIndex < dialogue.size():
		$TextureRect.set_visible(true)
		stringFinished = false
		var temp := ""
		var foundBold = -1
		boldDone = false
		
		$dialogueText.clear()
		$dialogueText.set_visible(true)
		$charText.set_visible(true)
		
		var t = Timer.new()
		t.set_wait_time(textSpeed)
		t.set_one_shot(true)
		self.add_child(t)
		
		
		
		for letter in dialogue[dialogueIndex]:
			
			
			temp = dialogue[dialogueIndex]
			var findBold = temp.find("[b]")
			var findEndBold = temp.find("[/b]")
			var restOfSentence = ""
			
			if (findBold != -1) and (boldDone == false) :
				
				stringFinished = false
				var beginning = temp.substr(0, findBold)
				var boldedEnd
				var endCalc = (temp.substr(findEndBold, temp.length())).length()
				var frontCalc = (temp.substr(0, findBold+3)).length()
				var midLenCalc = abs(temp.length()-endCalc-frontCalc)
				#Len, not index
				
				if findEndBold != -1:
					restOfSentence = temp.substr(findEndBold+4, temp.length())
					#boldedEnd = temp.substr(findBold+3, endCalc-3)
					boldedEnd = temp.substr(findBold+3, midLenCalc)
					#Second parameter takes how many letters you want to continue for!!
					#Not the index, but still need to add one
					
					$dialogueText.set_bbcode(str("temp.length()" + str(temp.length()) + " - endCalc " + str(endCalc) +  " - frontCalc" + str(frontCalc) + " = midLenCalc" + str(midLenCalc) + "\n"))
				elif findEndBold == -1:
					boldedEnd = temp.substr(findBold+3, temp.length())
				

					
					
				#$dialogueText.set_bbcode("") 
				
				for letter in beginning:
					t.start()
					$dialogueText.append_bbcode(letter)
					yield(t, "timeout")
					boldDone = true
					
					
				for letter in boldedEnd:
					t.start()
					$dialogueText.append_bbcode("[b]" + letter + "[/b]")
					yield(t, "timeout")
					boldDone = true
					

				for letter in restOfSentence:
					t.start()
					$dialogueText.append_bbcode(letter)
					yield(t, "timeout")
					boldDone = true
					
				$dialogueText.append_bbcode("\n" + beginning + "\n" + boldedEnd + "\n" + restOfSentence)
				stringFinished = true
				
			elif stringFinished == false:
				for letter in temp:
					t.start()
					$dialogueText.append_bbcode(letter)
					yield(t, "timeout")
				stringFinished = true
				boldDone = true
			
			
					
			
	else:
		queue_free()
		#Once the load_dialogue function is broken because
		#it read the entire array, the queue will be 
		#freed and nothing will show up on screen
	dialogueIndex += 1 

Figured it out. I’ll just dump my code here in case anyone else had the same issue. I’ve been coding in Java for months so I forgot how to use substrings in Godot oops. Once I figured out the length instead of the index it worked.

dude you’re seriously a life saver lmao, I stared at my code for hours wondering why it wasn’t working lol :heart::heart::heart:

thecrazyelf5112 | 2022-01-26 07:53