Сможешь выдать как можно больше инфы о работе писишной дюны? Про юниты, строения, дома, команды(team).
Постараюсь
Что конкретно интересует? Команды - это, по сути, очень простые скрипты, прписанные для каждой миссии, которые определяют, какие группы юнитов компьютер должен слать на врага. Например:
1=Harkonnen,Normal,Wheeled,2,3
Это означает, что ИИ-Харконнены должны строить группы их двух-трех колесных юнитов (квадов) и слать их на базу игрока. Использовалось два типа групп - Normal и Kamikaze, первые будут по пути отстреливаться, если их атакуют, вторые - игнорировать вражеский огонь и переть прямо к выбранной цели (наиболее приоритетному зданию игрока). К сожалению, большинство этих скриптов в PC-версии все равно не работали, т.к. по ошибке везде вместо Wheeled и Tracked (т.е. колесной и гученично техники соответственно) было прописано неправильное Wheel и Track, так что ИИ использовал только атакующие группы пехоты, а технику строил по одному юниту и сразу бросал их на базу игрока (группы, в общем, действуют более организованно. чем индивидуальные юниты, например, моугт отступать и т.п.). Я сделал небольшой
патч, исправляющий, среди прочих, эту ошибку (сорри за саморекламу
).
Ещё хотелось бы про карту на экране брифинга узнать, как она построена, чтоб цвета участков земли можно было менять.
В PC-версии карта показывается не во время брифинга, а до него, т.к. там еще можно выбирать из нескольких вариантов каждой миссии (как в играх серии
Command & Conquer). "Раскраска" карты прописана в файлах REGION#.INI (где # - первая буква названия Дома, т.е. A, H или O), они, по-моему, валяются и в РОМе. Там же есть и текст, сопровождающий изменения на карте (после каждой миссии завоеванные регионы закрашиваются цветом Дома игрока, другие Дома тоже что-то отвоевывают друг у друга и т.п.) Пример:
[GROUP1]
HAR = 6, 5, 4, 10, 3, 9
ATR = 13, 7, 20, 14, 21, 22
ORD = 19, 27, 26, 25, 24, 23
REG1 = 1, 7, 40, 16
REG2 = 2, 8, 106, 34
REG3 = 8, 7, 136, 72
ENGTXT6 = Harkonnen arrived first.
ENGTXT13 = The weak Atreides will be easy.
ENGTXT19 = The Ordos are getting closer.
Цифры напротив названий Домов обозначают, какие регионы (их всего 27) надо закрасить цветом данного Дома, строки "REG# =" - это те регионы, которые игрок может выбрать для следующего завоевания (по порядку идут: номер региона, номер спрайта стрелки, которая будет указывать направление захвата, x-координата левого верхнего угла спрайта стрелки на экране, y-координата левого верхнего угла спрайта стрелки на экране)
И хотелось бы узнать про состав WSA анимаций. И если есть там сжатие данных, то и про них тоже хочется знать. Надеюсь тебе не составит труда?
Существует набор утилит, поддерживающий конверсию WSA->PNG и обратно под названием
Red Horizon Utilities (изначально предназначенный для игры
Red Alert, там тоже используется формат WSA, правда, немного другой. В пакете с утилитами есть и исходники, по которым, я так думаю, можно узнать о самом формате больше. К сожалению, сам я не очень компетентен в программировании, так что описать формат не смогу. Точно знаю, что алгоритм компрессии там присутствует, и, наверное, он там такой же или похожий на то, что используется другими графическими форматами, например, SHP (Red Horizon Utilities формат SHP также поддерживают).
Привет.
В редакторе есть такой параметр: 'Threat levev for AI' , также перед ним идет unknown23, по сути они являются часть одного целого, это видно по коду сеги.
Правда я еще не понял как это влияет на ИИ.
ROM:0006BFCE dc.w $82 ; ?? $235C4 $235C8 $472E8
ROM:0006BFD0 dc.w $96 ; ?? $472E4
Участок $472E4
ROM:000472DE bne.s threat
ROM:000472E0 moveq #0,d0
ROM:000472E2 bra.s loc_4730E
ROM:000472E4 ; ---------------------------------------------------------------------------
ROM:000472E4
ROM:000472E4 threat: ; CODE XREF: sub_4716E+170j
ROM:000472E4 move.w $30(a4),d3
ROM:000472E8 add.w $2E(a4),d3
ROM:000472EC tst.w d4
ROM:000472EE beq.s loc_472FE
ROM:000472F0 move.w d3,d1
ROM:000472F2 move.w d4,d0
ROM:000472F4 jsr sub_49BE0
ROM:000472FA move.w d1,d3
ROM:000472FC addq.w #1,d3
ROM:000472FE
ROM:000472FE loc_472FE: ; CODE XREF: sub_4716E+180j
ROM:000472FE cmpi.w #32000,d3
ROM:00047302 bls.s loc_4730A
ROM:00047304 move.w #32000,d0
ROM:00047308 bra.s loc_4730E
OM:0004730A ; ---------------------------------------------------------------------------
ROM:0004730A
ROM:0004730A loc_4730A: ; CODE XREF: sub_4716E+194j
ROM:0004730A moveq #0,d0
ROM:0004730C move.w d3,d0
ROM:0004730E
ROM:0004730E loc_4730E: ; CODE XREF: sub_4716E+16j
ROM:0004730E ; sub_4716E+28j ...
ROM:0004730E movem.l (sp)+,d3-d4/a2-a5
ROM:00047312 rts
ROM:00049BE0 sub_49BE0: ; CODE XREF: sub_1068C+86p
ROM:00049BE0 ; sub_2E684+72p ...
ROM:00049BE0 swap d1
ROM:00049BE2 clr.w d1
ROM:00049BE4 swap d1
ROM:00049BE6 divu.w d0,d1
ROM:00049BE8 swap d1
ROM:00049BEA clr.w d1
ROM:00049BEC swap d1
ROM:00049BEE rts
$30(a4)=threat , $2E(a4)=unknown23.
что они там курили? и так складываем оба значения, далее если d4 не 0 , то делим сумму на d4, добавляем 1, сравниваем с 32000, и пишем в d0, если больше получилось пишем 32000.
Но как видно unknown23, еще используется и в другом месте:
OM:000235A4 jsr (randomisation).l
ROM:000235AA andi.b #3,d0
ROM:000235AE bne.s loc_235B4
ROM:000235B0 move.w d5,d3
ROM:000235B2 bra.s loc_235DA
ROM:000235B4 ; ---------------------------------------------------------------------------
ROM:000235B4
ROM:000235B4 loc_235B4: ; CODE XREF: sub_23500+AEj
ROM:000235B4 cmpi.w #$FFFF,d3
ROM:000235B8 beq.s loc_235CE
ROM:000235BA movea.l (a2),a1
ROM:000235BC move.w d3,d0
ROM:000235BE lsl.w #2,d0
ROM:000235C0 movea.l (a3,d0.w),a0
ROM:000235C4 move.w $2E(a1),d0
ROM:000235C8 cmp.w $2E(a0),d0
ROM:000235CC ble.s loc_235D0
ROM:000235CE
ROM:000235CE loc_235CE: ; CODE XREF: sub_23500+B8j
ROM:000235CE move.w d5,d3
ROM:000235D0
ROM:000235D0 loc_235D0: ; CODE XREF: sub_23500+A2j
ROM:000235D0 ; sub_23500+CCj
ROM:000235D0 addq.l #4,a2
ROM:000235D2 addq.w #1,d5
ROM:000235D4 cmpi.w #$20,d5
ROM:000235D8 blt.s loc_2359C
ROM:000235DA
ROM:000235DA loc_235DA: ; CODE XREF: sub_23500+Cj
ROM:000235DA ; sub_23500+B2j
ROM:000235DA move.w d3,d0
ROM:000235DC
ROM:000235DC loc_235DC: ; CODE XREF: sub_23500+84j
ROM:000235DC ; sub_23500+90j
ROM:000235DC movem.l (sp)+,d3-d5/a2-a3
ROM:000235E0 rts
а тут идет сравнение 'unknown23' от двух разных юнитов, и если меньше или равно, то что-то там происходит, а если больше то что-то другое.
Да, я помню, параметр Unknown 023 у нас обсуждался. Вот что пишет тов.
TrueBrain (из проекта
OpenDUNE, это воссоздание движка PC-версии
Dune II на основе инженерного анализа программы, рекомендую ознакомиться, там тоже много полезной инфы - и на сайте, и на
форуме): этот параметр используется при выборе наиболее приоритетной цели, а также при выборе того, какие юниты ИИ собирается строить. При этом происходит проверка, есть ли у ИИ грузолет и харвестер (если есть, больше строить не надо), а среди прочих юнитов для строительства обычно отбираются те, у кого этот параметр выше.
А вот немного инфы о Lemonfactor'e домов:
ROM:000469C6 jsr (randomisation).l
ROM:000469CC move.w d0,d2
ROM:000469CE move.w d3,d0
ROM:000469D0 lea (Houses).l,a1
ROM:000469D6 add.w d0,d0
ROM:000469D8 move.w d0,d1
ROM:000469DA lsl.w #4,d0
ROM:000469DC sub.w d1,d0
ROM:000469DE adda.w d0,a1
ROM:000469E0 ext.l d2
ROM:000469E2 moveq #0,d0
ROM:000469E4 move.w 6(a1),d0 ; lemonfactor
ROM:000469E8 cmp.l d0,d2
ROM:000469EA bge.s loc_469F2
ROM:000469EC bset #2,4(a2)
ROM:000469F2
ROM:000469F2 loc_469F2: ; CODE XREF: UNIT_CREATING+10Aj
ROM:000469F2 ; UNIT_CREATING+130j
ROM:000469F2 moveq #1,d5
берется рандом число кидается в d2 (jsr (randomisation).l
ROM:000469CC move.w d0,d2), грузится lemon по id дома (move.w 6(a1),d0), сравнивается его 'лимонфактор' с этим числом. (cmp.l d0,d2)
если что-то там больше получилось то переход дальше, а если меньше , то записывается '1'-ка в третий бит строки юнита+4 , (set #2,4(a2) ) , [в a2 лежит адрес строки текущего юнита].
Ну и как видно это всё происходит при создании юнита. (unit creating я назвал ROM:000468BA UNIT_CREATING: )
А вот за что этот бит отвечает, да фиг его знает, я не смотрел. Т.е. надо проверить чтение скажем с адреса $FFE138+4, где $FFE138 - адрес строки 2-ого наземного юнита.
Да,
TrueBrain об этом тоже говорил, но мы так и не догадались, зачем это нужно. Кто-то предположил, что это влияет на агрессивность юнитов, но неизвестно, верно это или нет.