ВНИМАНИЕ! Наша конференция посвящена космической тематике и компьютерным играм. Политические вопросы и происходящие в мире события в данный момент на нашем сайте не обсуждаются!
|
» X3TC Моддинг: obj-файлы и маленькие утилитки | страница 11 |
|
|
|
Канал X3: Terran Conflict »
Модовый и скриптовый отсек X3: Terran Conflict: «X3TC Моддинг: obj-файлы и маленькие утилитки» |
|
|
Whiskas
137 EGP
  Рейтинг канала: 3(36) Репутация: 5 Сообщения: 139
Зарегистрирован: 28.04.2011
 |
|
Внимательней(!): версия 3.2
Cкрытый текст (кликните здесь для просмотра)
Код: |
.title disconnect_gate
.radix 10d
.settime "13-01-2012 14:20:22"
.loadobj "x3story.obj"
.section code, con
.classdef Obj_2312
.func MenuActionNew ;Override offset to Obj_2312.MenuAction in the table
.func OnContextMenuReturn ;Callback
.endclass Obj_2312
; Obj_2312.MenuActionNew()
Obj_2312.MenuActionNew:
enter 0, 14
read MENU.var_2200_20 ; [20d ; 14h]
push 0
if SP[0]>=SP[1] then push 0 else push 1
if SP[0]=0 then jump L00148D63
read MENU.var_2200_20 ; [20d ; 14h]
push 1
sub SP[0],SP[1]
push 1
read MENU.var_2200_33 ; [33d ; 21h]
call85 DOCK.GetGateLink
push SP[0]
if SP[0]<>0 then jump Context
push 0
call88 Obj_2312.CanRealign
if SP[0]=0 then jump L00148D2D
push SP[0] ; loc1
if SP[0]=0 then push 1 else push 0
if SP[0]<>0 then jump L00148D21
push SP[0] ; loc1
push 1
callasm SE_ArraySize
push 3
if SP[0]>=SP[1] then push 0 else push 1
if SP[0]=0 then jump L00148D15
push 3
push SP[1] ; loc1
get_from_array
pushb -1d ; 0FFh
if SP[0]<>SP[1] then push 0 else push 1
if SP[0]=0 then jump L00148D15
push 1
jump L00148D16
L00148D15: push 0
L00148D16: if SP[0]<>0 then jump L00148D21
push 0
jump L00148D22
L00148D21: push 1
L00148D22: if SP[0]=0 then jump L00148D2D
push 1
jump L00148D2E
L00148D2D: push 0
L00148D2E: if SP[0]=0 then jump L00148D58
push 0
push 0
push 0
read MENU.var_2200_33 ; [33d ; 21h]
call85 GetSector ; 000003E7
pushb 7
get_object
pushb 5
pushw 2228d ; 08B4h
create_object
call85 MENU_GALAXY.CreateNext
push 1
call88 MENU.OpenNextMenu
pop
jump L00148D62
L00148D58: push 0
pushw 200d ; 0C8h
call86 X_AUDIO.PlayFailSample
pop
L00148D62: pop
L00148D63: push 0
ret
Context: push 0
call88 Obj_2312.CanRealign
if SP[0]=0 then jump L00148D2D
pop
pushw 152d ;???
get_object
push 2 ;???
call88 MENU.PrepareDropdownMenu
pop
push 0
push 1104050d ;XML string
pushb 35d ;XML node id?
push 2
callasm SE_ReadText ;Button caption
push 150d ;Button width? Seems no
pushw 600d ;Button ID? Seems yes
pushb 4
pushw 641d ;this is everywhere
call86 Obj_641.AddButton
pop
push 0
push 1103002d ;XML string
pushb 35d ;XML node id?
push 2
callasm SE_ReadText ;Button caption
push 150d ;Button width? Seems no
pushw 601d ;Button ID? Seems yes
pushb 4
pushw 641d ;this is everywhere
call86 Obj_641.AddButton
pop
push 0
pushw 641d ; 0281h
call86 Obj_641.Show
pop
push 0
ret
Obj_2312.OnContextMenuReturn:
enter 2, 14
push SP[4] ;arg2 ;Button ID?
jump Table
;inherited call to Obj_2312.MenuAction, reconstructing original behaviour
Realign: push 0
call88 Obj_2312.MenuAction
pop
jump Leave
;Obj_2312.CreatePrevious stolen code, but adapted to disconnect
Disconnect:read MENU.var_2200_20 ; [20d ; 14h]
push 0
if SP[0]>=SP[1] then push 0 else push 1
if SP[0]=0 then jump Leave
push 0
push SP[4] ; arg1 ????????????????
read MENU.var_2200_20 ; [20d ; 14h]
push 1
sub SP[0],SP[1]
push 3
read MENU.var_2200_33 ; [33d ; 21h]
call85 DOCK.DisconnectGate
pop
jump Leave
Leave: push 0
ret
Table: switch 2, 0
.long Leave
.long 600d, Realign
.long 601d, Disconnect
.end |
|
После компиляции необходимо в таблице объекта 2312 заменить адрес к старой Obj_2312.MenuAction на новый адресс к Obj_2312.MenuActionNew. В сгенерируемом листинге оффсет можно достать, а старый адрес можно найти winhex-е: самый последний найденный, это как раз таблица.
3.4 так затупила и лагать начала когда 10 мистралей купил, что пришлось откатиться до старых сохранок 3.2. Так и играю на ней, сомневаюсь теперь в последнем патче.
Помимо проблем форматирования в visual studio, возможно ассемблеру не хватает скопа для функций, чтобы каждая могла переиспользовать названия меток, а то пока каждый раз новые нужно придумывать. Потом возможно не хватает override, пока выводит что такой метод уже задекларирован или как-то так, а вот в этом патче он реально нужен потому что MenuAction/OnContextMenuReturn и т.п. это колбэки по имени, их необходимо перехватывать. И наконец settime, а почему она не по всему обжу ставит дату? Там же повсюду места, где эти штампы ставятся, но если ни на что не влияет то и не страшно.
Насчет патча: врата остаются с пленкой, но пролетаешь всквозь, прыгать к ним можно. NPC остаются в ловушке если все отключить, у себя неизвестный объект поймал))) Как тренировка вышло, ошибки наверное есть, больно всё сложно и капризно, чуть что - краш. В целом интересно покодить, но играть не знаю, может однажды после пачта экзешника и обжа на 5 байт, чтоб не марать игру.
Таки нашел ошибки, pushb вместо push и push SP[3] вместо SP[4] arg1 с кучей вопросительных знаков, и всё равно отключает врата хоть arg0, которого нет, хоть arg1 т.е. ему вообще все равно на этот аргумент как будто...
______
Баг-фикс возможно, в меню собственности на вкладке "Корабли" невозможно торговать со станцией по нажатию d. В Obj_2251.Input есть такой фрагмент:
Cкрытый текст (кликните здесь для просмотра)
Код: |
L0012BCD5: push SP[3] ; arg1
push SP[5] ; arg2
if SP[0]<>SP[1] then push 0 else push 1
if SP[0]=0 then jump L0012BCE3
push 2
ret
L0012BCE3: read MENU.var_2200_24 ; [24d ; 18h]
push 0
if SP[0]<>SP[1] then push 0 else push 1
if SP[0]<>0 then jump L0012BCFD
read MENU.var_2200_24 ; [24d ; 18h]
push 1
if SP[0]<>SP[1] then push 0 else push 1
if SP[0]<>0 then jump L0012BCFD
push 0 ;no direct trade on ships tab because of 0, set 1 to bypass
jump L0012BCFE |
|
push 0 на push 1 и начинает работать для пристыкованных.
Последний раз редактировалось: Whiskas (10:20 17-08-2018), всего редактировалось 3 раз(а) |
|
|
DNA78
429 EGP
     Рейтинг канала: 9(1069) Репутация: 73 Сообщения: 1268 Откуда: Кыргызстан Зарегистрирован: 12.11.2008
 |
