1. Друзья, в это тяжёлое и непонятное для всех нас время мы просим вас воздержаться от любых упоминаний политики на форуме, - этим ситуации не поможешь, а только возникнут ненужные ссоры и обиды. Это касается также шуток и юмора на тему конфликта. Пусть войны будут только виртуальными, а политики решают разногласия дипломатическим путём. С уважением, администрация Old-Games.RU.

    Скрыть объявление
  2. Пожалуйста, внимательно прочитайте правила раздела.
  3. Если Вы видите это сообщение, значит, вы ещё не зарегистрировались на нашем форуме.

    Зарегистрируйтесь, если вы хотите принять участие в обсуждениях. Перед регистрацией примите к сведению:
    1. Не регистрируйтесь с никами типа asdfdadhgd, 354621 и тому подобными, не несущими смысловой нагрузки (ник должен быть читаемым!): такие пользователи будут сразу заблокированы!
    2. Не регистрируйте больше одной учётной записи. Если у вас возникли проблемы при регистрации, то вы можете воспользоваться формой обратной связи внизу страницы.
    3. Регистрируйтесь с реально существующими E-mail адресами, иначе вы не сможете завершить регистрацию.
    4. Обязательно ознакомьтесь с правилами поведения на нашем форуме, чтобы избежать дальнейших конфликтов и непонимания.
    С уважением, администрация форума Old-Games.RU
    Скрыть объявление

Кодерский уголок

