Страницы: (83) Все « Первая ... 36 37 [38] 39 40 ... Последняя »  ( К первому непрочитанному )
ОТВЕТИТЬ
НАЧАТЬ ТЕМУ
НАЧАТЬ ОПРОС
 (sfall) дополнения
Fakeman
Отправлено: 22 сентября 2016 | 15:26
Крафти, еще такой технический вопрос, можно ли как-то добраться до свойств флага объекта(криттера) расположенного на карте и изменить его значение???

Вариант изменить флаг в про, а потом создать обьект не подходит.
Crafty
Отправлено: 23 сентября 2016 | 22:12
QUOTE (Foxx)
Может конечно это и глупое предложение))
Выглядит хлопотно... :-p

QUOTE (Fakeman)
можно ли как-то добраться до свойств флага объекта(криттера) расположенного на карте и изменить его значение???

Вариант изменить флаг в про, а потом создать обьект не подходит.
Это которые в define_extra.h описаны как CFLG_*? Так через изменение pro'шника (как в твоём примере с CFLG_BARTER) — в памяти они не хранятся и движок использует pro'шник.
Или так:
CODE
call_offset_r2(0x42E6AC, who, flags); // critter_flag_check_
call_offset_v2(0x42E6F0, who, flags); // critter_flag_set_
call_offset_v2(0x42E71C, who, flags); // critter_flag_unset_
call_offset_v2(0x42E74C, who, flags); // critter_flag_toggle_
Fakeman
Отправлено: 24 сентября 2016 | 00:36
QUOTE
Это которые в define_extra.h описаны как CFLG_*

Нет, это не эти. Вот эти PROTO_IT_FLAG (0x14) (в define_extra оно не определено взял по смешению из итемов.)
оно точно в памяти хранится или в карте для каждого объекта на карте,
в общем нужен бит прозрачности. :)

Это сообщение отредактировано Fakeman - 24 сентября 2016 | 00:43
Crafty
Отправлено: 24 сентября 2016 | 19:34
QUOTE (Fakeman)
оно точно в памяти хранится или в карте для каждого объекта на карте
Инициализируется начальными битами всё так же из pro'шника именно по смещению 0x14 (одинаково у всех объектов).

QUOTE (Fakeman)
в общем нужен бит прозрачности. :)
hs_keypress на F11:
CODE
procedure start;

procedure start begin
if not init_hook then begin
 variable event := get_sfall_arg, keyDX := get_sfall_arg, keyVK := get_sfall_arg;
 variable flags;
 if (keyDX == 87) and (event == 0) then begin
  flags := read_int(dude_obj+0x24);
  if (flags bwand 0x20000) != 0 then begin
   flags := flags bwand bwnot(0x20000);
  end
  else begin
   flags := flags bwor 0x20000;
  end
  write_int(dude_obj+0x24, flags);
  refresh_pc_art;
 end
end
end
Только не забывай что бит прозрачности используется "Невидимкой" и при установленном значении видимость врагов уменьшается в 2 раза.
А ещё попробуй бит энергии (0x80000) вместо бита стекла (0x20000) :)

QUOTE (Fakeman)
QUOTE (Crafty)
QUOTE (Fakeman)
прикрути к sfall_ver_build чтобы возвращала еще опознавательные знаки, что используется не ориг. версия, что-то в стиле #_CRAFTY
Нельзя, int же возвращает.
какая разница преобразуй в стринг, в скриптах нет понятия типа данных)
Да ладно. Действительно, полная анархия.
sfall_ver_build теперь возвращает 509 "sfall2" (без кавычек).

Это сообщение отредактировано Crafty - 13 апреля 2017 | 12:26
Fakeman
Отправлено: 24 сентября 2016 | 21:06
QUOTE
Только не забывай что бит прозрачности используется "Невидимкой".

да блин, мне не у DUDE флаг нужен.

QUOTE
Инициализируется начальными битами всё так же из pro'шника именно по смещению 0x14

Это Не верно!
Если поставить на карту объект, то потом хоть как ты меняй флаг в pro, он на карте так и останется с таким каким его туда поставили, так же с текущими жизнями у криттера и их FrmID.

QUOTE

Да ладно.
sfall_ver_build теперь возвращает 509.

Ну нету же там понятия String или Integer.
Там же переменные на подобие как в старом VisualBasic
CODE
Variant - данный тип добавлен в Visual Basic 5 из версии 2.0. Переменная типа variant может содержать данные любого типа.


