Sabbah писал(а):
Pingvin писал(а):
В ожидании датчиков для Армады (2 недели) чего-нибудь полезного для Аскета поделать?
Что то мы пульт забросили...
Хотели в прошивке для тага вынести в отдельную функцию обработку состояния "game over"?
Ну что же... попробуем.
Раз такое дело, то может поможете реализовать запуск тага по такому принципу, стартуем после настроек с 0 патронов и обойм, потом при нажатии центр кнопки или получении команды с пульта "новая игра" начинается игра с полным боезапасом, или как вариант после запуска попдаем в функцию "game over", а оттуда уже выходим по кнопке или с пульта. Это нужно чтобы народ не вырубал оружие и не начинал игру заново. Пробовал сам сделать но так и не получилось.
А чего не помочь?
Поможем.
Кидайте исходники вашего варианта прошивки.
А для экспериментальной прошивки для 3.1 функция game_over() выглядит так
Код:
void game_over(){
life = 0;
life_in_percent=0;
WOUND_LED_ON;
display_life(life);//отобразим уровень жизни на диодах
display_life_update();//отобразим уровень жизни на ЖКИ
volatile uint8_t keypress_cntr; //счетчик циклов, в течении которых курок был нажат
keypress_cntr = 0;
while (eeprom_is_open);//дождемся, пока eerom закроется
playgameoversound();
if ((eeprom_read_byte(&eeprom_tm_serial_num.device_code)!=0)&&(eeprom_read_byte(&eeprom_tm_serial_num.device_code)!=0xFF))
/*если ТМ ключ уже занесён в память*/
{
joystick_event=no_pressing;
keyboard_event=no_key_pressing;
tm_event=no_tm_event;
uint8_t tm_valide;
tm_valide=0;
lcd_bl_off();
while (!tm_valide)
{//[while]
lcd_clrscr();
lcd_home();
lcd_puts("Для активации");
lcd_gotoxy(0, 1);
lcd_puts("приложите ключ");
while (tm_event == no_tm_event)
{
WOUND_LED_INVERT;
USART_PutChar('1');
timer2 = 0;
while (timer2 < 1000);
WOUND_LED_INVERT;
timer2 = 0;
while (timer2 < 1000);
};
switch(tm_event)
{//[switch]
case no_tm_event:
{
}
break;
case tm_crc_error:
{
lcd_clrscr();
lcd_home();
lcd_puts("Ошибка CRC");
timer2 = 0;
while (timer2 < 6000){};
tm_event=no_tm_event;
}
break;
case tm_crc_ok:
{
if (tm_verification())
{ tm_valide=1;
lcd_clrscr();
lcd_home();
#if LANGUAGE == RU
lcd_puts("Удачи!");
#elif LANGUAGE == EN
lcd_puts("Good\nLuck!");
#endif
timer2 = 0;
while (timer2 < 6000){};
tm_event=no_tm_event;
break;
}
lcd_clrscr();
lcd_home();
#if LANGUAGE == RU
lcd_puts("Не тот");
#elif LANGUAGE == EN
lcd_puts("Wrong");
#endif
lcd_gotoxy(0, 1);
#if LANGUAGE == RU
lcd_puts("ключ!");
#elif LANGUAGE == EN
lcd_puts("key!");
#endif
timer2 = 0;
while (timer2 < 6000){};
tm_event=no_tm_event;
}
break;
}//[/switch]
}//[while]
}//end if
else //тач мемори не записан в память
{//[else]
lcd_bl_off();
display_status();
rx_event = rx_event = NOT_EVENT;
ir_message.control_byte = 0;
while(!(((ir_message.control_byte ==Valid_value)&&(ir_message.ID==Command)&&(ir_message.param==0x05))||(joystick_event == key_central_pressing)))//пока не получим команду "старт"
{//[while]
rx_event = NOT_EVENT;
while((rxCount==0)&&(rx_event != RX_MESSAGE_COMPLITE)&&(joystick_event == no_pressing))//пока нет никаких команд пульта
{//[while]
WOUND_LED_INVERT;
USART_PutChar('1');
timer2 = 0;
while (timer2 < 1000);
WOUND_LED_INVERT;
timer2 = 0;
while (timer2 < 1000);
}//[while]
if(joystick_event!=key_central_pressing)joystick_event = no_key_pressing;
if (rx_event == RX_MESSAGE_COMPLITE) ir_message = get_ir_message_from_buffer();//пришла команда пульта, выдергиваем значения команды из буфера ИК приемника
else //[else]
{
if (rxCount>0) finde_message_in_bt_buffer();
}//[else]
}//[while]
} //end else //тач мемори не записан в память
//"оживаем" - начинаем новую игру
if (simples_in_queue>1) //если звук выстрла воспроизводится
{//[if]
simples_in_queue=1;//закроем eeprom
while (eeprom_is_open);//дождемся, пока eerom закроется
}//[if]
init_var(); //инициализируем переменные
joystick_event=no_pressing; //очищаем события джойстика
keyboard_event=no_key_pressing;//очищаем события триггера
reload_key_event=no_key_pressing;//очищаем события перезарядки
rx_event = NOT_EVENT; //очищаем события ИК приемника
display_status();//обновляем информацию на дисплее
// display_life(life);//отобразим уровень жизни на диодах
WOUND_LED_ON;
playstartsound();
//код обработки дополнительной команды
WOUND_LED_OFF;
}
тут я попытался интернационализировать прошивку, если обратили внимание.
Не забываем её продекларировать в хедере ltag_ascetic.h
Код:
void game_over(void);
А сам обработчик попаданий теперь выглядит так
Код:
/****************************************
* обрабатываем попадание
*****************************************/
void hit_processing(trx_packet hit_packet)//обрабатываем попадание
{
if (safe_counter) return; //если время неуязвимости ещё не кончилось, то выходим
if ((hit_packet.team_id != team_id())||(eeprom_read_byte(&friendly_fire_enable)&&(hit_packet.player_id != eeprom_read_byte(&eeprom_player_id))))//"пуля" прилетела от игрока другой, не нашей, команды
{
cyclic_deley_counter = 0; //останавливаем счетчик задержки до следующего выстрела
WOUND_LED_ON; //включаем вспомогательный светодиод
USART_SendStr("111");
if (life_in_percent > hit_packet.damage)
{
safe_counter = SAFE_DURATION*8; //время неуязвимости
life_in_percent = life_in_percent-hit_packet.damage;
life = (life_in_percent*10)/125;
if ((life==0)&&(life_in_percent>0)) life=1;
if (!((curr_sound.role==hit_sound)&&(curr_sound.simples_in_queue > 1))) playback_sound(hit_sound);//если текущий звук - звук ранения
//WOUND_LED_OFF;
keyboard_event=no_key_pressing;
}
else //[else]
{
game_over();
}//[else]
status_need_update = true;
}//[if]
}