Тема в разделе "Мастерская", создана пользователем Dimouse, 10 сен 2006.

  1. Dimouse King of Mice

    Dimouse

    Администратор Переводчик

    Регистрация:
    18 апр 2003
    Сообщения:
    35.044
    В соответствии с назначением раздела, в этой теме предполагается обсуждать конкретные вопросы, которые у вас возникают при создании своих программ (в частности - игр), помогать другим, размещать полезные ссылки на статьи и материалы, которые могут пригодиться другим.

    Что здесь не допускается:
    - беспорядочный флуд на всевозможные темы, в том числе общие обсуждения языков программирования без конкретики (карается по статье "флуд и оффтопик" *),
    - разжигания на темы "что лучше, Си или Си++ и чем они отличаются?", "какой язык программирования лучше X или Y?" и т.п. (карается по статье "флейм и участие в холиварах" *),
    - мерение пиписьками в стиле "я лучше программирую" или "ты не умеешь программировать" (карается по статье "оскорбление участников и их взглядов" *).

    Всё это допускается в специально созданной теме "Беседка для программистов или «Бутерброд с кодом».

    * по усмотрению модератора также возможно применение блокировки в данной теме.

    Оригинальное сообщение
     
    Последнее редактирование модератором: 24 ноя 2014
    CY8R4Y нравится это.
  2.  
  3. Geryon

    Geryon

    Регистрация:
    13 май 2008
    Сообщения:
    1.228
    Конкретный путь к файлу указан как раз без упоминания Watcom. Этот исходник (digmid.asm) забыли растяпы-разработчики в дистрибутиве игры Rapid Assault. Однако больше они ничего не забыли, поэтому ни mdv.inc, ни cw-undoc.inc нет.
     
  4. Bato-San Чеширский волк-киборг

    Bato-San

    Регистрация:
    24 июн 2010
    Сообщения:
    14.136
    Geryon, тут дело в том, что могли распространять комплект для разработчиков, который вообще был другим, чем то что выкладывалось открыто. Некую Pro версию. В принципе, можно попытаться откомпилировать сырцы и посмотреть чего там будет не хватать ему. Потом попробовать собрать всё это в кучу.
     
  5. Geryon

    Geryon

    Регистрация:
    13 май 2008
    Сообщения:
    1.228
    Может быть, дело в версии Causeway - в Rapid Assault использованы версии 2.51 и 2.63, а в сети сейчас можно найти только существенно более поздние 3.49 и 3.6. А OpenWatcom тогда (в 1995 году) еще не существовало. С другой стороны, откуда тогда в OW 1.8 упоминание этого cw-undoc.inc :hmmm:
     
    Последнее редактирование: 16 май 2014
  6. Bato-San Чеширский волк-киборг

    Bato-San

    Регистрация:
    24 июн 2010
    Сообщения:
    14.136
    Val07og нравится это.
  7. Geryon

    Geryon

    Регистрация:
    13 май 2008
    Сообщения:
    1.228
    Там не просто паковщик есть, там API экстендера поддерживает загрузку упакованных файлов (как исполняемых, так и просто данных) с одновременной распаковкой, и это делается одним вызовом int 31h. Rapid Assault эти возможности не задействует, но в других играх этих разработчиков - драйверы упакованы, кое-где также упакованы и данные. В Druid: Daemons of the Mind, например, упакованы и драйверы, и данные; в Perfect Assassin - только драйверы.
     
    Последнее редактирование: 16 май 2014
    Val07og и Bato-San нравится это.
  8. Steel Rat Stainless

    Steel Rat

    Регистрация:
    28 дек 2006
    Сообщения:
    3.260
    В ассемблере реального режима между командой типа jnz и меткой могло быть не больше 128 байт. Это ограничение сохранилось в современных ассемблерах?
     
  9. MisterGrim Very old

    MisterGrim

    Legacy

    Регистрация:
    29 ноя 2007
    Сообщения:
    25.423
    Нет, в 32-разрядном режиме таких ограничений нет.
     
    Val07og и Steel Rat нравится это.
  10. Steel Rat Stainless

    Steel Rat

    Регистрация:
    28 дек 2006
    Сообщения:
    3.260
    Использовал я тут для UTT std::list, как контейнер и закрались в мою голову сомнения в том, что сделал я это зря. Соорудил быстренько небольшой тест:
    Код:
    int _tmain(int argc, _TCHAR* argv[])
    {
    #if defined(_DEBUG)
    	int tmpFlag = _CrtSetDbgFlag( _CRTDBG_REPORT_FLAG );
    	tmpFlag |= _CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF;  // Check heap alloc and dump mem leaks at exit
    	_CrtSetDbgFlag( tmpFlag );
    	assert( !errno );
    	//_crtBreakAlloc = 101;
    #endif
    
    	std::srand((unsigned)time(0));
    	const size_t num = 60000;
    	std::queue<int*> intQueue;
    	std::list<int*> intList;
    	std::vector<int*> intVector;
    
    	{
    		WatchDog dog("Queue init");
    		for (size_t i = 0; i < num; ++i)
    		{
    			intQueue.push(new int);
    		}
    	}
    
    	{
    		WatchDog dog("Queue random erase");
    
    		for (size_t i = 0; i < num >> 1; ++i)
    		{
    			delete intQueue.front();
    			intQueue.pop();
    		}
    	}
    
    	{
    		WatchDog dog("Queue clear");
    		
    		while (!intQueue.empty())
    		{
    			delete intQueue.front();
    			intQueue.pop();
    		}
    
    		std::swap(intQueue, std::queue<int*>());
    	}
    
    	{
    		WatchDog dog("List init");
    
    		for (size_t i = 0; i < num; ++i)
    		{
    			intList.push_back(new int);
    		}
    	}
    
    	{
    		WatchDog dog("List random erase");
    		auto it = intList.begin();
    
    		for (size_t i = 0; i < num >> 1; ++i)
    		{
    			delete (*it);
    			intList.erase(it++);
    		}
    	}
    
    	{
    		WatchDog dog("List clear");
    		
    		for (auto& el: intList)
    		{
    			delete el;
    		}
    
    		intList.clear();
    	}
    
    	{
    		WatchDog dog("Vector init");
    		intVector.reserve(num);
    
    		for (size_t i = 0; i < num; ++i)
    		{
    			intVector.push_back(new int);
    		}
    	}
    
    	{
    		WatchDog dog("Vector random erase");
    		auto it = intVector.begin();
    
    		for (size_t i = 0; i < num >> 1; ++i)
    		{
    			delete *it;
    			it = intVector.erase(it);
    		}
    	}
    
    	{
    		WatchDog dog("Vector clear");
    		
    		for (auto& el: intVector)
    		{
    			delete el;
    		}
    
    		intList.clear();
    	}
    
    
    	getchar();
    	return 0;
    }
    Результаты интересные. Если закомментировать строчку std::swap(intQueue, std::queue<int*>()); - т.е. очередь будет полностью очищена при выходе из программы, то std::vector выигрывает по всем параметрам в разы.

    Код:
    Watchdog time for Queue init: 0.092239 seconds
    Watchdog time for Queue random erase: 0.008661 seconds
    Watchdog time for Queue clear: 0.008669 seconds
    
    Watchdog time for List init: 0.097729 seconds
    Watchdog time for List random erase: 1.517231 seconds
    Watchdog time for List clear: 3.032855 seconds
    
    Watchdog time for Vector init: 0.018193 seconds
    Watchdog time for Vector random erase: 0.770135 seconds
    Watchdog time for Vector clear: 0.008393 seconds
    
    Но если эту строку оставить, т.е. обнулять std::queue полностью, то результаты совсем другие:
    Код:
    Watchdog time for Queue init: 0.092171 seconds
    Watchdog time for Queue random erase: 0.008561 seconds
    Watchdog time for Queue clear: 1.287474 seconds
    
    Watchdog time for List init: 0.746239 seconds
    Watchdog time for List random erase: 5.126711 seconds
    Watchdog time for List clear: 3.031819 seconds
    
    Watchdog time for Vector init: 2.208171 seconds
    Watchdog time for Vector random erase: 2.845023 seconds
    Watchdog time for Vector clear: 2.905072 seconds
    
    Я сначала подумал, что дело в оптимизации в релиз билде, но нифига - в дебаге то же самое. Вот мне интересно теперь, что это всё значит? Может я где-то туплю просто? Я щас ещё поковыряюсь, но забавно.

    600000 элементов в динамической памяти:

    Код:
    Watchdog time for Queue init: 1.322838 seconds
    Watchdog time for Queue random erase: 0.089336 seconds
    Watchdog time for Queue clear: 14.994594 seconds
    
    Watchdog time for Deque init: 3.618483 seconds
    Watchdog time for Deque random erase: 0.110823 seconds
    Watchdog time for Deque clear: 14.884985 seconds
    
    Watchdog time for List init: 4.152822 seconds
    Watchdog time for List random erase: 60.547615 seconds
    Watchdog time for List clear: 30.584221 seconds
    
    Watchdog time for Vector init: 5.460333 seconds
    Watchdog time for Vector random erase: 170.703751 seconds
    Watchdog time for Vector clear: 30.285711 seconds
    Ваще огонь, для партикловой мегасистемы, придётся мне делать пул контейнеров, по-любому. Можно, запихнуть удаление в отдельный поток, но на машинах с одним ядром результаты будут впечатляющие и пул всё равно нужен будет.

    Результаты так же сильно различаются, если использовать простой тип или класс, динамическую инициализацию, shared_ptr или стэк. По сумме требований и преимуществ победила std::queue и std::deque содержащие shared_ptr на объект класса.

    А ваще вот - http://baptiste-wicht.com/posts/2012/12/cpp-benchmark-vector-list-deque.html
     
    Последнее редактирование: 18 май 2014
  11. Рыжий Тигра Сам себе «пират»

    Рыжий Тигра

    Регистрация:
    3 май 2012
    Сообщения:
    1.823
    (уточняет) В 16-битном. Можно, не переходя в защищённый, снабдить команду префиксом и она станет 32-битной.
     
    Val07og и Steel Rat нравится это.
  12. jack7277

    jack7277

    Регистрация:
    23 май 2004
    Сообщения:
    1.115
    С вводом русских букв в игре мне пока непонятно, загрузил keyrus, в игре стоит ограничитель - отбрасывать коды из кодовой таблицы более 128 (80h).
    Используется INT 21h, AH=8, ввод букв с клавиатуры без отображения, затем собственный обработчик и вывод букв игровым шрифтом.
    Переключил раскладку на клавиатуре по CTRL-SHIFT.
    Нажал буквы - MHMH - получилось ввести "мама", в диалоговом меню вместо "Mom" прописал в скрипте "мама" и скрипт сработал, Хэнк говорит, что мама на кухне.

    Как теперь привести клавиатуру в соответствие с русскими буквами?
    И как сразу включить ввод русских букв без переключения?

    Похоже моя лень сработала против меня, шрифт приведен к 1251, а keyrus работает по 866 кодовой странице, вот всё и уплыло.
    Надо в отладчике коды ловить и смотреть, что с ними делается, а пока что спать)
     
    Последнее редактирование: 19 май 2014
    Рыжий Тигра нравится это.
  13. Рыжий Тигра Сам себе «пират»

    Рыжий Тигра

    Регистрация:
    3 май 2012
    Сообщения:
    1.823
    В общем случае - никак. :-( Но можно дать юзеру догадаться, что можно переключить и вводить по-русски.
    Таблица клавиш кейруса подгружается. Для v7.3 это
    Код:
    keyrus /KEYS=<file>
    Для выгрузить из него шрифты и таблицу клавиш:
    Код:
    keyrus /FILES
    Но изящнее будет ИМХО всё-таки заменить шрифты и тексты - даже не на 866 (ублюдочная кодировка, не люблю её), а на RUSCII.
     
    Val07og и jack7277 нравится это.
  14. Bato-San Чеширский волк-киборг

    Bato-San

    Регистрация:
    24 июн 2010
    Сообщения:
    14.136
    Видимо, ты имел ввиду под "ублюдочной" KOI8-U.
    Украинская CP1125 которую и называют RUSCII - это и есть 866, "национализированная" Украиной.

    Описание всех кодировок с точки зрения "украинизации" таковых.

    почитав документацию по кейрус или пропатчив его "навеки" заменой дефолтного выбора языка.
     
    Последнее редактирование: 19 май 2014
    Steel Rat нравится это.
  15. Steel Rat Stainless

    Steel Rat

    Регистрация:
    28 дек 2006
    Сообщения:
    3.260
    Bato-San, KOI8 - это ваще кабздец, гимно (хотел написать "гимн", но опечатался) оптимизации.
     
  16. Bato-San Чеширский волк-киборг

    Bato-San

    Регистрация:
    24 июн 2010
    Сообщения:
    14.136
    Steel Rat, KOI7... до сих пор тянет блевать от вида её и непременного, но законного, вопроса юзверей: "а маленькие буквы как вводить ?"
     
  17. jack7277

    jack7277

    Регистрация:
    23 май 2004
    Сообщения:
    1.115
    Всё получилось,
    keyrus.com /KEYS=win1251.kbd

    в документации 72 шрифтом напишем, что переключать РУС/АНГЛ по правой кнопке CTRL.
     
  18. Рыжий Тигра Сам себе «пират»

    Рыжий Тигра

    Регистрация:
    3 май 2012
    Сообщения:
    1.823
    "А ось тобі дві дулі!" (L). Сравни сам - слева 866, справа 1125:

    8b3972ef46b2b769f6c0d410f67046d4.gif 2b48b985d50d632cbeafa3ceab37fe5d.gif

    Подсказка: ищи украинскую букву из вышеприведенной народной мудрости. :-) И букву "га" тоже можешь заодно поискать.

    ---------- Сообщение добавлено в 09:57 ---------- Предыдущее сообщение размещено в 09:55 ----------

    Годидзе! (уточняет) Если в игре никак не задействована. И если случайно не выключенный русский регистр не нагадит в дальнейшую игру.
     
  19. jack7277

    jack7277

    Регистрация:
    23 май 2004
    Сообщения:
    1.115
    Другая трудность вылезла. В игре сделан регистронезависимый ввод через TOLOWER (или как её там, ну вы понели) все буквы приводятся к маленьким, для английских букв, что до 128 кода, всё робит на отлично, а с русскими ясен пень не работает.
    Если в скрипте написано, что ты должен ввести "Мама" с большой буквы, то только так и вводить, просто "мама" не срабатывает.

    Выход хз какой, или всё писать с большой или с маленькой буквы.
     
    Последнее редактирование: 19 май 2014
  20. Bato-San Чеширский волк-киборг

    Bato-San

    Регистрация:
    24 июн 2010
    Сообщения:
    14.136
    Рыжий Тигра, я ж написал, что "украинский" вариант 866... И даже ссылку дал на статью. А на кой чёрт при русификации нужны эти украинские буквы ? Чем оно лучше то и приоритетней ? Мы ж не на украинский игры переводим.


    jack7277, брррр... перечитал твой последний пост и понял что проблема не в кодировке, а в обработчике. Ну это надо в программе править.
     
    Последнее редактирование: 19 май 2014
  21. jack7277

    jack7277

    Регистрация:
    23 май 2004
    Сообщения:
    1.115
    Bato-San, я оставлю везде кодовые фразы с маленькой (большой) буквы и проблема решена)

    Сам код выглядит так, но зачем они рубят символы выше аскии хз:
    Код:
    cseg01:0005A2EB  cmp     ebx, 80h // в EBX - код нажатой клавиши, не скан код, а код по таблице что загружена в дос
    cseg01:0005A2F1  jg      exit
    
     
    Последнее редактирование: 22 май 2014
  22. Рыжий Тигра Сам себе «пират»

    Рыжий Тигра

    Регистрация:
    3 май 2012
    Сообщения:
    1.823
    Ты не мне, ты jack7277'у объясняй, что именно он имел в виду. :-)
    А так - то дело вкуса.
    А что мешает предусмотреть?
    (L) Селена и Нийя :-)
    Ну так затем и рубят, чтобы в tolower() вписывалось. :-(
    Кстати, если есть куда впилить дополнительный кусок кода для tolower'а (конкретно для старшей половины таблицы) - дарю (это кусок от моего перевода WC4, строго аналогичная проблема с tolower()/toupper()):
    Код:
    const uint8_t lower_table[ 0x40 ] = {
    	0x80, 0x81, 0x82, 0x83,  0x84, 0x86, 0x86, 0x87,  0x88, 0x89, 0x8A, 0x8B,  0x8C, 0x8D, 0x8E, 0x8F,
    	0x90, 0x91, 0x92, 0x93,  0x94, 0x95, 0x96, 0x97,  0x98, 0x99, 0x9A, 0x9B,  0x9C, 0x9D, 0x9E, 0x9F,
    	0xA0, 'ў',  0xA2, 0xA3,  0xA4, 'ґ',  0xA6, 0xA7,  'ё',  0xA9, 'є',  0xAB,  0xAC, 0xAD, 0xAE, 'ї',
    	0xB0, 0xB1, 'і',  0xB3,  0xB4, 0xB5, 0xB6, 0xB7,  0xB8, 0xB9, 0xBA, 0xBB,  0xBC, 0xBD, 0xBE, 0xBF
    };
    __declspec( naked ) void wc4_tolower( void ) { // 4A26D6  DD000000
    	__asm {
    		cmp eax, 0
    		jge noprocess
    		cmp eax, 'Б' - 1
    		jl single
    		cmp eax, 'Я'
    		jg noprocess
    		add eax, 'б' - 'Б'
    		jmp noprocess
    single:
    		mov al, lower_table[ eax + 80h ]
    noprocess:
    		pop ebx
    		add esp, 8
    		retn
    	}
    }
    Правда, это для 1251, - для 866 или RUSCII надо увеличить таблицу, зато можно уменьшить код.
     
  1. На этом сайте используются файлы cookie, чтобы персонализировать содержимое, хранить Ваши предпочтения и держать Вас авторизованным в системе, если Вы зарегистрировались.
    Продолжая пользоваться данным сайтом, Вы соглашаетесь на использование нами Ваших файлов cookie.
    Скрыть объявление