Автор Тема: Делитель координат paths.ipl  (Прочитано 3535 раз)

Оффлайн aleks926820

  • Проверенный
  • *
  • Сообщений: 27
  • Репутация: +7/-0
    • Просмотр профиля
Делитель координат paths.ipl
« : Май 08, 2017, 01:36:51 pm »
Короче говоря от нефиг делать набросал программу для деления координат путей в 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" то его надо удалить).
« Последнее редактирование: Май 28, 2017, 07:48:59 pm от aleks926820 »

Оффлайн Shagg_E

  • Администратор
  • Постоялец
  • *****
  • Сообщений: 705
  • Репутация: +24/-4
  • Изобретательный Рукожопъ
    • Просмотр профиля
    • NewRockstar
Re: Делитель координат paths.ipl
« Ответ #1 : Май 17, 2017, 08:05:42 am »
Охх. Прикольно, но столько сложностей...
Хотя - я на C++ и такое не смогу написать, так что, если приспичит - буду либо юзать эту прогу с бубном и плясками, либо улучшать скиллы программирования...

Оффлайн DK

  • Новичок
  • **
  • Сообщений: 234
  • Репутация: +328/-0
    • dk22pac
    • Просмотр профиля
Re: Делитель координат paths.ipl
« Ответ #2 : Май 17, 2017, 03:35:44 pm »
C++  + Qt.

Код: C++
  1. #include "VC_PathsDivider.h"
  2. #include <QPushButton>
  3. #include <QLineEdit>
  4. #include <QDoubleSpinBox>
  5. #include <QFileDialog>
  6. #include <QTextStream>
  7.  
  8. VC_PathsDivider::VC_PathsDivider(QWidget *parent) : QMainWindow(parent) {
  9.     // Размеры и название окна
  10.     setMinimumSize(400, 75);
  11.     setMaximumSize(400, 75);
  12.     setWindowTitle("GTA Vice City Paths Divider");
  13.  
  14.     // Элементы - строка, 2 кнопки и переключатель
  15.     QLineEdit *lePath = new QLineEdit(this);
  16.     QPushButton *btnBrowse = new QPushButton("Browse...", this);
  17.     QPushButton *btnDivide = new QPushButton("Divide", this);
  18.     QDoubleSpinBox *sbDivider = new QDoubleSpinBox(this);
  19.  
  20.     // Расположение
  21.     lePath->setGeometry(10, 10, 300, 20);
  22.     btnBrowse->setGeometry(320, 7, 70, 25);
  23.     btnDivide->setGeometry(200, 40, 190, 25);
  24.     sbDivider->setGeometry(10, 42, 180, 20);
  25.  
  26.     // При нажатии на "Browse..."
  27.     connect(btnBrowse, &QPushButton::clicked, [=]() {
  28.         lePath->setText(QFileDialog::getOpenFileName(this, "Select paths.ipl file", "", "IPL files (*.ipl)"));
  29.     });
  30.  
  31.     // При нажатии на "Divide"
  32.     connect(btnDivide, &QPushButton::clicked, [=]() {
  33.         btnDivide->setEnabled(false); // временно "выключаем" кнопку
  34.         if (!lePath->text().isEmpty() && sbDivider->value() != 0 && sbDivider->value() != 1) { // если строка не пустая, а делитель не равен '0' или '1'
  35.             QFile inputFile(lePath->text());
  36.             if (inputFile.open(QIODevice::ReadOnly)) { // если файл открылся
  37.                 QStringList outputLines; // список строк (пока что пустой), которые будут записаны в выходной файл
  38.                 while (!inputFile.atEnd()) { // пока не достигнем окончания файла
  39.                     outputLines.append(inputFile.readLine()); // записываем строку в список
  40.                     if (outputLines.last().startsWith("path")) { // если открывается секция 'path'
  41.                         outputLines.append(inputFile.readLine()); // следующая за 'path' строка
  42.                         while (!outputLines.last().startsWith("end")) { // читаем секцию, пока не наткнемся на 'end'
  43.                             for (unsigned int i = 0; i < 12; ++i) { // следуюшие 12 строк
  44.                                 QString line = inputFile.readLine(); // получаем строку
  45.                                 QStringList lineValues = line.split(','); // разбиваем на части
  46.                                 for (unsigned int comp = 3; comp <= 5; ++comp) // делим 4-ый, 5-ый, 6-ой компонент (x,y,z)
  47.                                     lineValues[comp] = QString(' ') + QString::number(lineValues[comp].toDouble() / sbDivider->value());
  48.                                 outputLines.append(lineValues.join(',')); // собираем обратно в одну строку и добавляем в список
  49.                             }
  50.                             outputLines.append(inputFile.readLine());
  51.                         }
  52.                     }
  53.                 }
  54.                 inputFile.close();
  55.                 QString outputPath = QFileDialog::getSaveFileName(this, "Save to file", lePath->text(), "IPL files(*.ipl)");
  56.                 if(!outputPath.isEmpty()){
  57.                     QFile outputFile(outputPath);
  58.                     if (outputFile.open(QIODevice::WriteOnly)) { // если файл открылся
  59.                         QTextStream outStream(&outputFile);
  60.                         for(QString &str : outputLines) // записываем строки из списка в новый файл
  61.                             outStream << str;
  62.                     }
  63.                     outputFile.close();
  64.                 }
  65.             }
  66.         }
  67.         btnDivide->setEnabled(true); // "включаем" кнопку обратно
  68.     });
  69. }

https://github.com/DK22Pac/vc-paths-divider/releases/download/1.0/VC_PathsDivider.rar
Весь код https://github.com/DK22Pac/vc-paths-divider
Plugin-SDK https://github.com/DK22Pac/plugin-sdk

Discord-сервер по plugin-sdk и программированию в GTA
RU https://discord.gg/QEesDGb
ENG https://discord.gg/zaVqFQv

Оффлайн Shagg_E

  • Администратор
  • Постоялец
  • *****
  • Сообщений: 705
  • Репутация: +24/-4
  • Изобретательный Рукожопъ
    • Просмотр профиля
    • NewRockstar

Оффлайн DK

  • Новичок
  • **
  • Сообщений: 234
  • Репутация: +328/-0
    • dk22pac
    • Просмотр профиля
Re: Делитель координат paths.ipl
« Ответ #4 : Май 17, 2017, 07:00:18 pm »
Попробуй теперь.
Plugin-SDK https://github.com/DK22Pac/plugin-sdk

Discord-сервер по plugin-sdk и программированию в GTA
RU https://discord.gg/QEesDGb
ENG https://discord.gg/zaVqFQv

Оффлайн Shagg_E

  • Администратор
  • Постоялец
  • *****
  • Сообщений: 705
  • Репутация: +24/-4
  • Изобретательный Рукожопъ
    • Просмотр профиля
    • NewRockstar
Re: Делитель координат paths.ipl
« Ответ #5 : Май 17, 2017, 10:31:25 pm »
Теперь всё нормально. Работает, протестил!



P.S. Qt заинтересовал... Теперь буду знать, как правильно пилятся подобные вещи, спасибо!
« Последнее редактирование: Май 17, 2017, 10:40:42 pm от Shagg_E »