GTA Vice City > Программирование
Делитель координат paths.ipl
aleks926820:
Короче говоря от нефиг делать набросал программу для деления координат путей в paths.ipl. Особой ценности не несет, но думаю пригодится тем,кто любит поломать границы карты\путей для каких-то целей). Написана на палеолитском языке TurboBasic 1.0. Естественно,программа 16 разрядная,так что для запуска программы на 64 битных ОСях потребуется DosBox 0.73. Суть такова. Допустим с помощью Limit Adjuster 2.0 были расширены границы карты и путей в 2 раза. Берем файл path1.exe из архива и кладем рядом с paths.ipl. Затем открываем paths.ipl и удаляем вначале файла всякие inst end cull end и тп. Оставляем только path.(https://pp.userapi.com/c638430/v638430655/42509/EL6JZ3S-lx0.jpg).Затем опускаемся вниз файла и удаляем end.Готово.Теперь просто запускаем path1.exe. Программа попросит ввести коэффициент деления.Поскольку мы расширили границы в 2 раза,то вводим с клавиатуры без запятых и тп цифру 2.Жмем Enter.И через секунд 5-10 появится paths2.ipl с деленными координатами.Открываем paths2.ipl,опускаемся вниз и пишем end.Готово.Файл готов к употреблению игрой (https://pp.userapi.com/c638430/v638430655/42501/sTqfAtrH6ls.jpg).Программа толком не дописана:нет возможности записать end в конец paths2.ipl,и при делении координат программа оставляет в координатах кучу знаков после запятой. Но игра такой файл читает без проблем.Надеюсь,кому-нибудь пригодится.
UPD от 28.05.2017.Поправил программу.Теперь программа не оставляет большого количества знаков после запятых (хотя,конечно,кое где проскакивают длинные значения),вроде как записывает end в конец.Исходный paths.ipl теперь не надо редактировать (но если есть комментарий типа "# ipl file generated from paths.max" то его надо удалить).
Shagg_E:
Охх. Прикольно, но столько сложностей...
Хотя - я на C++ и такое не смогу написать, так что, если приспичит - буду либо юзать эту прогу с бубном и плясками, либо улучшать скиллы программирования...
DK:
C++ + Qt.
--- Код: C++ ---#include "VC_PathsDivider.h"#include <QPushButton>#include <QLineEdit>#include <QDoubleSpinBox>#include <QFileDialog>#include <QTextStream> VC_PathsDivider::VC_PathsDivider(QWidget *parent) : QMainWindow(parent) { // Размеры и название окна setMinimumSize(400, 75); setMaximumSize(400, 75); setWindowTitle("GTA Vice City Paths Divider"); // Элементы - строка, 2 кнопки и переключатель QLineEdit *lePath = new QLineEdit(this); QPushButton *btnBrowse = new QPushButton("Browse...", this); QPushButton *btnDivide = new QPushButton("Divide", this); QDoubleSpinBox *sbDivider = new QDoubleSpinBox(this); // Расположение lePath->setGeometry(10, 10, 300, 20); btnBrowse->setGeometry(320, 7, 70, 25); btnDivide->setGeometry(200, 40, 190, 25); sbDivider->setGeometry(10, 42, 180, 20); // При нажатии на "Browse..." connect(btnBrowse, &QPushButton::clicked, [=]() { lePath->setText(QFileDialog::getOpenFileName(this, "Select paths.ipl file", "", "IPL files (*.ipl)")); }); // При нажатии на "Divide" connect(btnDivide, &QPushButton::clicked, [=]() { btnDivide->setEnabled(false); // временно "выключаем" кнопку if (!lePath->text().isEmpty() && sbDivider->value() != 0 && sbDivider->value() != 1) { // если строка не пустая, а делитель не равен '0' или '1' QFile inputFile(lePath->text()); if (inputFile.open(QIODevice::ReadOnly)) { // если файл открылся QStringList outputLines; // список строк (пока что пустой), которые будут записаны в выходной файл while (!inputFile.atEnd()) { // пока не достигнем окончания файла outputLines.append(inputFile.readLine()); // записываем строку в список if (outputLines.last().startsWith("path")) { // если открывается секция 'path' outputLines.append(inputFile.readLine()); // следующая за 'path' строка while (!outputLines.last().startsWith("end")) { // читаем секцию, пока не наткнемся на 'end' for (unsigned int i = 0; i < 12; ++i) { // следуюшие 12 строк QString line = inputFile.readLine(); // получаем строку QStringList lineValues = line.split(','); // разбиваем на части for (unsigned int comp = 3; comp <= 5; ++comp) // делим 4-ый, 5-ый, 6-ой компонент (x,y,z) lineValues[comp] = QString(' ') + QString::number(lineValues[comp].toDouble() / sbDivider->value()); outputLines.append(lineValues.join(',')); // собираем обратно в одну строку и добавляем в список } outputLines.append(inputFile.readLine()); } } } inputFile.close(); QString outputPath = QFileDialog::getSaveFileName(this, "Save to file", lePath->text(), "IPL files(*.ipl)"); if(!outputPath.isEmpty()){ QFile outputFile(outputPath); if (outputFile.open(QIODevice::WriteOnly)) { // если файл открылся QTextStream outStream(&outputFile); for(QString &str : outputLines) // записываем строки из списка в новый файл outStream << str; } outputFile.close(); } } } btnDivide->setEnabled(true); // "включаем" кнопку обратно });}
https://github.com/DK22Pac/vc-paths-divider/releases/download/1.0/VC_PathsDivider.rar
Весь код https://github.com/DK22Pac/vc-paths-divider
Shagg_E:
--- Цитата: DK от Май 17, 2017, 03:35:44 pm ---C++ + Qt.
https://github.com/DK22Pac/vc-paths-divider/releases/download/1.0/VC_PathsDivider.rar
Весь код https://github.com/DK22Pac/vc-paths-divider
--- Конец цитаты ---
Блин, у меня вечно какие-то проблемы...
DK:
Попробуй теперь.
Навигация
Перейти к полной версии