Что нового

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

Tosyk

Новичок
Сообщения
179
Репутация
0
Приступил к написанию скрипта для установки модификаций в игру Мафия.
большая часть работы была проделана тут: http://autoit-script.ru/threads/zamena-chasti-hex-v-odnom-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 094
Репутация
518
ini создает игра? почему именная такая конфигурация ini?
 

joiner

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

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

Tosyk

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

joiner

Модератор
Локальный модератор
Сообщения
3 094
Репутация
518
возможно, так
в какой 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

Новичок
Сообщения
179
Репутация
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 094
Репутация
518
Код:
Local $DefCar = IniReadSection($aINI[1], 'name'), $Defdata = ''
        If Not @error Then $Defdata = $DefCar[1][1]
        GUICtrlSetData($hNewVehCombo, StringTrimRight($sList, 1), $Defdata)
 
Последнее редактирование:
Автор
Tosyk

Tosyk

Новичок
Сообщения
179
Репутация
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 094
Репутация
518
все пункты в ini должны иметь параметр=значение, а имя секции в скобках. то есть. не только секция, где указано имя машины, но и все остальные секции в файле
$aGsd это результат чтения секции в ini. Смотри справку по
Код:
IniReadSection

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

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


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

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

Tosyk

Новичок
Сообщения
179
Репутация
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 094
Репутация
518
Сообщение автоматически объединено:

По сути, у тебя будет три 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

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

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

Tosyk

Новичок
Сообщения
179
Репутация
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 094
Репутация
518
вариант оформления кода. пути к файлам вынесены из функций. подставь свои. при выборе значения в комбо это значение будет читаться. пример в коде. осталось подставить функции
Код:
#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
Сообщения
109
Репутация
15
что возвращает значение $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 будет посложнее и чтобы его понять, сначало нужно хороше понимать базовые функции, а после уже разбирать подобные сообщения.
 
Верх