|
Whiskas T-Mech : |
И наконец settime, а почему она не по всему обжу ставит дату? Там же повсюду места, где эти штампы ставятся, но если ни на что не влияет то и не страшно.
|
С помощью этой директивы нужно выставлять оригинальное время компиляции обжа. Делается это для правильного отображения версии игры при загрузки сохранений.
Whiskas T-Mech : |
Баг-фикс возможно, в меню собственности на вкладке "Корабли" невозможно торговать со станцией по нажатию d.
push 0 на push 1 и начинает работать для пристыкованных.
|
Может это специально сделано, т.к. в меню собственности у меня срабатывают кастомные горячие клавиши. Скорее всего проблема лежит глубже.
Whiskas T-Mech : |
3.4 так затупила и лагать начала когда 10 мистралей купил, что пришлось откатиться до старых сохранок 3.2. Так и играю на ней, сомневаюсь теперь в последнем патче.
|
Не замечал у себя в игре такого.
Whiskas T-Mech : |
Как тренировка вышло, ошибки наверное есть, больно всё сложно и капризно, чуть что - краш.
|
А не проще вывести скриптовую команду для функции DOCK.DisconnectGate?
_________________ Очевидное-невероятное |
|
|
Whiskas
137 EGP
  Рейтинг канала: 3(36) Репутация: 5 Сообщения: 139
Зарегистрирован: 28.04.2011
 |
