|
Wasteland Ghost
Маленькое Злое Привидение
Откуда: Россия, Самара Регистрация: Дек. 2002
Всего: 2251 сообщение
|
Пардон, но это конкретное извращение . Посмотри в заголовках БИС как реализована побитовая запись/чтение. Вот тебе пример: // --- дефайны где-нить в h --- #define MAXINT 4294967295 //Max int #define INV(x) (MAXINT - x) //An inverse function // get bit state #define bit_state(x, the_bit) ((x bwand the_bit) != 0) // switch bit on #define set_bit_on(x, the_bit) x := x bwor the_bit // switch bit off #define set_bit_off(x, the_bit) x := x bwand INV(the_bit) #define FLAG_BIG_GUN 4 // --- конец дефайнов --- // --- где-нить в программе --- f_ext := proto_data(obj_pid(obj_ptr), it_flags_ext); f_big_gun := get_bit(f_ext, FLAG_BIG_GUN);
|
Отправлено: 13:05 - 2 Марта, 2006
|
|
Anchorite
Пользователь
Откуда: Не здесь Регистрация: Янв. 2003
Всего: 283 сообщения
|
Keha: ...поля представлены в виде чисел шестнадцатеричного формата... Число в шестнадцатеричном предствалении всегда можно перевести в десятичное и наоборот. Primary Attack Type (тип основной атаки): 0x00000000 = 0 - stand 0x00000001 = 1 - throw punch 0x00000002 = 2 - kick leg 0x00000003 = 3 - swing anim 0x00000004 = 4 - thrust anim 0x00000005 = 5 - throw anim 0x00000006 = 6 - fire single 0x00000007 = 7 - fire burst 0x00000008 = 8 - fire continuous Secondary Attack Type (тип дополнительной атаки): 0x00000000 = 0 - stand 0x00000010 = 16 - throw punch 0x00000020 = 32 - kick leg 0x00000030 = 48 - swing anim 0x00000040 = 64 - thrust anim 0x00000050 = 80 - throw anim 0x00000060 = 96 - fire single 0x00000070 = 112 - fire burst 0x00000080 = 128 - fire continuous Потом с помощью bwand вырезать нужные группы битов и сравнить с указанными константами. Код будет работать в разы быстрее, т.к. операция деления самая медленная в выч. технике. flagExt:= proto_data(pid, 7) primaryAtackType := flagExt bwand 15; /* 15 = 0x0000000F */ secondaryAtackType := flagExt bwand 240; /* 240 = 0x000000F0 */
|
Отправлено: 13:17 - 2 Марта, 2006 | ИСПРАВЛЕНО: Anchorite - 16:49 - 2 Марта, 2006
|
|
Keha
Пользователь Регистрация: Янв. 2006
Всего: 31 сообщение
|
Цитата: Quote: from Wasteland Ghost Пардон, но это конкретное извращение .
Большое спасибо. Я просто тут у народа спрашивал как выдергивать нужный флаг при помощи proto_data. О существовании get_bit был не в курсе. Мне не кто не ответил, вот и решил изврашатся как получается .
Цитата: Quote: from Anchorite primaryAtackType := flagExt bwand 31; /* 31 = 0x0000000F */ secondaryAtackType := flagExt bwand 240; /* 240 = 0x000000F0 */
Сбасибо большое.
|
Отправлено: 13:37 - 2 Марта, 2006 | ИСПРАВЛЕНО: Keha - 13:45 - 2 Марта, 2006
|
|
Wasteland Ghost
Маленькое Злое Привидение
Откуда: Россия, Самара Регистрация: Дек. 2002
Всего: 2251 сообщение
|
2Keha Вообще говоря, советую бысто пробежаться глазами по БИСовым заголовкам. Там есть полезные готовые решения. get_bit, кстати, там нет. Есть gvar_bit, mvar_bit, lvar_bit и т.д.. А это уже моя переделка. Тем не менее, идея всё та же.
|
Отправлено: 13:49 - 2 Марта, 2006
|
|
Keha
Пользователь Регистрация: Янв. 2006
Всего: 31 сообщение
|
Протестил bwand заменив свой изврат at1:=dec-(dec/16)*16; at2:=dec/16-((dec/16)/16)*16; на at1:= dec bwand 31; /* 31 = 0x0000000F */ at2:= dec bwand 240; /* 240 = 0x000000F0 */ Но почему-то bwand не всегда работает, в отличие от моего изврата. У меня на карте где тестил скрипт лежало гаус ружье, метательный нож и копье. Так для ружья гаусса и bwand, и мое/16, дают правильные значения. А вот для случая копья и метательного ножа мое /16 работает, а bwand похоже вырезает, что то не то, по значению превышающее 8ку. Так как не то что неверных значений не выводится, а вообще никаких. ********************************* a2: вывести и для ножа и копья всетаки смог, ошибка была у меня. Забыл подправить ifы (a2 в случае bwand принимает значения не от 0 до 8 а уже от 0 до 128 А вот a1 по прежнему не выводится в них покакой то пречине для ножа и копья bwand заносит значения 20 и 21. А значение a1 не должно превышать 8. dec:=proto_data(obj_pid(wip),7); at1:= dec bwand 31; /* 31 = 0x0000000F */ at2:= dec bwand 240; /* 240 = 0x000000F0 */ //at1:= get_bit(dec, 0); //at2:= get_bit(dec, 1); //at1:=dec-(dec/16)*16; //at2:=dec/16-((dec/16)/16)*16; display_msg("at1 = "+at1); display_msg("at2 = "+at2);
|
Отправлено: 14:59 - 2 Марта, 2006 | ИСПРАВЛЕНО: Keha - 15:37 - 2 Марта, 2006
|
|
Wasteland Ghost
Маленькое Злое Привидение
Откуда: Россия, Самара Регистрация: Дек. 2002
Всего: 2251 сообщение
|
Проверяй свою программу внимательнее . bwand не может "не работать" по определению .
|
Отправлено: 15:45 - 2 Марта, 2006
|
|
Anchorite
Пользователь
Откуда: Не здесь Регистрация: Янв. 2003
Всего: 283 сообщения
|
Да лажанулся я. Вместо 31 должно быть 15. Лишний битик вырезал Посыпаю голову пеплом
|
Отправлено: 16:51 - 2 Марта, 2006 | ИСПРАВЛЕНО: Anchorite - 16:57 - 2 Марта, 2006
|
|
Keha
Пользователь Регистрация: Янв. 2006
Всего: 31 сообщение
|
Почему у меня LVAR не сейвятся в сейвах ? Все роботает хорошо, те лвара сохраняется при переходе с локации на локацию итп, но вот если записатся, и потом считаться то ее значение при загрузке игры теряется(обнуляется) . В scripts.lst число своих Лваров добавил - запись # local_vars=5 заменил на # local_vars=9. Запись чтение в лвару осуществляется только в приведенной процедуре: (obj_dude.int) //уже были: #define LVAR_Last_Digest_Time (0) #define DRTROY_INJECTION (1) #define CHECK_DUDE_V15ENT_LEVEL (2) #define CHECK_RNDBESS_FLOAT (3) #define TIMER_INIT_V13_SEQUENCE (4) // мои Лвары: #define LVAR_count_GUN (5) #define LVAR_count_UNARM (6) #define LVAR_count_MELE (7) #define LVAR_count_THROW (8) procedure Check_add_to_skill begin variable rand; variable skilev; variable N_ LVAR; variable skill_count; skilev:=has_skill(self_obj,skil1); if skil1 == 0 then begin// если (0) - легкие стволы то N_ LVAR:=5; //то номер Лвара 5 end else if skil1 >= 3 then begin N_ LVAR:=skil1+3; //номер лвара для остальных умений end rand:=random(0,180); display_msg("random = "+rand); // проверка для отладки if (rand >= skilev) then begin skill_count:=local_var(N_ LVAR); // ЧТЕНИЕ ИЗ ЛВАРЫ skill_count:=skill_count+1; if (skill_count >=(skilev+1)) then begin critter_mod_skill(self_obj,skil1,1); skill_count:=0; display_msg("+1 k skilu"+skil1); end set_local_var(N_ LVAR,skill_count); // ЗАПИСЬ В ЛВАРУ display_msg("kopilka skilla "+skil1+" ravna "+skill_count);// для отладки end end
|
Отправлено: 20:03 - 4 Марта, 2006 | ИСПРАВЛЕНО: Keha - 20:23 - 4 Марта, 2006
|
|
Alchemist
Модератор
Откуда: Арзамас-17 Регистрация: Дек. 2004
Всего: 298 сообщений
|
В сэйве сохраняются только GVARы. Как ты думаешь, почему все квэсты завязаны именно них? И, кстати, заметная часть багов, оставшихся ещё от разработчиков как раз в том и заключается, что про этот факт банально забыли.
----- /// What'ya be sain'? Vault 100+? We need nothing o'that!
|
Отправлено: 13:01 - 7 Марта, 2006
|
|
Wasteland Ghost
Маленькое Злое Привидение
Откуда: Россия, Самара Регистрация: Дек. 2002
Всего: 2251 сообщение
|
Алхимик, не сей панику . ЛВАР и МВАР сохраняются в мапах, т.е. в сейвах. Другое дело, что надо данный конкретный скрипт смотреть, ибо запись в ЛВАРы тут какая-то замудрённая . ЗЫ Надеюсь, никто не путает LVAR (скриптовые переменные) и variable (локальные переменные)?
|
Отправлено: 14:48 - 7 Марта, 2006
|
|
|
|