Что нового

скрипт для установки модификаций в игру Мафия

Tosyk

Новичок
Сообщения
206
Репутация
0
Приступил к написанию скрипта для установки модификаций в игру Мафия.
большая часть работы была проделана тут: http://autoit-script.ru/threads/zam...fajle-na-polnoe-soderzhimoe-iz-drugogo.27342/

Как поместить в выпадающий список имена машин из INI файлов? Мой текущий скрипт:
Код:
#include <ButtonConstants.au3>
#include <EditConstants.au3>
#include <TreeViewRCH.au3>
#include <File.au3>
#include <Array.au3>

Global $aINI, $sList

Global $aNamesBlock[1][2] = [['Имя блока', 'Позиция начала записи']], $sPathRCAR = '', $sPathVehicles = ''
Global $hVehiclesRW = GUICreate('VehiclesRW', 266, 254, -1, -1)
Global $nTreeView1 = GUICtrlCreateTreeView(300, 16, 225, 177, BitOR($TVS_HASBUTTONS, $TVS_HASLINES, $TVS_LINESATROOT, $TVS_DISABLEDRAGDROP, $TVS_SHOWSELALWAYS))

Global $sFont = "Segoe UI"

Global $nNewVehicles = GUICtrlCreateLabel('Choose new car:', 12, 7, 78, 25)
Global $hNewVehCombo = GUICtrlCreateCombo("", 12, 25, 242, 23)

Global $hSpecGroup = GUICtrlCreateGroup("New car included:", 12, 60, 242, 91)
Global $nNewVehCol = GUICtrlCreateLabel('Car colors:', 30, 84, 78, 25)
Global $nNewVehCol = GUICtrlCreateLabel('4', 92, 84, 78, 25)
Global $nNewVehShd = GUICtrlCreateLabel('Shadow:', 30, 104, 78, 25)
Global $nNewVehShd = GUICtrlCreateLabel('Yes', 80, 104, 78, 25)
Global $nNewVehAud = GUICtrlCreateLabel('Sounds:', 30, 124, 78, 25)
Global $nNewVehAud = GUICtrlCreateLabel('No', 78, 124, 78, 25)
Global $nNewVehSpc = GUICtrlCreateLabel('Specifications:', 128, 84, 78, 25)
Global $nNewVehSpc = GUICtrlCreateLabel('Yes', 210, 84, 78, 25)
Global $nNewVehDam = GUICtrlCreateLabel('Damage model:', 128, 104, 78, 25)
Global $nNewVehDam = GUICtrlCreateLabel('Yes', 218, 104, 78, 25)
Global $nNewVehTex = GUICtrlCreateLabel('Textures:', 128, 124, 78, 25)
Global $nNewVehTex = GUICtrlCreateLabel('113', 180, 124, 78, 25)

Global $nMafVehicles = GUICtrlCreateLabel('Choose car to replace:', 12, 164, 150, 25)
Global $hMafVehCombo = GUICtrlCreateCombo("", 12, 182, 242, 23)

Global $nVehicles = GUICtrlCreateButton('Replace', 46, 220, 78, 25)
Global $nSblockB = GUICtrlCreateButton('Default', 137, 220, 78, 25)
;~ Global $nSBlock = GUICtrlCreateInput('', 256, 56, 233, 21)
;~ Global $nPathRCAR = GUICtrlCreateInput('', 16, 608, 473, 21, $ES_READONLY)
Global $nGetRCAR = GUICtrlCreateButton('*.RCAR', 368, 640, 123, 25)
Global $nRWVeh = GUICtrlCreateButton('Записать', 256, 312, 122, 25)
GUISetState()
Local $Icopath = @ScriptDir
Local $aIco[4] = [$Icopath & '\chk.ico', $Icopath & '\unchk.ico', $Icopath & '\rd.ico', $Icopath & '\unrd.ico']
_GUITreeViewEx_InitTV($nTreeView1)
_GUITreeViewEx_TvImg($nTreeView1, $aIco)

While 1
    Switch GUIGetMsg()
        Case 1
            Exit
         Case $nVehicles
;~             Local $sFPath = (@ScriptDir & '\tables\' & 'vehicles.bin')
;~             Local $sFObin = FileOpen($sFPath)
            $aINI = _FileListToArray(@ScriptDir, '_cm*.ini', 1)

            ; And here we get the elements into a list
            $sList = ""
            For $i = 0 To UBound($aINI,1) -1
                $sList &= "|" & $aINI[$i][0]
            Next

            ; And fill it
            GUICtrlSetData($nNewVehicles, $sList)

;~             If IsArray($aINI) Then
;~                 _ArrayDisplay($aINI)
;~             Else
;~                 MsgBox(0, "Desktop", "No JPG files found")
;~             EndIf

        Case $nGetRCAR
            Local $sFObin = FileOpenDialog('Vehicles.bin', @ScriptDir, '(*.rcar)', 0, '', $hVehiclesRW)
            If Not @error Then
                $sPathRCAR = $sFObin
;~                 GUICtrlSetData($nPathRCAR, $sPathRCAR)
            EndIf
        Case $nRWVeh
            _GetDataRcarWR()
    EndSwitch
WEnd


пример ИНИ файла:
1574643705178.png
 

joiner

Модератор
Локальный модератор
Сообщения
3,556
Репутация
628
ini создает игра? почему именная такая конфигурация ini?
 

joiner

Модератор
Локальный модератор
Сообщения
3,556
Репутация
628
значит не нужно лишних проблем создавать)))
конфигурация ini для чтения и записи как в справке по языку
[Имя секции]
Параметр=Значение