|
DNA78 : |
Whiskas T-Mech : |
Баг-фикс возможно, в меню собственности на вкладке "Корабли" невозможно торговать со станцией по нажатию d.
push 0 на push 1 и начинает работать для пристыкованных.
|
Может это специально сделано, т.к. в меню собственности у меня срабатывают кастомные горячие клавиши. Скорее всего проблема лежит глубже.
|
Ну в целом только на вкладке Все и Станции можно нажать клавишу торговать и сразу открывается меню MENU_TRADE, а вот на Корабли нужно почему-то enter нажать т.е. вызвать субменюшку.
DNA78 : |
Whiskas T-Mech : |
Как тренировка вышло, ошибки наверное есть, больно всё сложно и капризно, чуть что - краш.
|
А не проще вывести скриптовую команду для функции DOCK.DisconnectGate?
|
А я не знаю, скрипты вообще ни разу не делал и не представляю что там.
_____
Ячейка хаакских КЛ. Это в MENU_WEAPONS.GetLaserArray:
Код: |
0010CAA3: 05 FF | 2 pushb -1d ; 0FFh ;change to 29d ; 01Dh to activate
0010CAA5: 07 FF7001DF | 3 pushd -9436705d ; 0FF7001DFh
0010CAAA: 05 1F | 4 pushb 31d ; 1Fh |
-1d ; 0FFh заменить на 29d ; 01Dh
1 - индекс в массиве и соотвественно позиция станет для квадрата т.е. самый последний в случае 30d
2 - цвет
3 - тип возвращаемый SA_GetShipTypeTurretLaserMask. Обратно распилить хаакскую ячейку на 3 как в Reunion (КЛ-1, КЛ-2, КЛ-3) выглядит нетривиальным, ведь для всех трех кионок 1F походу теперь. Вот ведь лень какая видимо была, в reunion они вообще цветами разными были!
На весь x3story есть 2 вызова:
call88 MENU_WEAPONS.DrawMaskColors (в MENU_WEAPONS.SpecialUpdate)
call86 MENU_WEAPONS.DrawMaskColors (в MENU_SHIPINFO.SpecialUpdate)
Прямо перед вызовами идет pushw 168d ; 0A8h - это позиция всей линии. Можно влево переместить на 5-10 пикселей если новых квадратов привезут)))
Вообще всплывает отсутствие возможности в ассемблере "просто кода", "тела" и директив на прямой патчинг по адресу, чтобы я мог бы приказать компилятору сделай jump mypurecode вон там (в какой-то оригинальной функции) и вот так можно было бы расширять оригинал. Пока же ассемблер почему-то спотыкается об get_strg S00000877 ; "" -подобные и при всем желании даже скопировать всю функцию невозможно, чтобы редирект сделать после компиляции вручную.
Последний раз редактировалось: Whiskas (01:22 18-08-2018), всего редактировалось 1 раз |
|
|
DNA78
429 EGP
     Рейтинг канала: 9(1069) Репутация: 73 Сообщения: 1268 Откуда: Кыргызстан Зарегистрирован: 12.11.2008
 |
|
Whiskas T-Mech : |
Пока же ассемблер почему-то спотыкается об get_strg S00000877 ; "" -подобные и при всем желании даже скопировать всю функцию невозможно, чтобы редирект сделать после компиляции вручную.
|
Если в своём патче вы затрагиваете уже существующие стринги или создаёте новые, то их (стринги) нужно по любому объявлять в своём патче. И ассемблер больше не будет об них спотыкаться
Код: |
.section strg, con
S000011F7: .ascii "???"
S0000144C: .ascii " " |
_________________ Очевидное-невероятное |
|
|
Whiskas
137 EGP
  Рейтинг канала: 3(36) Репутация: 5 Сообщения: 139
Зарегистрирован: 28.04.2011
 |
