В этом уроке мы рассмотрим возможности работы с игровыми картами.
Привет! Будем играть в карты? Маловероятно, так как написать хорошую карточною игру обычным скриптингом проблематично. Тем не менее, некоторые возможности для работы с колодой у нас есть. Их мы и рассмотрим.
У нас доступны только 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 включительно.