00057. Работа с INI-файлами ( запись и считывание )

Работа с INI-файлами ( запись и считывание )|В этом укроке мы напишем два скрипта, которые будут использовать ini-файл. Первый будет записывать данные в файл, другой - считывать.|wmysterio|wmysterio||||Очень часто скриптеры хранят какие-то данные в файле. Например: я в моде NFS GTA RACE хранил стартера для миссий, а также текущую модель, уважение в ini-файле.

Рассмотрим основные опкоды. Сначала, обычно, проверяют на существование файла опкодом:

0AAB: file_exists "CLEO\temp.ini"

Здесь: "CLEO\temp.ini" - путь к нужному файлу

Дальше, обычно, если файла не найден, то скриптеры завершают поток, чтобы скрипт без файла не работал. Если файл найден - то можно.

Первый наш скрипт будет записывать данные. Давайте в файле будет хранится состояние жизни и брони CЖ. Другой скрипт будет считывать с того же самого файла данные и выводить их на экран.

Но сначала рассмотрим структуру ini-файла. Обычно он делится на секции - текст, написанный в квадратных скобках:

ini
[SECTION]

Количество секций неограниченно; а могут и вовсе отсутствовать.

В каждой секции имеются ключевые слова, которым заданы значения типа "int", "float", "string" ( целое, дробное, строка ). Сначала пишем ключевое слово, затем символ =, а потом само значение. Каждое ключевое слово пишется с новой строки.

ini
key_int = 25
key_float = -0.23
key_string = WMYSTERIO

Сложив всё вместе, мы получим полную структуру ini-файла:

Примеры INI-файлов:

Пример 1

Пример 2

```

ini [SECTION] key_int = 25 key_float = 1.83 key_string = WMYSTERIO

</td><td>

ini ; Основные данные об актёре [Coord_Actor] position_x = -190.35 position_y = 2004.2345 position_z = 39.0 actor_angle = 180.0

[Data_Actor] Health = 50 Armor = 100 Name = Smoke

</td></tr>
</tbody></table>

Как и в Санни Билдере, в ini-файлах есть комментарии. Всё что находится после символа **;** будет игнорироваться. Вроде, с этим не должно возникнуть проблем, поэтому рассмотрим опкоды для записи значений в ini-файл:

0AF1: write_int 25 to_ini_file "CLEO\temp.ini" section "SECTION" key "key_int" 0AF3: write_float 1.85 to_ini_file "CLEO\temp.ini" section "SECTION" key "key_float" 0AF5: write_string "MY NAME - WMYSTERIO" to_ini_file "CLEO\temp.ini" section "SECTION" key "key_string"



<div class="panel panel-default">
 <div class="panel-body">
Здесь:<br>
0AF1 - опкод записи целого числа в файл<br>
0AF3 - опкод записи дробного числа в файл<br>
0AF5 - опкод записи строки в файл<br>
"CLEO&#92;temp.ini" - указывается полный путь к файлу<br>
"SECTION" - указывается секция, в которую нужно записать данные<br>
"key_int", "key_float", "key_string" - указываются ключи. Именно в них будут хранится данные
 </div>
</div>

Теперь считывание с ini-файла:

0AF0: 0@ = get_int_from_ini_file "CLEO\temp.ini" section "SECTION" key "key_int" 0AF2: 1@ = get_float_from_ini_file "CLEO\temp.ini" section "SECTION" key "key_float" 0AF4: 2@v = read_string_from_ini_file "CLEO\temp.ini" section "SECTION" key "key_string"



<div class="panel panel-default">
 <div class="panel-body">
Здесь:<br>
0AF0 - в переменную считываются целые значения с файла<br>
0AF2 - в переменную считываются дробные значения с файла<br>
0AF4 - в переменную считываются строки с файла<br>
"CLEO&#92;temp.ini" - указывается полный путь к файлу<br>
"SECTION" - указывается секция, с которой будет считано значение<br>
"key_int", "key_float", "key_string" - указываются ключи. Именно из них будут передаваться данные в переменную.
 </div>
</div>

Для строк всегда возле переменных указывайте префикс **v**. Опкоды рассмотрели, теперь к примерам :) Скрипт, который будет записывать состояние жизни и брони СЖ в ini-файл:

{$CLEO} 0000:

:WRITE thread 'WRITE' wait 0 if 0AAB: file_exists "CLEO\TEMP.ini" // если файл не найден, то завершаем скрипт jf @WRITE_END

:WRITE_1 wait 0 0@ = actor.Health($PLAYER_ACTOR) 04DD: 1@ = actor $PLAYER_ACTOR armour 0AF1: write_int 0@ to_ini_file "CLEO\TEMP.ini" section "CJ" key "Health" // запишем данные в файл 0AF1: write_int 1@ to_ini_file "CLEO\TEMP.ini" section "CJ" key "Armour" jump @WRITE_1

:WRITE_END wait 0 0A93: end_custom_thread



Скрипт, которые считывает данные из файла и выводит на экран состояние жизни и брони CJ:

{$CLEO} 0000:

:READ thread 'READ' wait 0 if 0AAB: file_exists "CLEO\TEMP.ini" // Если файл не найден - завершаем скрипт jf @READ_END

:READ_1 wait 0 03F0: enable_text_draw 1 // Включаем возможность рисования на экране 0AF0: 0@ = get_int_from_ini_file "CLEO\TEMP.ini" section "CJ" key "Health" // Считываем данные из файла 0AF0: 1@ = get_int_from_ini_file "CLEO\TEMP.ini" section "CJ" key "Armour" {-- Выводим данные на экран --} 045A: draw_text_1number 20.0 20.0 GXT 'HEA_1' number 0@ // text: health 1 045A: draw_text_1number 20.0 30.0 GXT 'BRO_1' number 1@ // text: armour 1 jump @READ_1

:READ_END wait 0 0A93: end_custom_thread



Результат, как всегда, положительный :) Всё работает как часики, и на экран выводится состояние CJ:

<!--IMG1--><img src="/_pu/0/53472615.png" /><!--IMG1-->

Интересные факты:


- ini-файл можно редактировать во время игры;
- расширение файла не обязательно должно быть "*.ini", можно и как "*.bag", "*.fix" и т.п;


На этом урок окончен. Тестируйте ;)|3880|1|0|53472615`png`168`161

`||rabota_s_ini_fajlami_zapis_i_schityvanie|1499595834

Last updated