|
720x217
Cкрытый текст (кликните здесь для просмотра)
|
Патч
Cкрытый текст (кликните здесь для просмотра)
Код: |
.title kyon
.radix 10d
.loadobj "x3story.obj"
;v3.2
;.settime "13-01-2012 14:20:22"
;.patchcode
;10A662: nop
; nop
; nop
; call87 KyonDrawMaskColors
;aka 0608BC860010DC2B -> 0C0C0C87XXXXXXXX
;v3.4
;.settime "14-11-2017 11:03:41"
;.patchcode
;10CA8D: nop
; nop
; nop
; call87 KyonDrawMaskColors
;aka 0608BC8600110056 -> 0C0C0C87XXXXXXXX
.section strg, con
.ascii "KyonDrawMaskColors"
.section code, con
.classdef MENU_SHIPINFO
.func KyonSupport
.func KyonDrawMaskColors
.endclass MENU_SHIPINFO
MENU_SHIPINFO.KyonSupport:
;arg1 - NameID
enter 1, 10
pushd -1
push 8
push 1
callasm SA_GetNumSubTypes
push SP[0]
.Loop: push 1
push SP[3]
add SP[0],SP[1]
mov SP[3],SP[0]
pop
push SP[1]
push SP[3]
if SP[0]>=SP[1] then push 0 else push 1
if SP[0]=0 then jump .Exit
;read MENU_SHIPINFO.var_2229_3 ; [84d ; 54h]
;if SP[0]=0 then jump .Ware
read MENU_SHIPINFO.var_2229_7 ; [88d ; 58h] ; Encyclopedia View Flag(?)
if SP[0]=0 then jump .Ware
push SP[2]
pushb 8
push 2
callasm SA_GetTypeTK
read MENU_SHIPINFO.var_2229_1 ; [82d ; 52h]
push 1
callasm SA_GetShipTypeMaxTKClass
if SP[0]>=SP[1] then push 0 else push 1
if SP[0]=0 then jump .Type
jump .Loop
.Ware: push SP[2]
push 8
push 2
read MENU.var_2200_33 ; [33d ; 21h]
call85 SHIP.CanTransportWareType
if SP[0]=0 then push 1 else push 0
if SP[0]=0 then jump .Type
jump .Loop
.Type: push SP[6] ; arg1
push SP[3] ; loc1
push 8
push 2
call84 global.GetWareNameID
if SP[0]=SP[1] then push 0 else push 1
if SP[0]<>0 then jump .Loop
popx 3
push 1
ret
.Exit: popx 3
push 0
ret
MENU_SHIPINFO.KyonDrawMaskColors:
;arg1 - Array of array[3]
;arg2 - Supported Weapons (GetTurretLaserMask)
;arg3 - Installed Weapons (1 << GetSubGType)
;arg4 - Left
;arg5 - Top
enter 5, 20
pushb 20d ; 14h
write MENU.var_2200_70 ; [70d ; 46h]
pop
pushd -7 ; shift left
push SP[7]
add SP[0],SP[1]
mov SP[7],SP[0]
pop
pushd 32
.Continue: push -1
push SP[1]
add SP[0],SP[1]
mov SP[1],SP[0]
xjump 32, 0
.long .Break
.long .00
.long .01
.long .02
.long .03
.long .04
.long .05
.long .06
.long .07
.long .08
.long .09
.long .10
.long .11
.long .12
.long .13
.long .14
.long .15
.long .16
.long .17
.long .18
.long .19
.long .20
.long .21
.long .22
.long .23
.long .24
.long .25
.long .26
.long .27
.long .28
.long .29
.long .30
.long .31
;The -1d hidden items are only used in column rendering for the sake of colors.
;In line rendering those would just make gaps between squares (unless all located in the end of an array)
;pushb -1d ; 0FFh
;pushd -986896d ; 0FFF0F0F0h
;pushb 30d ; 1Eh
;jump .Draw
;pushb -1d ; 0FFh
;pushd -986896d ; 0FFF0F0F0h
;pushb 29d ; 1Dh
;jump .Draw
.31: pushb 31
pushd 0FFAC78FDh ; RGB = 172 120 253 (Reunion 0FFFF01FFh RGB = 255 1 255)
pushb 31d ; 1Fh
jump .Weapon
.30: pushb 30
pushd 0FF983CEEh ; RGB = 152 60 238 (Reunion 0FFD001D0h RGB = 208 1 208)
pushb 31d ; 1Fh
jump .Weapon
.29: pushb 29
pushd 0FF7001DFh ; RGB = 112 1 223 (Reunion 0FFA001A0h RGB = 160 1 160)
pushb 31d ; 1Fh
jump .Weapon
.28: pushb 28d ; 1Ch
pushd -7667970d ; 0FF8AFEFEh
pushb 27d ; 1Bh
jump .Weapon
.27: pushb 27d ; 1Bh
pushd -16656939d ; 0FF01D5D5h
pushb 24d ; 18h
jump .Weapon
.26: pushb 26d ; 1Ah
pushd -16670046d ; 0FF01A2A2h
pushb 19d ; 13h
jump .Weapon
.25: pushb 25d ; 19h
pushd -16682896d ; 0FF017070h
pushb 14d ; 0Eh
jump .Weapon
.24: pushb 24d ; 18h
pushd -16691120d ; 0FF015050h
pushb 10d ; 0Ah
jump .Weapon
.23: pushb 23d ; 17h
pushd -2752255d ; 0FFD60101h
pushb 23d ; 17h
jump .Weapon
.22: pushb 22d ; 16h
pushd -7798527d ; 0FF890101h
pushb 9
jump .Weapon
.21: pushb 21d ; 15h
pushd -91581d ; 0FFFE9A43h
pushb 17d ; 11h
jump .Weapon
.20: pushb 20d ; 14h
pushd -757247d ; 0FFF47201h
pushb 13d ; 0Dh
jump .Weapon
.19: pushb 19d ; 13h
pushd -5812479d ; 0FFA74F01h
pushb 8
jump .Weapon
.18: pushb 18d ; 12h
pushd -8854664d ; 0FF78E378h
pushb 22d ; 16h
jump .Weapon
.17: pushb 17d ; 11h
pushd -14305755d ; 0FF25B625h
pushb 15d ; 0Fh
jump .Weapon
.16: pushb 16d ; 10h
pushd -15173864d ; 0FF187718h
pushb 4
jump .Weapon
.15: pushb 15d ; 0Fh
pushd -3698944d ; 0FFC78F00h
pushb 26d ; 1Ah
jump .Weapon
.14: pushb 14d ; 0Eh
pushd -7050752d ; 0FF946A00h
pushb 18d ; 12h
jump .Weapon
.13: pushb 13d ; 0Dh
pushd -10402560d ; 0FF614500h
pushb 5
jump .Weapon
.12: pushb 12d ; 0Ch
pushd -10637826d ; 0FF5DADFEh
pushb 21d ; 15h
jump .Weapon
.11: pushb 11d ; 0Bh
pushd -16683302d ; 0FF016EDAh
pushb 12d ; 0Ch
jump .Weapon
.10: pushb 10d ; 0Ah
pushd -16693362d ; 0FF01478Eh
pushb 7
jump .Weapon
.09: pushb 9
pushd -460650d ; 0FFF8F896h
pushb 25d ; 19h
jump .Weapon
.08: pushb 8
pushd -3224051d ; 0FFCECE0Dh
pushb 16d ; 10h
jump .Weapon
.07: pushb 7
pushd -6382070d ; 0FF9E9E0Ah
push 3
jump .Weapon
.06: pushb 6
pushd -3092272d ; 0FFD0D0D0h
pushb 28d ; 1Ch
jump .Weapon
.05: pushb 5
pushd -5197648d ; 0FFB0B0B0h
push 2
jump .Weapon
.04: pushb 4
pushd -7303024d ; 0FF909090h
pushb 20d ; 14h
jump .Weapon
.03: push 3
pushd -9408400d ; 0FF707070h
pushb 11d ; 0Bh
jump .Weapon
.02: push 2
pushd -11513776d ; 0FF505050h
pushb 6
jump .Weapon
.01: push 1
pushd -13619152d ; 0FF303030h
push 1
jump .Weapon
.00: push 0
pushd -15198184d ; 0FF181818h
push 0
jump .Weapon
.Weapon: push 0
push SP[3] ; loc4
if SP[0]<SP[1] then push 0 else push 1
if SP[0]=0 then jump .Done
push 524288d ; 00080000h
push SP[1] ; loc2
or SP[0],SP[1]
readvar global.ga_ShipSpeaker ; [42d ; 2Ah]
get_from_array
push 0
if SP[0]=SP[1] then push 0 else push 1
if SP[0]<>0 then jump .Done
push SP[2] ; loc2 (indexed position as ident)
switch 3, 0
.long .Default
.long 29, .KB1
.long 30, .KB2
.long 31, .KB3
.KB1: push 4643d
jump .Test
.KB2: push 4653d
jump .Test
.KB3: push 4663d
jump .Test
.Test: push 1
call88 MENU_SHIPINFO.KyonSupport
if SP[0]<>0 then jump .Default
push SP[10] ; arg4
push SP[3] ; loc2
push 7 ; width multiplier
mul SP[0],SP[1]
add SP[0],SP[1] ; loc5
push 0
push SP[0]
jump .Unsupported
;Custom Forced Draw
;.Draw: push SP[10] ; arg4
; push SP[3] ; loc2
; push 7 ; width multiplier
; mul SP[0],SP[1]
; add SP[0],SP[1] ; loc5
; push 0
; push SP[0]
; jump .Paint
.Default: push SP[10] ; arg4
push SP[3] ; loc2
push 7 ; width multiplier
mul SP[0],SP[1]
add SP[0],SP[1] ; loc5
push 1
push SP[2] ; loc2
shl SP[1],SP[0]
push SP[0] ; loc6
push SP[1] ; loc6
push SP[12] ; arg2
and SP[0],SP[1] ; ((1 << array[0? or 2?]) and SA_GetShipTypeTurretLaserMask(8)) = 0 then goto .Unsupported
if SP[0]=0 then jump .Unsupported
;Makes sense only in MENU_WEAPONS as MENU_SHIPINFO always passes 0
push SP[1] ; loc6
push SP[13] ; arg3
and SP[0],SP[1]
if SP[0]=0 then jump .Uninstalled
pushd -2960686d ; 0FFD2D2D2h
jump .Paint
.Uninstalled:
pushd -9276814d ; 0FF727272h
.Paint: pushb 11d ; 0Bh
pushb 5
push SP[17] ; arg5
push 1
add SP[0],SP[1]
push SP[6] ; loc5
pushb 5
call88 MENU.DrawRawRect
pop
push SP[4] ; loc3
pushb 9
push 3
push SP[17] ; arg5
push 2
add SP[0],SP[1]
push SP[6] ; loc5
push 1
add SP[0],SP[1]
pushb 5
call88 MENU.DrawRawRect
popx 7
jump .Continue
.Unsupported:
pushd -9276814d ; 0FF727272h
pushb 9
push 3
push SP[17] ; arg5
push 2
add SP[0],SP[1]
push SP[6] ; loc5
push 1
add SP[0],SP[1]
pushb 5
call88 MENU.DrawRawRect
popx 7
jump .Continue
.Done: popx 3
jump .Continue
.Break: ret
.end |
|
Чисто в "Совместимые лазеры", остается 2 места: колонка с названиями, которая идет следом и меню вооружения (там усложненней ситуация). Кионки определяю по Name ID, кстати есть типа "width multiplier" (шаг) - линия ужимается и ещё 20-30 ячеек можно создать без проблем. Впрочем, не в курсе можно ли добавлять новое оружие вообще, там же тупо захардкодили int32 и все его биты. Я пока всё.
В .patchcode вместо XXXXXXXX нужно вписать адрес строки KyonDrawMaskColors (т.е. пропатчить x3story вручную). После асма, затем дизасма, в файле .str она появится. В связке strg и call87 почти идеальны: больше не нужно следить за оффсетами если много методов добавлять/перемешивать. Но авто-постпатчинг это не заменит.
Заметил особенность shl: нужно делать shl SP[1],SP[0], но результат идет в SP[0]. Обычно же %instruction% SP[0],SP[1]
Ред.
Посмотрел X-Tended, новые пушки наследуются от существующих битов прям как хаакские от одного того же. Обж такое обыгрывает, устраивая "битву" между размером корабля и размером пушки (S, M, XL которые). Если корабль побеждает, то пушка поддерживается и нужно слот закрашивать
Перехватчик S = КЛ1(S)
Истребитель M = КЛ1(S) + КЛ2(M)
Авианосец XL = КЛ1(S) + КЛ2(M) + КЛ3(XL)
Невозможно сделать корабль M, который бы поддерживал только КЛ-2... КЛ-1 будет автоматически поддерживаться т.к. от одного того же бита и размер S < M (???). Пусть так, попробую таки завершить патч полностью на кионках, и спец-таблицу в отдельный xml для удобства. Ради новых пушек, но с нюансом распила хаакских... хотя позиции ячеек кастомизироваными планируются быть (виртуальность) и мухлеж-закономерность как выше с хаакскими кораблями можно будет слегка попытаться "размыть", разбросать эти слоты короче.
Последний раз редактировалось: Whiskas (18:04 23-08-2018), всего редактировалось 3 раз(а) |
|
|
DNA78
429 EGP
     Рейтинг канала: 9(1069) Репутация: 73 Сообщения: 1268 Откуда: Кыргызстан Зарегистрирован: 12.11.2008
 |
