Показать сообщение отдельно
Старый 07.12.2008, 19:03   #99
ABTOMAT
Ференька
 
Аватар для ABTOMAT
 
Регистрация: 26.01.2007
Адрес: улица Пушкина дом Колотушкина
Сообщений: 10,743
Написано 5,461 полезных сообщений
(для 15,676 пользователей)
Ответ: Логово Тайна Конопли

Ну, дайте и я пиписькой померяюсь
Function LoadDialogPresets(filename$)
	; Функция, загружающая пресеты из текстового файла.
	Local Comment ; Отвечает за каменты. Текст внутри камертов не учитывается
	Local Quot ; Отвечает за кавычки. Текст в кавычках, даже соответствующий операторам, не учитывается.
	File = OpenFile(filename)
	If File Then
		; Читаем строки по очереди
		Repeat
			L$ = ReadLine(File)
			
			CommentStart = 1 ; символ начала длинного камента
			; Ищем каменты и выкидываем их.
			For i = 1 To Len(L)
				S$ = Mid(L, i,1)
				Select S
					Case Chr(34) ; Кавычки
						If Not Comment Then
							Quot = Not Quot ; Открываем или закрываем кавычки
						End If
					Case "{" ; Открыт длинный камент
						If Not Quot Then
							If Comment = 0 Then Comment = 1
							CommentStart = i
						End If
					Case "}" ; Закрыт длинный камент
						If Not Quot Then
							If Comment = 1 Then Comment = 0 ; Если был включен длинный камент, выключаем его
							L = Mid(L,1,CommentStart-1)+Mid(L,i+1, Len(L)) ; Выкидываем его нахер
							i = CommentStart-1
						End If
					Case "/" ; Возможно, короткий камент						
						S$ = Mid(L, i,2)
						Select S
							Case "//" ; Если это короткий камент, то отрезаем полностью строку справа от этого знака.
								L = Mid(L,1,i-1)
								Exit
						End Select
				End Select
				If i = Len(L) And Comment Then
					L = Mid(L,1,CommentStart-1)
				End If				
			Next
			If Not L = "" Then ; Непосредственно ищем и выполняем команды.
				Quot = 0
				CommandStart = 1
				ParametersStart = 1				
				For i = 1  To Len(L)
					S$ = Mid(L, i,1)
						Select S
							Case Chr(34) ; Кавычки
								Quot = Not Quot
							Case "(" ; Команда окончена, начаты параметры
								If Not Quot
									Command$ = Mid(L,CommandStart, i-CommandStart)
									ParametersStart = i+1
								End If
							Case ")" ; Параметры оконцены, можно их читать								
								If Not Quot								
									Parameters$ = Mid(L,ParametersStart, i-ParametersStart)
									CommandStart = i+1
									; Обрабатываем команду
									; Выкидываем пробелы
									Command = Replace(command," ","")
									ScriptParseParameters(parameters, 1)
                                              ; тут выполняем команду
											Select Upper(command)
                                                  Case "VERSION"
                                                       If Upper(ScriptParameters(0)) <> Upper(GameVersion) Then
                                                            MB = api_MessageBox (0, "Версия файла диалога: "+Chr(34)+filename+Chr(34)+" - "+Chr(34)+ScriptParameters(0)+Chr(34)+Chr(13)+"Версия игры: "+Chr(34)+GameVersion+Chr(34)+Chr(13)+"Несовпадение версий игры и скрипта может быть причиной ошибок!"+Chr(13)+"Желаете продолжить загрузку данного скрипта?","Несовпадение версий", 48+4)
									                                                            If MB = 7 Then
                                                                 Return 0
                                                            End If
                                                       End If
                                                  Case "GAME"
                                                       If Upper(ScriptParameters(0)) <> Upper(GameName) Then
                                                            MB = api_MessageBox (0, "Файла диалога: "+Chr(34)+filename+Chr(34)+" создан для игры "+Chr(34)+ScriptParameters(0)+Chr(34)+Chr(13)+"Игра: "+Chr(34)+GameName+Chr(34)+Chr(13)+"Несовпадение версий игры и скрипта может быть причиной ошибок!"+Chr(13)+"Желаете продолжить загрузку данного скрипта?","Несовпадение версий", 48+4)
                                                            If MB = 7 Then
                                                                 Return 0
                                                            End If
                                                       End If
                                                  Case "DIALOG"
                                                       If DialogProc = 0 Then
                                                            DialogProc = 1
                                                            ; Обнуляем массив параметров ответов
                                                            For k=1 To 10
                                                                 For j=0 To 2
                                                                      LDP(k,j)= ""
                                                                 Next
                                                            Next
                                                            ; Выкидываем все прошлые значения
                                                            DPQuest$ = ""
                                                            DPDuration$ = ""
                                                            If ScriptParameters(0) <> "" Then
                                                                 DPID$ = ScriptParameters(0)
                                                            Else
                                                                 api_MessageBox (0, "Ошибка в файле "+Chr(34)+filename+Chr(34)+" в строке №"+Lnum+Chr(13)+"При объявлении диалога ОБЯЗАТЕЛЬНО нужно указать его идентификатор!","Ошибка в синтаксисе", 16)
                                                            End If
                                                       Else
                                                            api_MessageBox (0, "Ошибка в файле "+Chr(34)+filename+Chr(34)+" в строке №"+Lnum+Chr(13)+"Объявление одного диалога невозможно внутри объявления другого!","Ошибка в синтаксисе", 16)
                                                       End If
                                                  Case "SETQUEST"
                                                       DPQuest$ = ScriptParameters(0)
                                                  Case "SETDURATION"
                                                       DPDur$ = Int(ScriptParameters(0))
                                                  Case "ADDANSWER"
												  	; Выясняем ближайшее пустое значенеи массива
                                                      For k=1 To 10
															If LDP(k,0) = "" Then
																LDP(k,0)=ScriptParameters(0)
																LDP(k,1)=ScriptParameters(1)
																LDP(k,2)=ScriptParameters(2)
																Exit
															End If
                                                      Next
                                                  Case "END"
												       Select Upper(ScriptParameters(0))
                                                            Case "DIALOG"
                                                                 CreateDialogPreset(DPID, DPQuest, DPDur, LDP(1,0),Int(LDP(1,1)),LDP(1,2), LDP(2,0),Int(LDP(2,1)),LDP(2,2), LDP(3,0),Int(LDP(3,1)),LDP(3,2), LDP(4,0),Int(LDP(4,1)),LDP(4,2), LDP(5,0),Int(LDP(5,1)),LDP(5,2), LDP(6,0),Int(LDP(6,1)),LDP(6,2), LDP(7,0),Int(LDP(7,1)),LDP(7,2), LDP(8,0),Int(LDP(8,1)),LDP(8,2), LDP(9,0),Int(LDP(9,1)),LDP(9,2), LDP(10,0),Int(LDP(10,1)),LDP(10,2))
																 DialogProc = 0
                                                            Case ""
                                                                 ; Конец всея
                                                                 Return
                                                            Default
                                                                 api_MessageBox (0, "Неизвестная команда: "+Chr(34)+command+" "+ScriptParameters(0)+Chr(34)+Chr(13)+"в файле: "+Chr(34)+filename+Chr(34)+Chr(13)+"Проверьте синтаксис!","Моя твоя не понимай!", 16)
                                                        End Select
                                                  Default
                                                       api_MessageBox (0, "Неизвестная команда: "+Chr(34)+command+Chr(34)+Chr(13)+"в файле: "+Chr(34)+filename+Chr(34)+Chr(13)+"Проверьте синтаксис!","Моя твоя не понимай!", 16)
                                             End Select
								End If
						End Select
				Next
			End If
		Until Eof(File)
	Else
		; Файл по какой-то причине не был загружен
		 api_MessageBox (0, "Не найден файл диалогов: "+Chr(34)+filename+Chr(34)+Chr(13)+"Проверьте путь!","Савсем нет файлу, насяйника (", 16)
	End If
End Function
__________________
Мои проекты:
Анальное Рабство
Зелёный Слоник
Дмитрий Маслов*
Различие**
Клюква**

* — в стадии разработки
** — в стадии проектирования
Для проектов в стадии проектирования приведены кодовые имена

(Offline)
 
Ответить с цитированием
Эти 2 пользователя(ей) сказали Спасибо ABTOMAT за это полезное сообщение:
Dzirt (28.01.2009), johnk (27.01.2009)