GTA Vice City > Программирование

Делитель координат paths.ipl

(1/2) > >>

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:
Попробуй теперь.

Навигация

[0] Главная страница сообщений

[#] Следующая страница

Перейти к полной версии