|
Whiskas T-Mech : |
Посмотрел X-Tended, новые пушки наследуются от существующих битов прям как хаакские от одного того же.
|
От каких битов , вы о чём сейчас вообще. Складывается ощущение, что вы там в хексе кодите.
..биты, авто-постпатчинг, оффсеты - ужас какой
Может обж новый сделаем или экзешник разберём
_________________ Очевидное-невероятное |
|
|
Whiskas
137 EGP
  Рейтинг канала: 3(36) Репутация: 5 Сообщения: 139
Зарегистрирован: 28.04.2011
 |
|
SG_LASER! Или как его в X Editor, ну да, там имена. SubType
0x80000000 - Кионки
0x40000000 - Ремонтные(или кажется резервные) лазеры
и т.д.
SA_GetShipTypeTurretLaserMask возвращает именно это.
DNA78 : |
Складывается ощущение, что вы там в хексе кодите.
..биты, авто-постпатчинг, оффсеты - ужас какой
Может обж новый сделаем или экзешник разберём
|
В winhex-е, ассемблер же не патчит где и что нужно мне. Если всё реализовать на что я сетовал можно станет просто релизить asm-ы в любом порядке, применять что хочется как моды будут. Любой набор новых фич по желанию самого игрока. Мне делать обертку над xa_asm чтобы зарелизить - смысла 0, я ничего не поддерживаю и исключительно на x64 пишу прикладной софт с кучей новых наборов инструкций, не у всех запустилось бы даже. Т.е. могу чисто для себя по-простому, тогда апать тему смысла уже не станет.
По exe немного подумал о динамическом патче загружаемого x3story, перехватить чтение и эти же бы asm-ы прям на лету применять из какой-нибудь папки \obj_patches.
Последний раз редактировалось: Whiskas (00:15 24-08-2018), всего редактировалось 3 раз(а) |
|
|
kvadrat
222 EGP
  Рейтинг канала: 5(119) Репутация: 57 Сообщения: 730 Откуда: Не помню Зарегистрирован: 17.12.2008
 |
