000182. Колода карт в GTA San Andreas

#Колода карт в GTA San Andreas

В этом уроке мы рассмотрим возможности работы с игровыми картами.

Привет! Будем играть в карты? Маловероятно, так как написать хорошую карточною игру обычным скриптингом проблематично. Тем не менее, некоторые возможности для работы с колодой у нас есть. Их мы и рассмотрим.

У нас доступны только 2 опкода, которые относятся к теме. Рассмотрим первый:

059D: shuffle_card_decks 1

Этот опкод включает возможность перемешивания карт. За что отвечает параметр "1" мне точно не известно. Скорее всего - это количество карт, которые не будут повторятся, когда будет взята карта с колоды. Или этот параметр отвечает за тип колоды, которая может использоваться для той или иной игры.

Я смог узнать только допустимые значения. Разрешено использовать параметр от 0 до 6 включительно. Если установить значение выше, то игра у меня вылетала.

После включения генератора колоды можно уже получить карту, используя опкод:

059E: get_card_to 0@

В переменную 0@ будет записан текущий идентификатор карты. По-сути: это обычное число от 1 до 52 включительно. Идентификаторы располагаются в таком порядке:

Т 2 3 4 5 6 7 8 9 10 В Д К

По цвету масти сортировка следующая:

Трефы (♣) Бубны (♦) Пики (♠) Червы (♥)

Чтобы было легче ориентироваться в этой паутине идентификаторов, я сгруппировал всё в одной картинке через скрипт:

Собственно, на этом можно было и закончить. Но я решил написать пример использования, чтобы статья не была такой бесполезной. Давайте дадим игроку 6 карт и позволим ему выбрать одну из них. В зависимости от выбранной карты игроку будут начислены деньги:

{$CLEO}
wait 2000 
01B4: set_player $PLAYER_CHAR can_move 0
0390: load_txd_dictionary 'LD_CARD' 
038F: load_texture "CD1C" as 1
038F: load_texture "CD2C" as 2
038F: load_texture "CD3C" as 3
038F: load_texture "CD4C" as 4
038F: load_texture "CD5C" as 5
038F: load_texture "CD6C" as 6
038F: load_texture "CD7C" as 7
038F: load_texture "CD8C" as 8
038F: load_texture "CD9C" as 9
038F: load_texture "CD10C" as 10
038F: load_texture "CD11C" as 11
038F: load_texture "CD12C" as 12
038F: load_texture "CD13C" as 13
038F: load_texture "CD1D" as 14
038F: load_texture "CD2D" as 15
038F: load_texture "CD3D" as 16
038F: load_texture "CD4D" as 17
038F: load_texture "CD5D" as 18
038F: load_texture "CD6D" as 19
038F: load_texture "CD7D" as 20
038F: load_texture "CD8D" as 21
038F: load_texture "CD9D" as 22
038F: load_texture "CD10D" as 23
038F: load_texture "CD11D" as 24
038F: load_texture "CD12D" as 25
038F: load_texture "CD13D" as 26
038F: load_texture "CD1S" as 27
038F: load_texture "CD2S" as 28
038F: load_texture "CD3S" as 29
038F: load_texture "CD4S" as 30
038F: load_texture "CD5S" as 31
038F: load_texture "CD6S" as 32
038F: load_texture "CD7S" as 33
038F: load_texture "CD8S" as 34
038F: load_texture "CD9S" as 35
038F: load_texture "CD10S" as 36
038F: load_texture "CD11S" as 37
038F: load_texture "CD12S" as 38
038F: load_texture "CD13S" as 39
038F: load_texture "CD1H" as 40
038F: load_texture "CD2H" as 41
038F: load_texture "CD3H" as 42
038F: load_texture "CD4H" as 43
038F: load_texture "CD5H" as 44
038F: load_texture "CD6H" as 45
038F: load_texture "CD7H" as 46
038F: load_texture "CD8H" as 47
038F: load_texture "CD9H" as 48
038F: load_texture "CD10H" as 49
038F: load_texture "CD11H" as 50
038F: load_texture "CD12H" as 51
038F: load_texture "CD13H" as 52
0581: enable_radar 0 
0826: enable_hud 0 
02EB: restore_camera_with_jumpcut
03F0: enable_text_draw 1 
 
059D: shuffle_card_decks 6 // тасуем колоду 
059E: get_card_to 1@ // сохраняем ID карты
059E: get_card_to 2@ // сохраняем ID карты
059E: get_card_to 3@ // сохраняем ID карты
059E: get_card_to 4@ // сохраняем ID карты
059E: get_card_to 5@ // сохраняем ID карты
059E: get_card_to 6@ // сохраняем ID карты

7@ = 0 // текущая выбранная карта
32@ = 0 // таймер для контроля нажатия клавиш

while true
wait 0
 if
 00E1: player 0 pressed_key 15 // ~k~~VEHICLE_ENTER_EXIT~ 
 then
 jump @END_SCRIPT
 end
 
 00E2: get_player 0 key 0 state_to 8@ // ~k~~GO_LEFT~ / ~k~~GO_RIGHT~

 if and
 32@ > 128
 8@ == 128
 then 
 32@ = 0
 if
 5 > 7@
 then
 7@ += 1
 end
 end 
 
 if and
 32@ > 128
 8@ == -128
 then 
 32@ = 0
 if
 7@ > 0
 then
 7@ -= 1
 end
 end
 
 9@ = 169.0 
 for 0@ = 0 to 5 
 if
 003B: 7@ == 0@ // (int)
 then 
 038E: draw_box_position 9@ 224.0 size 48.0 80.0 RGBA 64 0 156 222
 else 
 038E: draw_box_position 9@ 224.0 size 40.0 72.0 RGBA 0 0 0 196
 end 
 038D: draw_texture 1@(0@,6i) position 9@ 224.0 size 32.0 64.0 RGBA 255 255 255 255 
 9@ += 54.0
 end
 
 if
 00E1: player 0 pressed_key 16 // ~k~~PED_SPRINT~ 
 then
 1@(7@,6i) *= 1000
 0109: player $PLAYER_CHAR money += 1@(7@,6i)
 jump @END_SCRIPT
 end
 
end

:END_SCRIPT
0581: enable_radar 1 
0826: enable_hud 1 
03F0: enable_text_draw 0 
0391: release_textures 
059D: shuffle_card_decks 0 
01B4: set_player $PLAYER_CHAR can_move 1
0A93: end_custom_thread

Вот такой небольшой скрипт у нас получился. Результат такой:

Спасибо за внимание!

× Примечание: я использовал идентификаторы согласно оригинальному MAIN.SCM. Возможно, они только декоративные и по-сути колода является только генератором простых чисел от 1 до 52 включительно.

Last updated