Bgraahg!! Mystiset MAVit, syyt hukassa.

Voit pyytää apua ohjelmointiongelmiin täältä.
Post Reply
JATothrim
Tech Developer
Tech Developer
Posts: 606
Joined: Tue Aug 28, 2007 6:46 pm
Location: Kuopio

Bgraahg!! Mystiset MAVit, syyt hukassa.

Post by JATothrim »

Lainatakseni topiikin otsikkoa: Bgraahg!! Mystinen MAV, syy hukassa. Toivoin, että saisin scriptimoottorini jyräämään vikkokisan aikana, mutta ei. Onnistuin eristämään vian 98% oikeaan kohtaan koodia, mutta engine "ei löydä" olemassa olevaa tyyppi instanssia, vaikka voin kyllä printata sen tiedot näytölle! vielä lisäksi vertaan niitä ehto lauseen ulkopuolella, ja silloin kyllä pelittää. :x Homma siis tuntuu vihjaavan siihen että kyseessä on CB bugi, tyypit tuntuvat kusevan pahasti... viestin kirjoituksen aikana sain ("ihme?") virheen kierrettyä (on yhtäkuin purkka), mutta homma kusee vieläkin, auttakaa olkaa hyvä. :mrgreen:

Koko hilavitkutin koodi, joka on täysin minun, älkää siis varastako sitä:

Code: Select all

Type room_variable
	Field name$
	Field value%
EndType

Type room_message
	Field name$
	Field txt$
EndType

//ehto.
Type room_conditional
	Field depth%		'ehto ehdon sisällä?
	Field check_type%	'ehdon tyyppi
	Field jmp_cond%		'hyppy ehtoon.
	Field next_cond%	'seuraavat ehdot.
	Field command_list%	'komento listan alku.
	Field param_num1%
	Field param_num2%
	Field param_num3%
	Field param_num4%
	Field param_txt1$
EndType

//ehdon komento.
Type conditional_command
	Field act_type%		'komennon tyyppi.
	Field act_data%		'komentoon sidottu Data.
	Field next_command%	'seuraava komento.
EndType


//"pino" ehto lauseen parserointia varten.
Type conditional_stack
	Field ptr%
EndType

Function Push_conditional(pCond%)
	cond_stck.conditional_stack = New(conditional_stack)
	cond_stck\ptr = pCond
EndFunction

Function Pop_conditional()
	cond_stck.conditional_stack = Last(conditional_stack)
	If cond_stck<>NULL
		ptr% = cond_stck\ptr
		Delete cond_stck
		Return ptr
	EndIf
	Return 0
EndFunction

Function Peek_conditional(level% = 0)
	cond_stack.conditional_stack = Last(conditional_stack)
	If level>0
		While cond_stack <> NULL And level>0
			level = level -1
			cond_stack = Before(cond_stack)
		Wend
	EndIf
	If cond_stack <> NULL Then Return cond_stack\ptr
	Return 0
EndFunction

//ehtojen tarksitus tyypit
Const CHECK_POWERSWITCH = 1
Const CHECK_VARS_EQUAL = 2
//ehto-komentojen tyypit.
Const ACT_SHOWMESSAGE = 1
Const ACT_TEST = 2

Function LogFile(txt$, msg% = 0, clear% = 0)
	If clear
		f% = OpenToWrite("Game_Log_File.txt")
	Else
		f% = OpenToEdit("Game_Log_File.txt")
		SeekFile f, FileSize("Game_Log_File.txt")
	EndIf
	If msg 
		WriteLine f, txt
	Else
		WriteLine f,"Error: "+txt
	EndIf
	CloseFile f
EndFunction