|
DNA78 : |
..биты, авто-постпатчинг, оффсеты - ужас какой
Может обж новый сделаем или экзешник разберём
|
ЕХЕ просто патчить в Оле дебагере напрямую.А вот недоделаную длл(обж) без исходника ехе похуже
_________________ Языковой барьер, конечно, существует - но водка спасает... |
|
|
Whiskas
137 EGP
  Рейтинг канала: 3(36) Репутация: 5 Сообщения: 139
Зарегистрирован: 28.04.2011
 |
|
Чет я загнул про 30 новых... около 45 получилось пока (+15 где-то). Всё сделал:
Cкрытый текст (кликните здесь для просмотра)
|
Специальный файл types\TLaserArray.txt
Код: |
3|5|7|0|0
0;28;28;28;SS_LASER_IRE
0;48;48;48;SS_LASER_PAC
0;80;80;80;SS_LASER_HEPT
0;112;112;112;SS_LASER_CIG
0;144;144;144;SS_LASER_PPC
0;176;176;176;SS_LASER_MASS
0;208;208;208;SS_LASER_MINING;SS_LASER_TUG;SS_LASER_REPAIR
0;158;158;10;SS_LASER_PRG
0;206;206;13;SS_LASER_FLAK_CLUSTER
0;248;248;150;SS_LASER_PBC
0;1;71;142;SS_LASER_IOND
0;1;110;218;SS_LASER_IPG
0;93;173;254;SS_LASER_IONC
0;97;69;0;SS_LASER_FBL
0;148;106;0;SS_LASER_PSG
0;199;143;0;SS_LASER_TRIBEAM
0;24;119;24;SS_LASER_EBC
0;37;182;37;SS_LASER_FLAK_ALPHA
0;129;227;120;SS_LASER_GAUSS
0;167;79;1;SS_LASER_PBE
0;244;114;1;SS_LASER_ESR
0;254;154;67;SS_LASER_PAL
0;137;1;1;SS_LASER_PD
0;214;1;1;SS_LASER_IBL
#Terran Lasers
0;1;80;80;SS_LASER_EMP
0;1;112;112;SS_LASER_MAM
0;1;162;162;SS_LASER_TERRANANTIFIGHTER
0;1;213;213;SS_LASER_PSP
0;138;254;254;SS_LASER_FUSIONBEAM
#Aldrin Lasers
-1;240;240;240;SS_LASER_EMP_1;SS_LASER_MAM_1;SS_LASER_TERRANANTIFIGHTER_1
#Reserve Lasers
-1;240;240;240;SS_LASER_DUMMY1;SS_LASER_DUMMY2
#Khaak Lasers
-1;112;1;223;SS_LASER_KH_ALPHA;SS_LASER_KH_BETA;SS_LASER_KH_GAMMA |
Это ванильный вариант, 1 в 1 по поведению.
Ровно на первой строке должны быть 5 цифр через |
Код: |
1 - Ширина слота
2 - Ширина обводки слота, когда установлен лазер
3 - Расстояние между слотами
4 - Смещение всех слотов по горизонтали в меню информации
5 - Смещение всех слотов по горизонтали в меню вооружения |
Далее идут слоты, если кол-во значений через ; не меньше четырех то добавится.
Код: |
1 - 0 = не скрывать слот, любое другое = скрыть (пробелов между не будет)
2 - R
3 - G
4 - B
5 и далее - ID лазеров. |
Порядок имеет значения, даже если слот скрыт есть ещё колонка поддерживаемых лазеров, порядок показа сохраняется и цвет вытаскивается. Если какие-то лазеры не "зарегистрированы" в этом файле - они тупо не покажутся в списках. Всё оружие нужно разбрасывать. Ну, а ячейка загорится цветом тогда, когда действительно возможно установить лазер(ы) из под того слота.
Вариант в скринах был такой (первая строка 2|4|5|0|0), затем в конце:
Код: |
....
#Aldrin Lasers
0;80;80;255;SS_LASER_EMP_1
0;130;130;255;SS_LASER_MAM_1
0;180;180;255;SS_LASER_TERRANANTIFIGHTER_1
#Reserve Lasers
-1;240;240;240;SS_LASER_DUMMY1;SS_LASER_DUMMY2
#Khaak Lasers
0;112;1;223;SS_LASER_KH_ALPHA
0;152;60;238;SS_LASER_KH_BETA
0;172;120;253;SS_LASER_KH_GAMMA
#Dummy slots
0;0;0;0
0;0;0;0
0;0;0;0
0;0;0;0
0;0;0;0
0;0;0;0
0;0;0;0
|
Вариант хака ранее для хаакских с единственной ячейкой:
Код: |
0;112;1;223;SS_LASER_KH_ALPHA;SS_LASER_KH_BETA;SS_LASER_KH_GAMMA |
Редактировать и пересохранять не выходя из игры - Alt-Tab просто переоткрыть меню. В аттаче для 3.2 готовый файл чисто на посмотреть + asm.
Хотя я сделал для 3.4 (в асме видно), но игра отказалась загружать сохранения с таким обжом. Чистые сохранения от 3.2 не загрузил, а новую игру пожалуйста и работает вроде т.е. патч корректен был... А вообще по коду - вроде нормально, везде корректно отображается (информация, вооружение, энциклопедия, чертежи).
laser_array.7z |
Описание: |
|
Имя файла: |
laser_array.7z |
Размер файла: |
1.39 MB |
Скачано: |
527 раз(а) |
Последний раз редактировалось: Whiskas (11:19 03-09-2018), всего редактировалось 2 раз(а) |
|
|
DNA78
429 EGP
     Рейтинг канала: 9(1069) Репутация: 73 Сообщения: 1268 Откуда: Кыргызстан Зарегистрирован: 12.11.2008
 |