чего значит это 509? -это твое счастливое число, почему не 404)

Отправлено: 24 сен 16 21:14
так стоп
QUOTE
write_int(dude_obj+0x24, flags);

То есть вместо dude можно подставить другой указатель на объект?
что-то я не понял.

Это сообщение отредактировано Fakeman - 24 сентября 2016 | 21:19
Crafty
Отправлено: 24 сентября 2016 | 22:17
QUOTE (Fakeman)
да блин, мне не у DUDE флаг нужен.
Вот и используй нужный тебе ObjectPtr вместо dude_obj.

QUOTE (Fakeman)
Это Не верно!
Если поставить на карту объект, то
Инициализируется начальными битами всё так же из pro'шника именно по смещению 0x14.
QUOTE (Fakeman)
потом хоть как ты меняй флаг в pro, он на карте так и останется с таким каким его туда поставили
Потом — да.

QUOTE (Fakeman)
Ну нету же там понятия String или Integer.
Да ладно :-p
CODE
В описаниях функций компилятора приняты следующие обозначения:
.....
Тип_возвращаемого_значения:
void - неопределённый тип (функция не возвращает никакого значения)
int - целочисленный тип
unsigned int - целочисленный беззнаковый тип
ObjectPtr - указатель на объект
string или char* - символьная строка
boolean - логическая переменная (TRUE или FALSE)

lex.h:
CODE
typedef struct {
  int token; /* token we just parsed */
  int type;  /* will be either T_INT, T_FLOAT, T_STRING, or T_SYMBOL */
  union {
     char *stringData;
     int   intData;
     float floatData;
  };
} LexData;


QUOTE (Fakeman)
чего значит это 509? -это твое счастливое число, почему не 404)
Типа того, и 404 тоже весёленькое.

QUOTE (Fakeman)
То есть вместо dude можно подставить другой указатель на объект?
Верно.
Fakeman
Отправлено: 25 сентября 2016 | 19:30
QUOTE (Ты)

QUOTE (Я)
Ну нету же там понятия String или Integer.

Да ладно :-p

Так это тип который возвращается функцией, мы же когда определяем переменную в скрипте не пишем какого типа данные она будет содержать.
ну во общем, я так понял там с твоей стороны тех.проблемы преобразования из инт в стринг.
509 — т.е. это константа?

Отправлено: 25 сен 16 19:45
QUOTE
boolean — логическая переменная (TRUE или FALSE)

var:=true;
var:=1;
if var...
там в движке между boolean и int есть какая либо разница в использовании?

Это сообщение отредактировано Fakeman - 25 сентября 2016 | 19:58
Crafty
Отправлено: 25 сентября 2016 | 21:02
QUOTE (Fakeman)
Так это тип который возвращается функцией, мы же когда определяем переменную в скрипте не пишем какого типа данные она будет содержать.
Но компилятор генерирует код исходя из типа обрабатываемых данных. И движок потом обрабатывает переменную исходя из её текущего типа.

QUOTE (Fakeman)
ну во общем, я так понял там с твоей стороны тех.проблемы преобразования из инт в стринг.
Глупости-то какие :-p

QUOTE (Fakeman)
var:=true;
var:=1;
if var...
там в движке между boolean и int есть какая либо разница в использовании?
lex.c:
CODE
lexAddConstant(C_TRUE, "true", T_INT, 1);
lexAddConstant(C_FALSE, "false", T_INT, 0);
Foxx
Отправлено: 26 сентября 2016 | 00:07
QUOTE (Fakeman)
Кстати прицельный в тело вроде как дает какой-то бонус? не в курсе где про это написано)
QUOTE (Crafty)
У него нет штрафа, а это бонус

