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
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:
kun tekee omaa kieltään, se ei tarkoita sitä, että sitä osaa kirjoittaa.. oli sekoillut scriptini kanssa ! mutta mutta julistan näin kyseisen koodin vapaaksi(, laittakaa nimeni peliin.)