|
Whiskas T-Mech : |
В аттаче для 3.2 готовый файл чисто на посмотреть + asm.
|
Ну вроде на версии 3.4 работает Спасибо!
Вот только информация по .patchcode для 3.2 и 3.4 данная в laser_array.asm не полная. Если бы не готовый обж для 3.2, то ничего не получилось. Конкретный завис. Оказывается в функции ; function MENU_SHIPINFO.SpecialUpdate(); вырезан конкретный кусок кода, и изменены метки. А в .patchcode где об этом информация ?
_________________ Очевидное-невероятное |
|
|
Whiskas
137 EGP
  Рейтинг канала: 3(36) Репутация: 5 Сообщения: 139
Зарегистрирован: 28.04.2011
 |
|
DNA78 : |
Оказывается в функции ; function MENU_SHIPINFO.SpecialUpdate(); вырезан конкретный кусок кода, и изменены метки. А в .patchcode где об этом информация ?
|
Прям вот вырезать нет такого, но некоторый код действительно становится неиспользуемым. Это наверное про LaserDrawMaskColumn, вместо оригинального рисования колонки:
Цитата: |
push SP[22d] ; loc2
read MENU_SHIPINFO.var_2229_0 ; [81d ; 51h]
push 1
callasm SE_ArraySize
if SP[0]<=SP[1] then push 0 else push 1
if SP[0]=0 then jump L0010A828
|
становится:
Код: |
nop
push SP[2] ; loc22
push 1
call87 LaserDrawMaskColumn
popx 6
jump L0010A892 |
Так вот, L0010A828 (когда уже заканчивается в оригинале луп как следствие рисование колонки) ведет к
Код: |
L0010A828: pop
jump L0010A86A
L0010A86A: popx 4
jump L0010A892 |
Я просто сделал чтоб ввело к L0010A892. Это на примере 3.2.
Забыл кстати сделать проверку ID лазеров, но не критично - несуществующие SS_LASER или если даже просто сейчас какую-нибудь строку добавить наугад, то автоматом будет считаться Импульсной Пушкой)
|
|
|
DNA78
429 EGP
     Рейтинг канала: 9(1069) Репутация: 73 Сообщения: 1268 Откуда: Кыргызстан Зарегистрирован: 12.11.2008
 |