Параметр - можно просто цифры, а можно точное имя для прямого чтения.
Значение - тут те пути, которые у тебя на скрине или любое другое нужное
 
Автор
Tosyk

Tosyk

Новичок
Сообщения
206
Репутация
0
так, что-то не получается. тут же получается два массива?
один - это сами ini файлы, а потом второй - это имена машин, которые нужно получить из каждого ini файла в разделе [Name]
 

joiner

Модератор
Локальный модератор
Сообщения
3,556
Репутация
628
возможно, так
в какой combo устанавливать значение решай сам.
Код:
#include <ButtonConstants.au3>
#include <EditConstants.au3>
#include <ComboConstants.au3>
#include <File.au3>
#include <Array.au3>
Global $aINI
Global $aNamesBlock[1][2] = [['Имя блока', 'Позиция начала записи']], $sPathRCAR = '', $sPathVehicles = ''
Global $hVehiclesRW = GUICreate('Mafia car installer', 266, 254, -1, -1)
;~ GUISetFont(9, 800, 0, "Segoe UI")

Global $nNewVehicles = GUICtrlCreateLabel('Choose new car:', 12, 7, 100, 25)
Global $hNewVehCombo = GUICtrlCreateCombo('', 12, 25, 242, 23, BitOR($GUI_SS_DEFAULT_COMBO, $CBS_DROPDOWNLIST))

Global $hSpecGroup = GUICtrlCreateGroup('New car included:', 12, 60, 242, 91)
Global $nNewVehCol = GUICtrlCreateLabel('Car colors:', 30, 84, 78, 25)
Global $nNewVehCol = GUICtrlCreateLabel('4', 92, 84, 78, 25)
Global $nNewVehShd = GUICtrlCreateLabel('Shadow:', 30, 104, 78, 25)
Global $nNewVehShd = GUICtrlCreateLabel('Yes', 80, 104, 78, 25)
Global $nNewVehAud = GUICtrlCreateLabel('Sounds:', 30, 124, 78, 25)
Global $nNewVehAud = GUICtrlCreateLabel('No', 78, 124, 78, 25)
Global $nNewVehSpc = GUICtrlCreateLabel('Specifications:', 128, 84, 78, 25)
Global $nNewVehSpc = GUICtrlCreateLabel('Yes', 210, 84, 78, 25)
Global $nNewVehDam = GUICtrlCreateLabel('Damage model:', 128, 104, 78, 25)
Global $nNewVehDam = GUICtrlCreateLabel('Yes', 218, 104, 78, 25)
Global $nNewVehTex = GUICtrlCreateLabel('Textures:', 128, 124, 78, 25)
Global $nNewVehTex = GUICtrlCreateLabel('113', 180, 124, 78, 25)

Global $nMafVehicles = GUICtrlCreateLabel('Choose car to replace:', 12, 164, 150, 25)
Global $hMafVehCombo = GUICtrlCreateCombo('', 12, 182, 242, 23, BitOR($GUI_SS_DEFAULT_COMBO, $CBS_DROPDOWNLIST))

Global $nVehicles = GUICtrlCreateButton('Replace', 46, 220, 78, 25)
Global $nSblockB = GUICtrlCreateButton('Default', 137, 220, 78, 25)
_LoadNameCar()
GUISetState()

While 1
    Switch GUIGetMsg()
        Case -3
            Exit
        Case $nVehicles

    EndSwitch
WEnd

