#1 12-01-2008 15:59

Seemann
Registered: 07-08-2006
Posts: 2,153

Contest: программа по поиску ID объекта

Есть желающие написать небольшую прожку для Sanny Builder?

Смысл ее состоит в сканировании IDE-файлов в директории data (и вложенных папках) для поиска ID объекта по его имени.

Программа должна быть выполнена в виде DLL-файла и экспортировать функцию с именем GetObjectID. Примерно, эта функция должна быть объявлена так

Delphi:

function GetObjectID(ObjectName: PChar; GameDir: PChar): Integer;

C++

int GetObjectID(char* ObjectName, char* GameDir);

Я в нужный момент загружаю в SB эту DLL, ищу указанную функцию, вызываю ее с параметрами имя_объекта (например, AD_FLATDOOR), путь к директории игры (например, D:\San Andreas). Ваша задача просканировать все IDE-файлы, найти указанное имя, какой ID ему присвоен и вернуть это число как результат функции. Если указанное имя не найдено, результат функции должен быть равен -1.

Offline

#2 13-01-2008 08:59

listener
From: Vice City
Registered: 09-11-2006
Posts: 616
Website

Re: Contest: программа по поиску ID объекта

Все .ide или только те, которые в gta.dat/default.dat перечислены?

В любом случае, если никто не откликнется, вечером выдерну кусочек из ide-readerа.

Offline

#3 13-01-2008 10:18

Seemann
Registered: 07-08-2006
Posts: 2,153

Re: Contest: программа по поиску ID объекта

Желательно любые, независимо от каких-либо еще файлов.

Offline

#4 13-01-2008 11:43

listener
From: Vice City
Registered: 09-11-2006
Posts: 616
Website

Re: Contest: программа по поиску ID объекта

На паблике. (GetObjectId.rar)
Не очень красиво (можно было обойтись без sprintf), но работает.

UPD: добавил в архив bat-ник для компиляции

Last edited by listener (13-01-2008 11:49)

Offline

#5 13-01-2008 11:53

Seemann
Registered: 07-08-2006
Posts: 2,153

Re: Contest: программа по поиску ID объекта

Поиск регистрозависимый. В IDE-файлах-то имена моделей могут быть записаны как угодно.

1000,model
1000,Model
1000,MoDeL
1000,modeL

Надо что-то делать с этой проверкой

if (*objname++ != *p++)

Last edited by Seemann (13-01-2008 11:54)

Offline

#6 13-01-2008 13:09

listener
From: Vice City
Registered: 09-11-2006
Posts: 616
Website

Re: Contest: программа по поиску ID объекта

Не вопрос. Обновил. (в двух местах вставлено toupper)

Offline

#7 13-01-2008 13:54

Seemann
Registered: 07-08-2006
Posts: 2,153

Re: Contest: программа по поиску ID объекта

Отвлеченный вопрос: если уж ты сравниваешь строки побайтово (посимвольно), то не будет ли быстрее вместо toupper использовать or 0x20 для каждого символа?

if ( *objname++ || 0x20 != *p++ || 0x20)

(не знаю, правда, правильно ли записал). В Дельфи такая проверка

(Ord('A') or $20) = (Ord('a') or $20)

срабатывает

Попутно появилась мысль об обратной функции GetObjectName, которая принимает в качестве параметра ID и возвращает имя модели (или пустую строку). Сможешь сделать?

Last edited by Seemann (13-01-2008 14:52)

Offline

#8 13-01-2008 15:08

listener
From: Vice City
Registered: 09-11-2006
Posts: 616
Website

Re: Contest: программа по поиску ID объекта

*p++ || 0x20  всегда будет 1  :-) (это логическое 'или', битовое - одна палка)
Можно и так, если не критичны символs после 'Z' до 0x5F. (на данном случае - пофигу. выигрыш тоже будет крохотный)

Обратную функцию слепить можно, чуть позже сделаю.

Offline

#9 14-01-2008 04:59

listener
From: Vice City
Registered: 09-11-2006
Posts: 616
Website

Re: Contest: программа по поиску ID объекта

Угу. сделал. (GetObjectID_Name.rar)

extern __declspec(dllimport) int GetObjectID (char * objname, char * path);
extern __declspec(dllexport) int GetObjectName (int id, char * path, char * objname);

В GetObjectName третим параметром передается буфер для имени (32 байта). Если имя найдено, функция возвращает ненулевое значение.

PS. Касательно размера .dll - можно дать компилятору ключ -MD и прочувствовать разницу.

Offline

#10 14-01-2008 13:06

Seemann
Registered: 07-08-2006
Posts: 2,153

Re: Contest: программа по поиску ID объекта

Приближаемся к финалке smile Только теперь поиск опять регистрозависимый. Лучше вернуть toupper.

Offline

#11 14-01-2008 16:13

listener
From: Vice City
Registered: 09-11-2006
Posts: 616
Website

Re: Contest: программа по поиску ID объекта

Сделал.
Во-первых, |0x20 - это tolower, во-вторых, он был не в том месте.

Offline

Board footer

Powered by FluxBB