//lataa skriptin ja suorittaa ehdottomat komennot.
Function LoadScript(file$)
	If FileExists(file)=0 Then MakeError "Room script "+Chr(34)+file+Chr(34)+" won't found!"
	f% = OpenToRead(file$)
	
	conditional_depth% = 0
	conditional.room_conditional = NULL
	stack_cond.room_conditional = NULL
	command_link.conditional_command = NULL
	poped_cond = False
	While Not EOF(f)
		//luetaan rivi tiedostosta ja siistitään se.
		rawcommand$ = Trim(Lower(ReadLine(f)))
		rawcommand = Replace(rawcommand,"  ", "")
		//erotellaan komento ja parametrit
		command$ = GetWord(rawcommand, 1, " ")
		rawcommand = Replace(rawcommand, command+" ", "")
		rawcommand = Replace(rawcommand, " ", "")
		//extraktoidaan parametrit
		param1$ = GetWord(rawcommand, 1, ",")
		param2$ = GetWord(rawcommand, 2, ",")
		param3$ = GetWord(rawcommand, 3, ",")
		param4$ = GetWord(rawcommand, 4, ",")
		param5$ = GetWord(rawcommand, 5, ",")
		param6$ = GetWord(rawcommand, 6, ",")
		param7$ = GetWord(rawcommand, 7, ",")
		//tehdään skripti tiedoston komennot
		Select command
		//muuttuja
		Case "#variable"
			variable.room_variable = New(room_variable)
			variable\name = param1
			variable\value = Int(param2)
			LogFile("## Parsed variable, name:"+Chr(34)+param1+Chr(34)+" value="+Int(param2),1)
		//testi komento. :D
		Case "#test"
			//lisätään pinossa päällimmäisen ehdon listaan.
			stack_cond.room_conditional = ConvertToType(Peek_conditional())
			If stack_cond<>NULL
				cond_command.conditional_command = New(conditional_command)
				cond_command\act_type = ACT_TEST
				msg.room_message = New(room_message)
				msg\name = param1
				msg\txt = param2  //huomaa sijoitus :D
				cond_command\act_data = ConvertToInteger(msg)
				
				If stack_cond\command_list = 0
					stack_cond\command_list = ConvertToInteger(cond_command)
				Else
					command_link = ConvertToType(stack_cond\command_list)
					While command_link\next_command <> 0
						command_link = ConvertToType(command_link\next_command)
					Wend
					
				EndIf
				LogFile("### parsed in conditional #test",1)
				
			EndIf
		//kahden muuttujan ehto.
		Case "#if_vars_equal"
			//kokeilu 3, "hyppy linkitys".
			stack_cond.room_conditional = ConvertToType(Peek_conditional())
			conditional_depth = conditional_depth + 1
			conditional = New(room_conditional)
			conditional\depth = conditional_depth
			conditional\check_type = CHECK_VARS_EQUAL
			
			last_cond.room_conditional = Before(conditional)
			If last_cond <> NULL
				//voidaan linkittää
				last_cond\next_cond = ConvertToInteger(conditional)
				LogFile(">>>Linked conditional To flow",1)
				//linkitetään hyppy edellisestä saman syvyisestä ehdossta tähän.
				icond.room_conditional = last_cond
				While icond <> NULL
					If icond\depth = conditional_depth And ConvertToType(icond\jmp_cond) = NULL
						icond\jmp_cond = ConvertToInteger(conditional)
						LogFile(">>>Linked conditional To jmp",1)
						Exit
					EndIf
					icond = Before(icond)
				Wend
			EndIf
			
			 
			//haetaan listasta todelliset osoitteet.(nopeaa käsitellä, mutta mavittaa vitusti :@ *räyh* )
			Succeed = 0
			ivariable.room_variable = First(room_variable)
			While ivariable <> NULL And Succeed<2
				isok = (ivariable\name = param1)
				If isok
					conditional\param_num1 = ConvertToInteger(ivariable)
					Succeed = Succeed +1
				EndIf
				isok = (ivariable\name = param2)
				If isok
					conditional\param_num2 = ConvertToInteger(ivariable)
					Succeed = Succeed +1
				EndIf
				ivariable = After(ivariable)
			Wend
			If Succeed <> 2 Then MakeError "zdfzsdfgszxgbf!!!"
			//lisätään pinoon.
			Push_conditional(ConvertToInteger(conditional))
			LogFile("### Parsed conditional begin",1)
		//#If... #EndIf päättää If komennon.
		Case "#ifend"
			Pop_conditional()
			conditional_depth = conditional_depth - 1
			popped = True
			LogFile("### Parsed conditional End",1)
		EndSelect
	Wend
	//tarkistetaan 
	If Peek_conditional()<>0 Then LogFile("Irrregular #If And #ifend commands!")
	CloseFile f
	gRoom_CurrentScript = file