|
Whiskas T-Mech : |
Прям вот вырезать нет такого
|
После следующей компиляции обжа прям вот будет вырезан
так как все коменты удалятся.
_________________ Очевидное-невероятное |
|
|
ЛЕОПАРД
89 EGP
 Рейтинг канала: 4(75) Репутация: 22 Сообщения: 307
Зарегистрирован: 05.04.2011
 |
|
Whiskas T-Mech : |
Чет я загнул про 30 новых... около 45 получилось пока (+15 где-то). Всё сделал:
|
Дружище, как ты это сделал?)
Очень бы помого если бы пропатчил ОБЖ AP 3.3. Потому-что у меня дофига новых пушек, а групп уже ппц как не хватает.
Для баланса это было бы нереально круто, т.к. можно почти каждую пушку в отдельный слот добавлять.
|
|
|
Whiskas
137 EGP
  Рейтинг канала: 3(36) Репутация: 5 Сообщения: 139
Зарегистрирован: 28.04.2011
 |
|
Да обновил аттач. Пихал файлы в папки L и types в \addon, но файлы не подхватываются, пришлось делать 05.cat/dat. Я в него не играю без понятия че там опять поменяли...
Если влево ещё сместить (4 и 5 значения на первой строке, заодно не забыв сократить переводы типа "Турель Левая Кормовая"), то можно попытаться до 50 видимых слотов сделать.
Тестите, особенно откат обжа. У меня вроде всё загружается т.е. не разрушительный патч вообщем. Только для 3.4 че-то не получилось в прошлый раз, может опять стоит попробовать
|
|
|
ЛЕОПАРД
89 EGP
 Рейтинг канала: 4(75) Репутация: 22 Сообщения: 307
Зарегистрирован: 05.04.2011
 |
|
Whiskas T-Mech, займись лучше альбионом, плиз...
Ну зачем ТС нужен? АР лучше оптимизирован.
|
|
|
za4ot
524 EGP
     Рейтинг канала: 5(190) Репутация: 17 Сообщения: 3549 Откуда: Яма Изобилия Зарегистрирован: 08.08.2012
 |
|
ЛЕОПАРД : |
Ну зачем ТС нужен?
|
ТС форева, АР маст дай!
_________________ Пираты - наше всё! |
|
|
Whiskas
137 EGP
  Рейтинг канала: 3(36) Репутация: 5 Сообщения: 139
Зарегистрирован: 28.04.2011
 |
|
Никогда. Мне резонней просто из AP перенести новые корабли и конфиг продажи земных станций если уж приспичет, больше существенного я ничего не заметил. Повырезали декку, торус, сюжетки, эксплойты на размножение, а скрипт на войнушку с красными секторами мне вообще не сдался.
С картой разве что неплохо вышло, но надо на ноут ставить сначала и смотреть. Ят на квадратном. там не в тему делать если не выставить 1600x1200 каким-то образом. Такое я смог только на ЭЛТ монике, реально все мелкое становилось.
|
|
|
ЛЕОПАРД
89 EGP
 Рейтинг канала: 4(75) Репутация: 22 Сообщения: 307
Зарегистрирован: 05.04.2011
 |
|
za4ot : |
ТС форева, АР маст дай!
|
Чушь.
Ну да ладно. Не буду тогда тратить свое и ваше время.
|
|
|
DNA78
429 EGP
     Рейтинг канала: 9(1069) Репутация: 73 Сообщения: 1268 Откуда: Кыргызстан Зарегистрирован: 12.11.2008
 |
|
Whiskas T-Mech : |
В аттаче для 3.2 готовый файл чисто на посмотреть + asm.
|
Хотелось бы полюбопытствовать, а для чего были изменены следующие строки:
"%d %s/%sВІ" на "%d %s/%s²"
"В«" и "В»" на "«" и "»"
"%dВ°" на "%d°"
_________________ Очевидное-невероятное |
|
|
Dusky
100 EGP
 Репутация: 8 Сообщения: 828
Зарегистрирован: 29.05.2014
 |
|
Есть ли возможность изменить источник апгрейдов для верфи? к примеру, в секторе док и аванпост, верфь ставит апгрейды с дока, изменить на аванпост. вынести док пробовал - не вышло, видимо привязка на уровне конкретной станции, а не "ближайший объект типа "Док оборудования"
|
|
|
|
|
|
Канал X3: Terran Conflict ->
Модовый и скриптовый отсек X3: Terran Conflict: «X3TC Моддинг: obj-файлы и маленькие утилитки» |
|
К списку каналов | Наверх страницы |
Цитата не в тему: Мы не кровожадные. Нам просто места мало. (предупредил mister X)
|
» X3TC Моддинг: obj-файлы и маленькие утилитки | страница 11 |
|