You are not logged in.
Есть желающие написать небольшую прожку для 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
Желательно любые, независимо от каких-либо еще файлов.
Offline
Поиск регистрозависимый. В IDE-файлах-то имена моделей могут быть записаны как угодно.
1000,model 1000,Model 1000,MoDeL 1000,modeL
Надо что-то делать с этой проверкой
if (*objname++ != *p++)
Last edited by Seemann (13-01-2008 11:54)
Offline
Отвлеченный вопрос: если уж ты сравниваешь строки побайтово (посимвольно), то не будет ли быстрее вместо 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
*p++ || 0x20 всегда будет 1 :-) (это логическое 'или', битовое - одна палка)
Можно и так, если не критичны символs после 'Z' до 0x5F. (на данном случае - пофигу. выигрыш тоже будет крохотный)
Обратную функцию слепить можно, чуть позже сделаю.
Offline
Угу. сделал. (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
Приближаемся к финалке Только теперь поиск опять регистрозависимый. Лучше вернуть toupper.
Offline