По моему, при прицельном выстреле в любую часть тела (даже торс) — дается 5% шанс нанести критическое повреждение. Или я не прав?
Хотел ещё спросить: кроме torso в ddraw.ini есть ещё BodyHit_Uncalled — это что за часть тела?)
Crafty
Отправлено: 26 сентября 2016 | 14:09
QUOTE (Foxx)
По моему, при прицельном выстреле в любую часть тела (даже торс) — дается 5% шанс нанести критическое повреждение. Или я не прав?
Хотел ещё спросить: кроме torso в ddraw.ini есть ещё BodyHit_Uncalled — это что за часть тела?)
О выборе части тела для НПС писал выше, для ГГ же, если его атака прицельная, то возвращается та часть тела, в противном случае Body_Uncalled. Далее (некоторые детали я пропущу):
CODE
1. Определить "шанс_попадания" в часть тела (учитываются штрафы).
2. Замена Body_Uncalled на Body_Torso.
3. min = "шанс_попадания", max = get_critter_stat(source, STAT_crit_chance) - штраф.
4. Определить "тип попадания" (roll_check(min, max)), результат равен 0-3 (ROLL_CRITICAL_FAILURE-ROLL_CRITICAL_SUCCESS).
5. Потом "тип попадания" может поменяться, к примеру с ROLL_SUCCESS на ROLL_CRITICAL_SUCCESS если это ГГ использующий UNARMED/MELEE и у него взят перк Slayer/Смертельный удар. Ну и т.д.

Пример: у ГГ 8% шанс на крит, 33% шанс попадания в глаза (штраф -60):
min = 33, max = 8 — (-60) = 68.
"тип попадания" = roll_check(33, 68) = 3 = ROLL_CRITICAL_SUCCESS.
QUOTE
Хулио получает критическое ранение (глаза), теряет здоровье (- 54), и этот резкий удар ослепляет его.
Хулио  умирает.

Вот из-за второго пункта по-хорошему BodyHit_Uncalled нужно удалить из ini, потому что если его значение не совпадает с BodyHit_Torso, то это не торт.

PS. На всякий, вот так определяется "тип попадания" (roll_check(min, max)):
CODE
min := min - random(1,100);
if min < 0 then begin
 result := ROLL_FAILURE;
 if ((game_time/ONE_GAME_DAY) >= 1) and (random(1,100) <= (-min/10)) then begin
  result := ROLL_CRITICAL_FAILURE;
 end
end
else begin
 result := ROLL_SUCCESS;
 if ((game_time/ONE_GAME_DAY) >= 1) and (random(1,100) <= (min/10 + max)) then begin
  result := ROLL_CRITICAL_SUCCESS;
 end
end
return result;
С помощью переменной RemoveCriticalTimelimits можно отключить проверку первого дня.

Это сообщение отредактировано Crafty - 26 сентября 2016 | 14:58
Fakeman
Отправлено: 26 сентября 2016 | 18:42
QUOTE
refresh_pc_art

А есть что-то подобное, только для криттера/карты?
Crafty
Отправлено: 26 сентября 2016 | 19:19
QUOTE (Fakeman)
А есть что-то подобное, только для криттера/карты?
Для криттера:
CODE
metarule3(107, who, obj_art_fid(who), 0); // art_change_fid_num(who, obj_art_fid(who));
Для карты попробуй:
CODE
call_offset_v0(0x4B12D8); // tile_refresh_display_
Fakeman
Отправлено: 26 сентября 2016 | 20:37
QUOTE
art_change_fid_num(who, obj_art_fid(who));

о а я не и додумался флаг ставить пред сменой фида, спасибо за подсказку.

QUOTE
Базовый PROTO — файл партийца, у которого повышаются уровни, ДОЛЖЕН быть упакован в master.dat. Иначе уровень будет все время сбрасываться до базового прошника.

Может еще вот это глянешь, или там все сложно).

Это сообщение отредактировано Fakeman - 26 сентября 2016 | 20:40
Crafty
Отправлено: 27 сентября 2016 | 01:51
QUOTE (Fakeman)
QUOTE
Базовый PROTO — файл партийца, у которого повышаются уровни, ДОЛЖЕН быть упакован в master.dat. Иначе уровень будет все время сбрасываться до базового прошника.
Может еще вот это глянешь, или там все сложно).
Не улавливаю суть, давай попроще на примере Вика (у меня с ним сейв есть, убиваю пару гекко и он апается) ;)
Fakeman
Отправлено: 27 сентября 2016 | 02:15
QUOTE
на примере Вика (у меня с ним сейв есть, убиваю пару гекко и он апается)

а где находится его базовый прошник?
может это уже исправили, или вообще это миф)
нафига тогда RP упаковывает прошки в дат?

Это сообщение отредактировано Fakeman - 27 сентября 2016 | 02:17
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
Страницы: (83) Все « Первая ... 36 37 [38] 39 40 ... Последняя »  ( К первому непрочитанному )
ОТВЕТИТЬ
НАЧАТЬ ТЕМУ
НАЧАТЬ ОПРОС