Func _LoadNameCar()
    $aINI = _FileListToArray(@ScriptDir & '\CarSetting\', '_cm*.ini', 1, 1)
    If Not @error Then
        Local $sList = '', $sData, $aGsd
        For $i = 1 To $aINI[0]
            $aGsd = IniReadSection($aINI[$i], 'name')
            If Not @error Then $sList &= $aGsd[1][1] & '|'
        Next
        Local $DefCar = IniReadSection($aINI[1], 'name')
        GUICtrlSetData($hNewVehCombo, StringTrimRight($sList, 1), $DefCar[1][1])
    EndIf
EndFunc   ;==>_LoadNameCar
 
Последнее редактирование:
Автор
Tosyk

Tosyk

Новичок
Сообщения
206
Репутация
0
спасибо,не могу победить ошибку:

Код:
"M:\_DEVELOPING\_google_disc_sync\TosykDev\code\autoit\maf_car_installer\ReWrBin3.au3" (54) : ==> Subscript used on non-accessible variable.:
GUICtrlSetData($hNewVehCombo, StringTrimRight($sList, 1), $DefCar[1][1])
GUICtrlSetData($hNewVehCombo, StringTrimRight($sList, 1), $DefCar^ ERROR
 

joiner

Модератор
Локальный модератор
Сообщения
3,556
Репутация
628
Код:
Local $DefCar = IniReadSection($aINI[1], 'name'), $Defdata = ''
        If Not @error Then $Defdata = $DefCar[1][1]
        GUICtrlSetData($hNewVehCombo, StringTrimRight($sList, 1), $Defdata)
 
Последнее редактирование:
Автор
Tosyk

Tosyk

Новичок
Сообщения
206
Репутация
0
спасибо!
получилось вытащить названия машин в выпадающий список только когда я в ini добавил "параметр=", сразу всё заработало:
1574898878450.png

но дальше начинается месиво. на основании выбранного должны меняться значения в основном окне. а ведь там не только чтение параметров, но и подсчёт значений.

у меня получается какое-то месиво:
Код:
#include <ButtonConstants.au3>
#include <EditConstants.au3>
#include <ComboConstants.au3>
#include <File.au3>
#include <Array.au3>
#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>

Global $aINI, $msg, $NewCarName, $DefCar
Global $aNamesBlock[1][2] = [['Имя блока', 'Позиция начала записи']], $sPathRCAR = '', $sPathVehicles = ''
Global $hVehiclesRW = GUICreate('Mafia car installer', 266, 254, -1, -1)
;~ GUISetFont(9, 800, 0, "Segoe UI")

Global $nNewVehicles = GUICtrlCreateLabel('Choose new car:', 12, 7, 100, 25)
Global $hNewVehCombo = GUICtrlCreateCombo('', 12, 25, 242, 23, BitOR($GUI_SS_DEFAULT_COMBO, $CBS_DROPDOWNLIST))

Global $hSpecGroup = GUICtrlCreateGroup('New car included:', 12, 60, 242, 91)
Global $nNewVehCol = GUICtrlCreateLabel('Car colors:', 30, 84, 78, 25)
Global $nNewVehCol = GUICtrlCreateLabel('4', 92, 84, 78, 25)
Global $nNewVehShd = GUICtrlCreateLabel('Shadow:', 30, 104, 78, 25)
Global $nNewVehShd = GUICtrlCreateLabel('Yes', 80, 104, 78, 25)
Global $nNewVehAud = GUICtrlCreateLabel('Sounds:', 30, 124, 78, 25)
Global $nNewVehAud = GUICtrlCreateLabel('No', 78, 124, 78, 25)
Global $nNewVehSpc = GUICtrlCreateLabel('Specifications:', 128, 84, 78, 25)
Global $nNewVehSpc = GUICtrlCreateLabel('Yes', 210, 84, 78, 25)
Global $nNewVehDam = GUICtrlCreateLabel('Damage model:', 128, 104, 78, 25)
Global $nNewVehDam = GUICtrlCreateLabel('Yes', 218, 104, 78, 25)
Global $nNewVehTex = GUICtrlCreateLabel('Textures:', 128, 124, 78, 25)
Global $nNewVehTex = GUICtrlCreateLabel('113', 180, 124, 78, 25)

Global $nMafVehicles = GUICtrlCreateLabel('Choose car to replace:', 12, 164, 150, 25)
Global $hMafVehCombo = GUICtrlCreateCombo('', 12, 182, 242, 23, BitOR($GUI_SS_DEFAULT_COMBO, $CBS_DROPDOWNLIST))

Global $nVehicles = GUICtrlCreateButton('Replace', 46, 220, 78, 25)
Global $nSblockB = GUICtrlCreateButton('Default', 137, 220, 78, 25)
_LoadNameCar()
GUISetState()


While 1
    $msg = GUIGetMsg()
    Select
          Case $msg = $GUI_EVENT_CLOSE
            ExitLoop
          Case $msg = $hNewVehCombo ; Combo is actioned <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
             $NewCarName = GUICtrlRead($hNewVehCombo)
            
                 Local $aINI = _FileListToArray(@ScriptDir, '_cm*.ini', 1, 1)
                If Not @error Then
                    Local $sList = '', $sData, $aGsd
                    For $i = 1 To $aINI[0]
                        $aGsd = IniReadSection($aINI[$i], '[Colors]')
                        If Not @error Then $sList &= $aGsd[1][1] & '|'
                    Next
                    Local $DefCar = IniReadSection($aINI[1], '[Colors]'), $Defdata = ''
                       If Not @error Then $Defdata = $DefCar[1][1]
                       GUICtrlSetData($hNewVehCombo, StringTrimRight($sList, 1), $Defdata)
                    EndIf
            If $NewCarName = $DefCar[$i][0] Then
             GUICtrlSetData($nNewVehCol, $DefCar[$i][1])
    EndSelect
WEnd

Func _LoadNameCar()
    Local $aINI = _FileListToArray(@ScriptDir, '_cm*.ini', 1, 1)
    If Not @error Then
        Local $sList = '', $sData, $aGsd
        For $i = 1 To $aINI[0]
            $aGsd = IniReadSection($aINI[$i], 'Name')
            If Not @error Then $sList &= $aGsd[1][1] & '|'
        Next
        Local $DefCar = IniReadSection($aINI[1], 'Name'), $Defdata = ''
           If Not @error Then $Defdata = $DefCar[1][1]
           GUICtrlSetData($hNewVehCombo, StringTrimRight($sList, 1), $Defdata)
        EndIf
EndFunc   ;==>_LoadNameCar

совсем не понимаю вот такие вот конструкции: $sList &= $aGsd[1][1] & '|'
почему 1 в первой скобке? а почему 1 во второй? зачем палочка в конце?

пытался вписать всё в Case на основании вот этого скрипта: https://www.autoitscript.com/forum/topic/183077-updating-label-when-combobox-selection-changes/
но чот запутался только :/
 

joiner

Модератор
Локальный модератор
Сообщения
3,556
Репутация
628
все пункты в ini должны иметь параметр=значение, а имя секции в скобках. то есть. не только секция, где указано имя машины, но и все остальные секции в файле
$aGsd это результат чтения секции в ini. Смотри справку по
Код:
IniReadSection

$sList - это значение устанавливается в combo . Смотри справку по
Код:
GuiCtrlCreateCombo

в цикле опроса окна в твоем коде лучше использовать
Код:
Switch...Case....EndSwitch


у тебя в коде два комбо, но ты две функции сбора данных впихиваешь в один комбо $hNewVehCombo
Зачем? второй комбо для чего? $hMafVehCombo

По ссылке на официальном форуме разбирается простой вопрос новичка. Все примеры можно найти в справке по языку
 
Последнее редактирование:
Автор
Tosyk

Tosyk

Новичок
Сообщения
206
Репутация
0
Зачем? второй комбо для чего? $hMafVehCombo
сюда будут записывать имена машин из vehicles.bin
Сообщение автоматически объединено:

не могу понять как работает Switch Case..
вообще в голову не идёт. понимаю, что это какое-то событие, но как его спрогнозировать, как его читать или воспроизводить я не понимаю :/
типа если у нас такое вот событие то делаем следующий код.
слишком сложно для моего мозга выстроить такую цепочку. как концепт я это понимаю и могу выстроить и даже воспроизвести с другими примерами, но тямы не хватает

Код:
#include <ButtonConstants.au3>
#include <EditConstants.au3>
#include <ComboConstants.au3>
#include <File.au3>
#include <Array.au3>
#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>

Global $aINI, $msg, $NewCarName, $DefCar
Global $aNamesBlock[1][2] = [['Имя блока', 'Позиция начала записи']], $sPathRCAR = '', $sPathVehicles = ''
Global $hVehiclesRW = GUICreate('Mafia car installer', 266, 254, -1, -1)
;~ GUISetFont(9, 800, 0, "Segoe UI")

Global $nNewVehicles = GUICtrlCreateLabel('Choose new car:', 12, 7, 100, 25)
Global $hNewVehCombo = GUICtrlCreateCombo('', 12, 25, 242, 23, BitOR($GUI_SS_DEFAULT_COMBO, $CBS_DROPDOWNLIST))

Global $hSpecGroup = GUICtrlCreateGroup('New car included:', 12, 60, 242, 91)
Global $nNewVehCol = GUICtrlCreateLabel('Car colors:', 30, 84, 78, 25)
Global $nNewVehCol = GUICtrlCreateLabel('4', 92, 84, 78, 25)
Global $nNewVehShd = GUICtrlCreateLabel('Shadow:', 30, 104, 78, 25)
Global $nNewVehShd = GUICtrlCreateLabel('Yes', 80, 104, 78, 25)
Global $nNewVehAud = GUICtrlCreateLabel('Sounds:', 30, 124, 78, 25)
Global $nNewVehAud = GUICtrlCreateLabel('No', 78, 124, 78, 25)
Global $nNewVehSpc = GUICtrlCreateLabel('Specifications:', 128, 84, 78, 25)
Global $nNewVehSpc = GUICtrlCreateLabel('Yes', 210, 84, 78, 25)
Global $nNewVehDam = GUICtrlCreateLabel('Damage model:', 128, 104, 78, 25)
Global $nNewVehDam = GUICtrlCreateLabel('Yes', 218, 104, 78, 25)
Global $nNewVehTex = GUICtrlCreateLabel('Textures:', 128, 124, 78, 25)
Global $nNewVehTex = GUICtrlCreateLabel('113', 180, 124, 78, 25)

Global $nMafVehicles = GUICtrlCreateLabel('Choose car to replace:', 12, 164, 150, 25)
Global $hMafVehCombo = GUICtrlCreateCombo('', 12, 182, 242, 23, BitOR($GUI_SS_DEFAULT_COMBO, $CBS_DROPDOWNLIST))

Global $nVehicles = GUICtrlCreateButton('Replace', 46, 220, 78, 25)
Global $nSblockB = GUICtrlCreateButton('Default', 137, 220, 78, 25)

_LoadNameCar()
GUISetState()


While 1
    $msg = GUIGetMsg()
    Switch $msg
       Case $GUI_EVENT_CLOSE
          ExitLoop
       Case ;~ читаем список имён новых машин из _LoadNameCar() и загружаем в комбо $hNewVehCombo
       Case ;~ читаем список машин из _carIndex()
       Case ;~ читаем список оригинальных машин из _LoadVehicles() и загружаем в $hMafVehCombo
;~           If ;~ если имя оригинальной машины совпадает с именем из carindex.def
;~           Then ;~ подставляем настоящее имя из carindex.def
       Case ;~ при выборе машины в $hNewVehCombo запускаем _LoadSpec() и меняем значения в лейблах группы $hSpecGroup
       Case ;~ при нажатии на кнопку $nVehicles:
          ;~ запускаем _LoadSpec() и читаем путь к RCAR файлу
          ;~ смотрим какая строчка выбрана в $hMafVehCombo и на основании этого записываем выбранную из RCAR инфу в правильный блок в $sPathVehicles
          ;~ по имени оригинальной машины записываем имя новой машины в carindex.def (имя машины в игре)
          ;~ по имени оригинальной машины записываем имя модели повреждений новой машины в carindex.def
          ;~ по имени оригинальной машины записываем имя модели тени новой машины в carindex.def
          ;~ читаем в _LoadSpec() имя файла модели машины в [colors] и копируем эту машины, называем её новым любым именем
    EndSwitch
WEnd

Func _LoadNameCar()
    Local $aINI = _FileListToArray(@ScriptDir, '_cm*.ini', 1, 1)
    If Not @error Then
        Local $sList = '', $sData, $aGsd
        For $i = 1 To $aINI[0]
            $aGsd = IniReadSection($aINI[$i], 'Name')
            If Not @error Then $sList &= $aGsd[1][1] & '|'
        Next
        Local $DefCar = IniReadSection($aINI[1], 'Name'), $Defdata = ''
           If Not @error Then $Defdata = $DefCar[1][1]
           GUICtrlSetData($hNewVehCombo, StringTrimRight($sList, 1), $Defdata)
        EndIf
EndFunc   ;==>_LoadNameCar

Func _LoadVehicles()
    Local $nSR, $bName, $sName, $nlbl, $nlsl, $blbl, $blsl, $bsc, $ssc
    Local $sPathVehicles = (@ScriptDir & 'tables\vehicles.bin')
    Local $hFO = FileOpen($sPathVehicles, 16)
    FileSetPos($hFO, 8, 0);пропускаем версию файла, количество блоков
    While 1
        $blbl = FileRead($hFO, 4)
        If @error Then ExitLoop
        $nlbl = BitAND($blbl, 0xFFFF);Длина блока
        $bName = FileRead($hFO, 24)
        $sName = StringStripWS(BinaryToString($bName), 3); Имя блока
        FileSetPos($hFO, 8, 1);Пропускаем unknown1 и unknown2
        $bsc = FileRead($hFO, 4)
        $ssc = BitAND($bsc, 0xFFFF); Количество разделов
        $nSR = FileGetPos($hFO)
        $blsl = FileRead($hFO, 4)
        $nlsl = BitAND($blsl, 0xFFFF); Длина раздела
        If $ssc > 1 Then
            _ArrayAdd($aNamesBlock, $sName & '|' & $nSR)
            For $i = 1 To $ssc
                If $i < $ssc Then
                    FileSetPos($hFO, $nlsl + 4, 1); пропускаем раздел
                Else
                    FileSetPos($hFO, $nlsl, 1)
                EndIf
            Next
        Else
            _ArrayAdd($aNamesBlock, $sName & '|' & $nSR)
            FileSetPos($hFO, $nlsl, 1)
        EndIf
    WEnd
    FileClose($hFO)
EndFunc   ;==>_LoadVehicles

Func _carIndex()
;~    функция для чтения значений из carindex.def
EndFunc   ;==>_carIndex

Func _LoadSpec()
;~    функция для чтения значений из INI файла
EndFunc   ;==>_LoadSpec
 
Последнее редактирование:

joiner

Модератор
Локальный модератор
Сообщения
3,556
Репутация
628
Сообщение автоматически объединено:

По сути, у тебя будет три Case при опросе окна. Закрытие окна, нажатие на кнопку Replace или на кнопку Default
к элементам Combo тоже можно привязать действия при выбора значения. Но регистрация действия в элементе Combo будет через функцию WM_NOTIFY
В одну кнопку можно свести выполнение всех функций. То есть, пользователь сделал выбор, жмет кнопку перезаписи, а программа автоматом выполняет все функции
Код:
While 1
    $msg = GUIGetMsg()
    Switch $msg
       Case $GUI_EVENT_CLOSE
          ExitLoop
       Case $nVehicles
           ;~ читаем список машин из _carIndex()
         ;~ читаем список оригинальных машин из _LoadVehicles() и загружаем в $hMafVehCombo
        ;~ If ;~ если имя оригинальной машины совпадает с именем из carindex.def
          ;~ Then ;~ подставляем настоящее имя из carindex.def
          ;~ при выборе машины в $hNewVehCombo запускаем _LoadSpec() и меняем значения в лейблах группы $hSpecGroup
          ;~ при нажатии на кнопку $nVehicles:
          ;~ запускаем _LoadSpec() и читаем путь к RCAR файлу
          ;~ смотрим какая строчка выбрана в $hMafVehCombo и на основании этого записываем выбранную из RCAR инфу в правильный блок в $sPathVehicles
          ;~ по имени оригинальной машины записываем имя новой машины в carindex.def (имя машины в игре)
          ;~ по имени оригинальной машины записываем имя модели повреждений новой машины в carindex.def
          ;~ по имени оригинальной машины записываем имя модели тени новой машины в carindex.def
          ;~ читаем в _LoadSpec() имя файла модели машины в [colors] и копируем эту машины, называем её новым любым именем
        Case $nSblockB
            ;~ возвращаем все к исходным настройкам программы
    EndSwitch
WEnd
 
Последнее редактирование:
Автор
Tosyk

Tosyk

Новичок
Сообщения
206
Репутация
0
а как её привязать к Case?
Сообщение автоматически объединено:

Закрытие окна, нажатие на кнопку Replace или на кнопку Default
из этого сообщения примерно стало понятно как работает Switch хотябы
 
Автор
Tosyk

Tosyk

Новичок
Сообщения
206
Репутация
0
xXx
дело не в том, что я не могу это найти, а в том что я не понимаю, что там написано
эти тексты пишут для людей знакомых с программированием

я, хоть убейте, не понимаю даже этой первой фразы:
Значение или выражение, возвращающее значение. Далее это значение сравнивается со значением(ями) или диапазоном значений в каждом Case до тех пор, пока не будет найдено совпадение. Это выражение вычисляется только один раз.

ок. смотрим пример:

Код:
[URL='https://autoit-script.ru/docs/keywords/switch.htm']Switch[/URL] [URL='https://autoit-script.ru/docs/macros.htm#@HOUR']@HOUR[/URL]
    [URL='https://autoit-script.ru/docs/keywords/switch.htm']Case[/URL] 6 [URL='https://autoit-script.ru/docs/keywords/for.htm']To[/URL] 11
        $sMsg [URL='https://autoit-script.ru/docs/intro/lang_operators.htm']=[/URL] "Доброе утро"
    [URL='https://autoit-script.ru/docs/keywords/switch.htm']Case[/URL] 12 [URL='https://autoit-script.ru/docs/keywords/for.htm']To[/URL] 17
        $sMsg [URL='https://autoit-script.ru/docs/intro/lang_operators.htm']=[/URL] "Добрый день"
    [URL='https://autoit-script.ru/docs/keywords/switch.htm']Case[/URL] 18 [URL='https://autoit-script.ru/docs/keywords/for.htm']To[/URL] 21
        $sMsg [URL='https://autoit-script.ru/docs/intro/lang_operators.htm']=[/URL] "Добрый вечер"
    [URL='https://autoit-script.ru/docs/keywords/switch.htm']Case[/URL] [URL='https://autoit-script.ru/docs/keywords/ifelseendif.htm']Else[/URL]
        $sMsg [URL='https://autoit-script.ru/docs/intro/lang_operators.htm']=[/URL] "Вы всё ещё занимаетесь программированием в такой поздний час?"
[URL='https://autoit-script.ru/docs/keywords/switch.htm']EndSwitch[/URL]


есть какое-то стандартное значение @HOUR. оно возвращает текущий час, сравнивает его с каждым кейсом и выдаёт ответ. ок, более менее понятно. но, у меня то:

Код:
[URL='https://autoit-script.ru/docs/keywords/while.htm']While[/URL] 1
    $msg = [URL='https://autoit-script.ru/docs/functions/guigetmsg.htm']GUIGetMsg[/URL]()
    [URL='https://autoit-script.ru/docs/keywords/switch.htm']Switch[/URL] $msg
       [URL='https://autoit-script.ru/docs/keywords/switch.htm']Case[/URL] $GUI_EVENT_CLOSE
          [URL='https://autoit-script.ru/docs/keywords/exitloop.htm']ExitLoop[/URL]
       [URL='https://autoit-script.ru/docs/keywords/switch.htm']Case[/URL] ;~ читаем список имён новых машин из _LoadNameCar() и загружаем в комбо $hNewVehCombo
       [URL='https://autoit-script.ru/docs/keywords/switch.htm']Case[/URL] ;~ читаем список машин из _carIndex()
       [URL='https://autoit-script.ru/docs/keywords/switch.htm']Case[/URL] ;~ читаем список оригинальных машин из _LoadVehicles() и загружаем в $hMafVehCombo
;~           If ;~ если имя оригинальной машины совпадает с именем из carindex.def
;~           Then ;~ подставляем настоящее имя из carindex.def
       [URL='https://autoit-script.ru/docs/keywords/switch.htm']Case[/URL] ;~ при выборе машины в $hNewVehCombo запускаем _LoadSpec() и меняем значения в лейблах группы $hSpecGroup
       [URL='https://autoit-script.ru/docs/keywords/switch.htm']Case[/URL] ;~ при нажатии на кнопку $nVehicles:
          ;~ запускаем _LoadSpec() и читаем путь к RCAR файлу
          ;~ смотрим какая строчка выбрана в $hMafVehCombo и на основании этого записываем выбранную из RCAR инфу в правильный блок в $sPathVehicles
          ;~ по имени оригинальной машины записываем имя новой машины в carindex.def (имя машины в игре)
          ;~ по имени оригинальной машины записываем имя модели повреждений новой машины в carindex.def
          ;~ по имени оригинальной машины записываем имя модели тени новой машины в carindex.def
          ;~ читаем в _LoadSpec() имя файла модели машины в [colors] и копируем эту машины, называем её новым любым именем
    [URL='https://autoit-script.ru/docs/keywords/switch.htm']EndSwitch[/URL]
[URL='https://autoit-script.ru/docs/keywords/while.htm']WEnd[/URL]


что возвращает значение $msg? почему оно сравнивается с $GUI_EVENT_CLOSE? по каким принципам эта конструкция родилась? почему какой-то месседж возвращает закрытие окна? устоявшееся выражение? стандартное правило? бох его знает :/

я могу скопировать поведение какого-то кода, если вижу пример, но тут всё довольно сложно чтобы отправлять меня к справке.

WM_NOTIFY ещё более непонятная штука, это целая функция, которую как-то нужно использовать в моём коде, а у меня и кода то нет, а в той функции ещё и свои Switch/Case
 
Последнее редактирование:

joiner

Модератор
Локальный модератор
Сообщения
3,556
Репутация
628
вариант оформления кода. пути к файлам вынесены из функций. подставь свои. при выборе значения в комбо это значение будет читаться. пример в коде. осталось подставить функции
Код:
#include <ButtonConstants.au3>
#include <EditConstants.au3>
#include <ComboConstants.au3>
#include <File.au3>
#include <Array.au3>
#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>

Global $aNamesBlock[1][2] = [['Имя блока', 'Позиция начала записи']]
Global $hVehiclesRW = GUICreate('Mafia car installer', 266, 254, -1, -1)
;~ GUISetFont(9, 800, 0, 'Segoe UI')
Local $sPathSettings = @ScriptDir & '\CarSetting';тут твой путь к ини файлам
Local $sPathVehicles = @ScriptDir & '\vehicles.bin'; тут твой путь к vehicles.bin
Global $nNewVehicles = GUICtrlCreateLabel('Choose new car:', 12, 7, 100, 25)
Global $hNewVehCombo = GUICtrlCreateCombo('', 12, 25, 242, 23, BitOR($GUI_SS_DEFAULT_COMBO, $CBS_DROPDOWNLIST))

Global $hSpecGroup = GUICtrlCreateGroup('New car included:', 12, 60, 242, 91)
Global $nNewVehCol = GUICtrlCreateLabel('Car colors:', 30, 84, 78, 25)
Global $nNewVehCol = GUICtrlCreateLabel('4', 92, 84, 78, 25)
Global $nNewVehShd = GUICtrlCreateLabel('Shadow:', 30, 104, 78, 25)
Global $nNewVehShd = GUICtrlCreateLabel('Yes', 80, 104, 78, 25)
Global $nNewVehAud = GUICtrlCreateLabel('Sounds:', 30, 124, 78, 25)
Global $nNewVehAud = GUICtrlCreateLabel('No', 78, 124, 78, 25)
Global $nNewVehSpc = GUICtrlCreateLabel('Specifications:', 128, 84, 78, 25)
Global $nNewVehSpc = GUICtrlCreateLabel('Yes', 210, 84, 78, 25)
Global $nNewVehDam = GUICtrlCreateLabel('Damage model:', 128, 104, 78, 25)
Global $nNewVehDam = GUICtrlCreateLabel('Yes', 218, 104, 78, 25)
Global $nNewVehTex = GUICtrlCreateLabel('Textures:', 128, 124, 78, 25)
Global $nNewVehTex = GUICtrlCreateLabel('113', 180, 124, 78, 25)

Global $nMafVehicles = GUICtrlCreateLabel('Choose car to replace:', 12, 164, 150, 25)
Global $hMafVehCombo = GUICtrlCreateCombo('', 12, 182, 242, 23, BitOR($GUI_SS_DEFAULT_COMBO, $CBS_DROPDOWNLIST))

Global $nVehicles = GUICtrlCreateButton('Replace', 46, 220, 78, 25)
Global $nSblockB = GUICtrlCreateButton('Default', 137, 220, 78, 25)
_LoadVehicles($sPathVehicles)
_LoadNameCar($sPathSettings)
GUISetState()


While 1
    Switch GUIGetMsg()
        Case $GUI_EVENT_CLOSE
            ExitLoop
        Case $hMafVehCombo
            ConsoleWrite(GUICtrlRead($hMafVehCombo) & @LF)
            ;читаем значение из комбо и выполняем нужные функции
        Case $hNewVehCombo
            ConsoleWrite(GUICtrlRead($hNewVehCombo) & @LF)
            ;читаем значение из комбо и выполняем нужные функции
        Case $nVehicles
            ;функция перезаписи файла
        Case $nSblockB
            ;возвращаем все к исходным настройкам программы
    EndSwitch
WEnd

Func _LoadNameCar($sPathSet)
    Local $aINI = _FileListToArray($sPathSet, '_cm*.ini', 1, 1)
    If Not @error Then
        Local $sList = '', $sData, $aGsd
        For $i = 1 To $aINI[0]
            $aGsd = IniReadSection($aINI[$i], 'Name')
            If Not @error Then $sList &= $aGsd[1][1] & '|'
        Next
        Local $DefCar = IniReadSection($aINI[1], 'Name'), $Defdata = ''
        If Not @error Then $Defdata = $DefCar[1][1]
        GUICtrlSetData($hNewVehCombo, StringTrimRight($sList, 1), $Defdata)
    EndIf
EndFunc   ;==>_LoadNameCar

Func _LoadVehicles($sPVenh)
    Local $nSR, $bName, $sName, $nlbl, $nlsl, $blbl, $blsl, $bsc, $ssc
    Local $hFO = FileOpen($sPVenh, 16)
    If @error Then Return
    FileSetPos($hFO, 8, 0);пропускаем версию файла, количество блоков
    While 1
        $blbl = FileRead($hFO, 4)
        If @error Then ExitLoop
        $nlbl = BitAND($blbl, 0xFFFF);Длина блока
        $bName = FileRead($hFO, 24)
        $sName = StringStripWS(BinaryToString($bName), 3); Имя блока
        FileSetPos($hFO, 8, 1);Пропускаем unknown1 и unknown2
        $bsc = FileRead($hFO, 4)
        $ssc = BitAND($bsc, 0xFFFF); Количество разделов
        $nSR = FileGetPos($hFO)
        $blsl = FileRead($hFO, 4)
        $nlsl = BitAND($blsl, 0xFFFF); Длина раздела
        If $ssc > 1 Then
            _ArrayAdd($aNamesBlock, $sName & '|' & $nSR)
            For $i = 1 To $ssc
                If $i < $ssc Then
                    FileSetPos($hFO, $nlsl + 4, 1); пропускаем раздел
                Else
                    FileSetPos($hFO, $nlsl, 1)
                EndIf
            Next
        Else
            _ArrayAdd($aNamesBlock, $sName & '|' & $nSR)
            FileSetPos($hFO, $nlsl, 1)
        EndIf
    WEnd
    FileClose($hFO)
    Local $sDataVehC
    If UBound($aNamesBlock) > 1 Then
        For $i = 1 To UBound($aNamesBlock) - 1
            $sDataVehC &= $aNamesBlock[$i][0] & '|'
        Next
        $sDataVehC = StringTrimRight($sDataVehC, 1)
        GUICtrlSetData($hMafVehCombo, $sDataVehC, $aNamesBlock[1][0])
    EndIf
EndFunc   ;==>_LoadVehicles

Func _carIndex()
;~    функция для чтения значений из carindex.def
EndFunc   ;==>_carIndex

Func _LoadSpec()
;~    функция для чтения значений из INI файла
EndFunc   ;==>_LoadSpec
 

IMStrelcov

CTPEJIbLLOB
Сообщения
253
Репутация
64
что возвращает значение $msg? почему оно сравнивается с $GUI_EVENT_CLOSE? по каким принципам эта конструкция родилась? почему какой-то месседж возвращает закрытие окна? устоявшееся выражение? стандартное правило? бох его знает :/

Описание порядка работы кода:
Код:
While 1
    $msg = GUIGetMsg()
    Switch $msg
       Case $GUI_EVENT_CLOSE
          ExitLoop
       Case $GUI_EVENT_MINIMIZE
          ;
    EndSwitch
WEnd


1. Переменные $GUI_EVENT_CLOSE и $GUI_EVENT_MINIMIZE берутся из подключенного файла GUIConstantsEx.au3 который находится в папке с установленным Autoit.
Если открыть этот файл и найти в нем эти переменные, то их значения равны:
$GUI_EVENT_CLOSE = -3, это сообщение означает что в окно пришла не важно каким образом команда закрытся
$GUI_EVENT_MINIMIZE = -4, а это сообщение означает что в окно пришла команда свернутся

2. Далее все что между строками:
While 1
и
WEnd
будет обрабатываться по кругу (в цикле), то есть дальше этих строк код не обрабатывается, пока не выйдеш из цикла используя ExitLoop

3.
функция GUIGetMsg() возвращает какое нибудь число в переменную $msg

4.
Switch сравнивает значение из $msg с теми что находятся в строках с Case и когда значения Case и $msg совпадают выполняется код после этого Case и до следующего Case или EndSwitch

5. На пимере:
GUIGetMsg() в переменную $msg вернуло -3
Switch
сравнивает $msg с каждой строкой содержащей Case
когда найдено Case с значением -3, а в нашем случае это переменная $GUI_EVENT_CLOSE
то выполняется код после Case $GUI_EVENT_CLOSE
то есть ExitLoop
что означает выход из цикла
While 1
WEnd

P.S.
Вместо ExitLoop можно поставить просто Exit, но тогда скрипт полностью прекратит работу и программа будет закрыта.

И да WM_NOTIFY будет посложнее и чтобы его понять, сначало нужно хороше понимать базовые функции, а после уже разбирать подобные сообщения.
 
Верх