Nemesis_c | Дата: Вторник, 02.08.2011, 23:18 | Сообщение # 1 |
Сообщений: 1148 Статус: Offline
| r57shell:
Dune 2: The Battle for Arrakis (U)
Статья эта, как пример. Не стал собирать всю инфу из темы на эмо-стране. Посмотрел только первые 5 страниц, а остальное сам. Просьба то, чего знаете кроме этого - писать где-нибудь в форуме.
byte - байт, word - 2 байта, long - 4 байта. null_terminated_string - набор байтов означающих символы пока не встерится нулевой байт. Как найти конфиги карт (сцен) и не только.
Есть таблица оффсетов карт ROM:00052C34. В ней чередуются оффсет имени файла, оффсет самого файла. Есть две функции связанных с этими файлами ROM:000046A8 - которая берёт оффсет, и ROM:00004A34 которая выдаёт номер по счёту.
Подробнее о функциях.
ROM:000046A8
принимает первым аргументом оффсет на имя файла. возвращает a0,d0 - file offset. Если файл не найден, возвращет 0.
ROM:00004A34
принимает первым аргументом оффсет на имя файла. возвращает d0- file id. Если файл не найден, возвращет 0.
Файлы карт имеют имена вида SCE0NX.YYY.INI, где X- дом(House) первая буква, YYY - номер миссии. Формат карт (сцен) (thanks to Ti_ & Segaman).
Весь файл сцены состоит из команд, и их параметров. Причём обработчик команды сам обрабатывает(пропускает) все свои парамерты, и дальше вступает обработчик следуйщей.
Сначала идёт номер команды размером один байт, а потом параметры команды. Команд всего 11, последняя 10($A). При встрече несуществующей команды, пропускается байт номера команды, и следуйщий байт. При встречи отрицательной команды (чаще всего используется байт $FF) список команд считается оконченным.
Команда 0 - команда настроек [BASIC] - основное. Первый байт её параметров - номер настройки, а за ним идут параметры самой настройки. Настроек 9, последняя 8. Настройка 0 - картина пройгрыша (LosePicture). Первый параметр word означает сколько отступить после этого word-а чтобы продолжить обработку команд, т.е. оффсет на следующую команду. Второй параметр - строка (null_terminated_string) имя файла картинки. Идёт после предыдущего параметра. Настройка 1 - картина победы (WinPicture). Набор параметров такой-же как и у настройки 0. Настройка 2 - картина введения(BriefPicture - Картина инструкции). Набор параметров такой-же как и у настройки 0. Настройка 3 - неизвестно (TimeOut). Один параметр word. Настройка 4 - размер карты (MapScale). Один параметр word. 0 - большая карта. 1 - маленькая карта Настройка 5 - координата курсора (CursorPos). Один параметр word. Два байта y,x. Настройка 6 - координата экрана (TacticalPos). Один параметр word. Два байта y,x. Настройка 7 - LoseFlags. Один параметр word. Настройка 8 - WinFlags. Один параметр word.
Команда 1 - земля [MAP] - карта. Первый байт её параметров - первая буква типа подкоманды: Подкоманда Bloom - спайсовые точки. Первый word - количество спайс точек. Следуйщие word-ы - координаты спайс точек (y,x). Подкоманда Field - не используется, неизвестно чего было, запоминается только адрес где записаны word-ы. Первый word - количество. Следуйщие word-ы - неизвестно. Подкоманда Seed - номер карты земли. Судя по названию, это был Seed для рандома, т.е. у них вполне возможно был генератор случайных карт. Один параметр word - номер карты земли.
Команда 2 - конфигурация дома харконенов [Harkonnen]. Первый байт - первая буква настройки. Если хоть одна конфигурация встретилась, после неё должно быть ещё три, иначе может произойти баг. Quota - word сколько собрать спайса. Credits - word стартовое количество денег. Brain - word - первая буква AI. H (Human) - человек. C (СPU) - компьютер. Human обязательно H, остальное - Computer.
Команда 3 - конфигурация дома атрейдесов [Atreides]. Параметры как у команды 2.
Команда 4 - конфигурация дома ордосов [Ordos]. Параметры как у команды 2.
Команда 5 - конфигурация дома червя? (3-го дома с нуля). Параметры как у команды 2.
Команда 6 - настройка Starport [CHOAM]. Первый байт - unit (типа юнита). word - максимальное количество таких юнитов.
Команда 7 - группы [TEAMS]. 1. byte - номер групы. 2. word - house (дом) 3. word - первая буква AI. Normal, Kamikaze. 4. word - первая буква типа групп. Foot, Track, Wheel. 5. word - минимальное количество. 6. word - максимальное количество.
Команда 8 - войска [UNITS]. 1. byte - неизвестно 2. word - house (дом). 3. word - unit (типа юнита). 4. word - жизнь вроде в процентах (256=$100). 5. word - координаты. Два байта на y,x. y - направление неизвестно. x - слева направо. 6. word - неизвестно. 7. word - неизвестно.
Команда 9 - строения [STRUCTURES]. 1. byte - неизвестно. 2. word - неизвестно. 3. word - house (дом). 4. word - building_id (уникальный идентификатор типа юнита). 5. word - жизнь вроде в процентах (256=$100). 6. word - координаты. Два байта на y,x. y - направление неизвестно. x - слева направо.
Команда 10 - десант [REINFORCEMENTS]. Примеры: Первая миссия за Atreides ROM:00056FAE: Code dc.b 0 ; command = BASIC dc.b 0 ; prop = LosePicture dc.w $E ; data length dc.b 'LOSTBILD.WSA',0 dc.b 0 dc.b 0 ; command = BASIC dc.b 1 ; prop = WinPicture dc.w $A dc.b 'WIN1.WSA',0 dc.b $57 ; W ; not used dc.b 0 ; command = BASIC dc.b 2 ; prop = BriefPicture dc.w $C dc.b 'HARVEST.WSA',0 dc.b 0 ; command = BASIC dc.b 3 ; prop = TimeOut dc.w 0 ; value dc.b 0 ; command = BASIC dc.b 4 ; prop = MapScale dc.w 1 ; value = Small dc.b 0 ; command = BASIC dc.b 5 ; prop = CursorPos dc.w $4C8 ; value dc.b 0 ; command = BASIC dc.b 6 ; prop = TacticalPos dc.w $4C8 ; value dc.b 0 ; command = BASIC dc.b 7 ; prop = LoseFlags dc.w 4 ; value dc.b 0 ; command = BASIC dc.b 8 ; prop = WinFlags dc.w 6 ; value dc.b 1 ; command = MAP dc.b $53 ; subcommand = earth map id dc.w 1 ; value dc.b 3 ; command = Ateides dc.b $51 ; Q dc.w $3E8 ; Quota dc.b 3 ; command = Ateides dc.b $43 ; C dc.w $3DE ; Credits dc.b 3 ; command = Ateides dc.b $42 ; B dc.w $48 ; Brain = H = Human dc.b 3 ; command = Ateides dc.b $4D ; M dc.w $19 ; MaxUnits dc.b 4 ; command = Ordos dc.b $51 ; Q dc.w 0 ; Quota dc.b 4 ; command = Ordos dc.b $43 ; C dc.w 0 ; Credits dc.b 4 ; command = Ordos dc.b $42 ; B dc.w $43 ; Brain = C = Computer dc.b 4 ; command = house ordos dc.b $4D ; M dc.w $10 ; MaxUnits dc.b 6 ; command = CHOAM (Starport) dc.b $D ; unit dc.w 5 ; maxcount dc.b 6 ; command = CHOAM (Starport) dc.b $F dc.w 5 dc.b 6 ; command = CHOAM (Starport) dc.b 9 dc.w 6 dc.b 6 ; command = CHOAM (Starport) dc.b 7 dc.w 5 dc.b 6 ; command = CHOAM (Starport) dc.b $A dc.w 6 dc.b 6 ; command = CHOAM (Starport) dc.b $10 dc.w 4 dc.b 6 ; command = CHOAM (Starport) dc.b $11 dc.w 2 dc.b 6 ; command = CHOAM (Starport) dc.b 1 dc.w 5 dc.b 8 ; command = UNITS dc.b 1 dc.w 2 ; house=hark dc.w 4 ; unit dc.w $100 ; hitpoints dc.w $41 ; coords dc.w $80 dc.w $B dc.b 8 ; command = UNITS dc.b 2 dc.w 2 ; house=hark dc.w 4 ; unit dc.w $100 ; hitpoints dc.w $46 ; coords dc.w $80 dc.w 8 dc.b 8 ; command = UNITS dc.b 3 dc.w 2 ; house=hark dc.w 4 ; unit dc.w $100 ; hitpoints dc.w $91 ; coords dc.w $80 dc.w 8 dc.b 8 ; command = UNITS dc.b 4 dc.w 2 dc.w 4 dc.w $100 ; hitpoints dc.w $DD dc.w $80 dc.w $B dc.b 8 ; command = UNITS dc.b 5 dc.w 2 dc.w 4 ; unit dc.w $100 ; hitpoints dc.w $28E dc.w $80 dc.w 8 dc.b 8 ; command = UNITS dc.b 6 dc.w 2 dc.w 4 ; unit dc.w $100 ; hitpoints dc.w $2D2 dc.w $80 dc.w 8 dc.b 8 ; command = UNITS dc.b 7 dc.w 2 dc.w 4 ; unit dc.w $100 ; hitpoints dc.w $38B dc.w $80 dc.w 8 dc.b 8 ; command = UNITS dc.b 8 dc.w 2 dc.w 4 ; unit dc.w $100 ; hitpoints dc.w $482 dc.w $80 dc.w 8 dc.b 8 ; command = UNITS dc.b 9 dc.w 1 ; house=atr dc.w 4 ; unit dc.w $100 ; hitpoints dc.w $486 dc.w $80 dc.w 3 dc.b 8 ; command = UNITS dc.b $A dc.w 1 ; house=atr dc.w $D ; unit dc.w $100 ; hitpoints dc.w $48A dc.w $20 dc.w 3 dc.b 8 ; command = UNITS dc.b $B dc.w 2 dc.w 4 ; unit dc.w $100 ; hitpoints dc.w $492 dc.w $80 dc.w 8 dc.b 8 ; command = UNITS dc.b $C dc.w 1 ; house=atr dc.w 2 ; unit dc.w $100 ; hitpoints dc.w $506 dc.w $80 dc.w 3 dc.b 8 ; command = UNITS dc.b $D ; unit dc.w 1 ; house=atr dc.w 4 dc.w $100 ; hitpoints dc.w $50B dc.w $80 dc.w 3 dc.b 8 ; command = UNITS dc.b $E dc.w 1 ; house=atr dc.w $D ; unit=trike dc.w $100 ; hitpoints dc.w $587 dc.w $A0 dc.w 3 dc.b 8 ; command = UNITS dc.b $F dc.w 2 dc.w 4 ; unit dc.w $100 ; hitpoints dc.w $5CD dc.w $80 dc.w 8 dc.b 8 ; command = UNITS dc.b $10 dc.w 2 dc.w 4 ; unit dc.w $100 ; hitpoints dc.w $603 dc.w $80 dc.w 8 dc.b 8 ; command = UNITS dc.b $11 dc.w 2 dc.w 4 ; unit dc.w $100 ; hitpoints dc.w $70F dc.w $80 dc.w 8 dc.b 8 ; command = UNITS dc.b $12 dc.w 2 ; home dc.w 4 ; unit dc.w $100 ; hitpoints dc.w $783 ; coords dc.w $80 dc.w $B dc.b 9 ; command = STRUCTURES dc.b $49 dc.w $13 dc.w 1 ; house=atr dc.w 8 ; CV dc.w $100 ; hitpoints dc.w $4C8 ; coords dc.b $FF ; end dc.b $FF
Обработчики команд:
ROM:0001621A dc.w $16 ; 16230 (0) BASIC ROM:0001621C dc.w $22 ; 1623C (1) MAP ROM:0001621E dc.w $2E ; 16248 (2) Harkonnen ROM:00016220 dc.w $2E ; 16248 (3) Atreides ROM:00016222 dc.w $2E ; 16248 (4) Ordos ROM:00016224 dc.w $2E ; 16248 (5) house worm ROM:00016226 dc.w $3E ; 16258 (6) CHOAM (Starport) ROM:00016228 dc.w $46 ; 16260 (7) TEAMS ROM:0001622A dc.w $54 ; 1626E (8) UNITS ROM:0001622C dc.w $62 ; 1627C (9) STRUCTURES ROM:0001622E dc.w $70 ; 1628A (A) REINFORCEMENTS
Обработчики настроек команды conf:
ROM:00016442 word_16442: dc.w $12 ; DATA XREF: ROM:0001643Ar ROM:00016442 ; 16454 (0) LosePicture ROM:00016444 dc.w $26 ; 16468 (1) WinPicture ROM:00016446 dc.w $3A ; 1647C (2) BriefPicture ROM:00016448 dc.w $4C ; 1648E (3) TimeOut ROM:0001644A dc.w $54 ; 16496 (4) MapScale ROM:0001644C dc.w $5C ; 1649E (5) CursorPos ROM:0001644E dc.w $84 ; 164C6 (6) TacticalPos ROM:00016450 dc.w $AC ; 164EE (7) LoseFlags ROM:00016452 dc.w $B4 ; 164F6 (8) WinFlags
House ID-s
(by Ti_)
00-харконен 01-атредес 02-ордос 03-червь/фремен 04-император
Unit ID-s
(by Ti_)
00-caryall 01-ornithopter 02-пехотаx3 03-тяжелая пехотаx3 04-пехотаx1 05-тяжелая пехотаx1 06-саботер 07-launcher 08-deviator 09-tank 0A-heavy tank 0B-devastator 0C-sonic tank 0D-trike 0E-raider trike 0F-quad 10-harvester 11-MCV 12-death hand(sprite) 13-16- missiles(sprites) 17-cannon sprite 18-sonicblast sprite 19-SANDWORM 1A-косм.перевозчик 1B-unused/other data гаечный ключ 1С-EXIT 1D-FIX 1E-STOP 1F-FIX выделен 20-STOP выделен FF-cursor sprite
Building ID-s
(by Ti_)
00-плита 01-плита 2x2 02-дворец 03-машинный завод/??/ 04-машинный завод quad 05-авиа завод /??/ 06-nothing 1X 07-казармы 08-CY 09-windtrap 0A-казармы 0B-starport 0C-refinery 0D-repair 0E-wall 0F-turret 10-r-turret 11-silos 12-radar 13-otherdata гаечный ключ 14-otherdata
так задаются обычные дома в конфиге карты:
0351 03E8 0343 03DE 0342 0048 034D 0019 где каждый нечентный 03xx - что задавать
0351 - квота 3e8 (1000) 0343 - кредиты 3de (995) 0342 - AI или хуман (0048 или 0043) 034D - юнит лимит 0019 (25)
0251 и т д - харконены 0351 - атредесы 0451 - ордосы 0551 - сардукары 06xx - а это уже старпорт
07xx - тимс (дом, тип команды (Normal или Kamikaze) тип техники (footed tracked wheeled slither), кол-во мин и макс) 0701 0000 004E 0046 0004 0005 07xx- ID (кажется 16макс), 0000 - номер дома (харк), 4e=N (нормал), 46= F (footed =пехота), 0004 мин участников, 0005 макс участников
1=Harkonnen,Normal,Wheeled,2,3 Это означает, что ИИ-Харконнены должны строить группы их двух-трех колесных юнитов (квадов) и слать их на базу игрока. Использовалось два типа групп - Normal и Kamikaze, первые будут по пути отстреливаться, если их атакуют, вторые - игнорировать вражеский огонь и переть прямо к выбранной цели (наиболее приоритетному зданию игрока). К сожалению, большинство этих скриптов в PC-версии все равно не работали, т.к. по ошибке везде вместо Wheeled и Tracked (т.е. колесной и гученично техники соответственно) было прописано неправильное Wheel и Track, так что ИИ использовал только атакующие группы пехоты, а технику строил по одному юниту и сразу бросал их на базу игрока (группы, в общем, действуют более организованно. чем индивидуальные юниты, например, моугт отступать и т.п.). 56FF8-9:номер карты 56FE4-5:X-координата курсора 56FFA-B:цель миссии,C-D:прочие данные(в первой миссии-сумма денег, которую над сабрать)
0142-спайсовые точки; 0003 -кол-во спайсовых точек.; далее их коорд. (0242 03CF 044C)
Пример: 09 49 00 13 00 01 00 08 01 00 04 C8
0949 тип записи для зданий 0013 вроде порядк.номер. 0001 - атредесов. 0008сбордвор 0100 -100%хп 04C8-коорд.
0947 0122 0001 000E - 0947-тип записи(для стен и плит), 0122 коорд, 0001 - дом, 000E - тип строения
0949 000F 0001 000C 0100 01ED - 0949 -тип записи(для зданий). 000F (ID-совпадать не должны), 0001 -дом , 000C - тип строения, 0100 - 100%хп(можно задавать больше), 01ED - коорд.
0813 0001 000С 0100 03A4 0080 0008 - unit(ID), дом, юнит, хп, коорд, unkn, unkn (guardmode?)
0A 05 0004 000B 0006 01 2B - десант, (ID), дом, юнит, unkn(base,home?), через сколько высадка, повторять?(2B=да)
Как найти часть графики (не всю).
По адрессу ROM:000С7С72 находятся оффсеты по 4 байта (long). Самые старшие их биты неизвестно чего означают. И неизвестно что означают определенные значения оффсетов типа $FFFFFFFF.
Оффсеты идут в группах по 4.
1. Оффсет на графику.
Cначала идёт список из групп word,long. Первое похоже флаги, второе оффсеты. если word равен нулю, то список считается закончиным. 2. Оффсет на ещё что-то.
Cначала идёт список из групп word,long. Первое похоже флаги, второе оффсеты. если word равен нулю, то список считается закончиным. 3. Оффсет на палитру. 64 word - цвета. (полная палитра сеги). 4. Оффсет на ещё что-то.
Набор рипнутых спрайтов by Segaman.
Скачать Дополнительные ссылки.
http://arrakis.dune2k.com/downloads.html - редактор карт, земли и прочего для DOS версии (это PC версия чтоли?), + все ini, seed земли и может быть чего ещё.
http://forum.dune2k.com/index.php?topic=21107.0 - просто дофига ссылок
3 типа червя: это можно глянуть в реде открыв карты, это просто тип ИИ: area guard = ест тока в области; ambush = жрет когда его раскроешь; hunt = жрет сразу.
|
|
| |
Nemesis_c | Дата: Среда, 03.08.2011, 05:08 | Сообщение # 2 |
Сообщений: 1148 Статус: Offline
| Segaman:
byte - флаг юнита($0 word - house (дом). word - unit (типа юнита). word - жизнь вроде в процентах (256=$100). word - координаты. Формат: диапозон координат x = 0-$3F y = 0-$3F формула получения значения position=x+y*$40
word - угол направления. диапозон 0-255 формула преобразования в градусы -(угол/32)*45 word - AI(Искуственный интелект, поведение юнита) значения флагов ИИ: 0=Attack 1=Move 2=Reterat 3=Guard 4=AreaGuard 5=Harvest 6=Return 7=Stop 8=Ambush 9=Sabotage 10=Die 11=Hunt 12=Deploy 13=Destruct у строений: word - флаг строения word - порядковый номер(ID) word - house (дом). word - типа строения word - жизнь вроде в процентах (256=$100). word - координаты. Формат: диапозон координат x = 0-$3F y = 0-$3F формула получения значения position=x+y*$40
Десант: word - флаг десанта word - дом word - привозимый юнит word - цель в ввиде значения(6=вражеская,7=наша) word - время(имеет цикличность при $2B)
|
|
| |