» TeamX (Архив Форума)«


Форум TeamX » Тех. поддержка » Скрипты (Все вопросы по скриптингу - сюда)

Переход по темам
<< Пред. След. >>
Страницы этой темы [ 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 ] Все собщения

 
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
 

Переход по темам
<< Пред. След. >>
Страницы этой темы [ 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 ] Все собщения


Powered by Ikonboard 2.1.9 RUS
Modified by RU.Board Team
© 2000 Ikonboard.com