EndFunction

//luo komennon ja linkittää sen pinossa päällimmäiseen ehtoon.
Function MakeCommand(ACT_TYPE, ACT_DATA)
	stack_cond.room_conditional = ConvertToType(Peek_conditional())
	If stack_cond <> NULL
		command.conditional_command = New(conditional_command)
		command\act_type = ACT_TYPE
		command\act_data = ACT_DATA
		If stack_cond\command_list = 0
			stack_cond\command_list = ConvertToInteger(command)
		Else
			command_link.conditional_command = ConvertToType(stack_cond\command_list)
			While command_link\next_command <> 0
				command_link = ConvertToType(command_link\next_command)
			Wend
			
		EndIf
	EndIf
EndFunction

Function Run_Command(ATC_TYPE, ACT_DATA)
	If ATC_TYPE = ACT_TEST
		msg.room_message = ConvertToType(ACT_DATA)
		Print "text:"+msg\txt  //eikä tulosta !!! ei sitten mitään !!!
		Print "#test called.."
	EndIf
EndFunction

Print "Parsing..."
LogFile("",0,1)
LoadScript("test_script.txt")
Print "Done."

//Testi, linkitykset!
'cond.room_conditional = First(room_conditional)
'jmp_cond.room_conditional = ConvertToType(cond\jmp_cond)
'While cond <> NULL
'	Print "link "+cond\depth+" flow:"+(cond<>NULL)
'	Print "link jmp:"+(jmp_cond<>NULL)
'	cond = ConvertToType(cond\next_cond)
'	If cond<>NULL Then jmp_cond = ConvertToType(cond\jmp_cond) Else jmp_cond=0
'Wend
Print "runnig.."
Gosub Run_Script
Print "ok."
WaitKey
End


Run_Script:
	cond.room_conditional = First(room_conditional)
	While cond <> NULL 'ajetaan kunnes ehdot loppuvat.
		If cond\check_type = CHECK_VARS_EQUAL
			var1.room_variable = ConvertToType(cond\param_num1)
			var2.room_variable = ConvertToType(cond\param_num2)
			If var1=NULL Or var2=NULL Then MakeError "fatal mem access mistake wtf!?!"
			//tarkistetaan
			Print "doing check.."
			If var1\value = var2\value
				
				//suoritetaan komennot
				cond_command.conditional_command = ConvertToType(cond\command_list)
				While cond_command <> NULL
					Run_Command(cond_command\act_type, cond_command\act_data)
					cond_command = ConvertToType(cond_command\next_command)
				Wend
				//hypätään eteenpäin.
				cond = ConvertToType(cond\next_cond)
				Print "continuing.."
			Else
				//hyptään yli
				cond = ConvertToType(cond\jmp_cond)
				Print "jumping.."
			EndIf
		Else
			Exit
		EndIf
	Wend
Return
Ja sen tarvitsema scripti:

Code: Select all

#variable yks, 1
#variable kaks, 2
#variable kol, 3
#variable nel, 4
#variable vis, 5

#if_vars_equal yks, yks
 #test zomg
 #test goomg
 #test doomg

#if_vars_equal kol, kol
 #test phew
#ifend
#ifend

#if_vars_equal kol, nel
 #test buumg
#ifend

#if_vars_equal vis, yks
 #test wtf
 #test ok.
#ifend
EDIT:

:mrgreen: :mrgreen: kun tekee omaa kieltään, se ei tarkoita sitä, että sitä osaa kirjoittaa.. oli sekoillut scriptini kanssa ! :lol: :lol: mutta mutta julistan näin kyseisen koodin vapaaksi(, laittakaa nimeni peliin.)

-On selkeästi impulsiivinen koodaaja joka...
ohjelmoi C++:lla rekursiivisesti instantioidun templaten, jonka jokainen instantiaatio instantioi sekundäärisen singleton-template-luokan, jonka jokainen instanssi käynistää säikeen tulostakseen 'jea'.
Post Reply