Перевод и редактирование: nato
В оригинальном исходнике Zombie Plague как и во множестве других модов можно встретить множество булевых переменных, которые запоминают то или иное событие в игре и каждая из них по 132 байта:
- Код: Выделить всё
// Player vars
new g_zombie[33] // is zombie
new g_nemesis[33] // is nemesis
new g_survivor[33] // is surivor
new g_firstzombie[33] // is the first zombie
new g_lastzombie[33] // is last zombie
new g_lasthuman[33] // is last human
new g_frozen[33] // is frozen (can't move)
new g_nodamage[33] // has spawn protection/zombie madness
new g_respawn_as_zombie[33] // should respawn as zombie
new g_nvision[33] // has night vision
new g_nvisionenabled[33] // has night vision turned on
new g_zombieclass[33] // zombie class
new g_zombieclassnext[33] // zombie class for next infection
new g_flashlight[33] // has custom flashlight turned on
Это нерациональное использование памяти. Вместо переменных будем использовать флаги + вдобавок от меня (чего нету в оригинальном уроке) будем использовать упакованные строки.
Примечание: если у Вас более 8 флагов, то используйте распакованные строки.
Итак, приступим.
Для использования флагов, нужно их сначала объявить:
- Код: Выделить всё
enum Flags:(<<= 1)
{
//Не забывайте устанавливать значение первой переменной флага на 1
LOGGED = 1,
SPAWNED
};
new Flags:playerFlags[MAX_PLAYERS char];
Не используйте более 32 флагов в одном энуменаторе!
Вот и всё, теперь к махинациям:
[1] Узнать значение флага:
- Код: Выделить всё
playerFlags{playerid} & LOGGED; //Вернёт значение флага LOGGED
[2] Установить всем флагам значение:
- Код: Выделить всё
playerFlags{playerid} = Flags:0; //Обнулит все флаги игроку
[3] Установить значение флага на 1:
- Код: Выделить всё
playerFlags{playerid} |= LOGGED; //Установит значение флага LOGGED на 1
[4] Установить значение флага на 0:
- Код: Выделить всё
playerFlags{playerid} &= ~LOGGED; //Установит значение флага LOGGED на 0
[5] Сменить значение флага на противоположное:
- Код: Выделить всё
playerFlags{playerid} ^= LOGGED; //Если LOGGED был равен 1, то станет 0 (и наоборот)
Как видим и без подсчета памяти экономия существенная.