State fields (do not delete this caption): unsigned int CharHP; QStateHandler StartState; unsigned int TimerAgony; Code for h-file: (do not delete this caption): #define HEALTHY 1 #define AGONY 2 #define DEAD 0 #define GHOUL_GOOD 3 #define GHOUL_WOUNDED 4 #define GHOUL_HEALING 5 #define BLESSED 6 #define FLASH_MS 200 #define FLASH_SEC 1010 #define FLASH_1M 60100 #define TIMEOUT_AGONY_S 600 #define TIMEOUT_DEATH_S 15 #define TIMEOUT_RADX_S 900 #define LONG_BEEP_MS 15000 #define MEDIUM_BEEP_MS 3000 #define SHORT_BEEP_MS 500 #define RED 255 #define RED_MEDIUM 127 #define GREEN_MEDIUM 127 #define BLUE_MEDIUM 127 #define DEFAULT_HP 27000 #define GHOUL_HP (DEFAULT_HP/3) Constructor fields (do not delete this caption): unsigned int HP; unsigned int State; unsigned int TimerAgony; Constructor code: (do not delete this caption): me->CharHP = HP; me->TimerAgony = TimerAgony; switch (State) { case HEALTHY: { me->StartState = (QStateHandler)&OregonPlayer_healthy; break; } case AGONY: { me->StartState = (QStateHandler)& OregonPlayer_agony; break; } case DEAD: { me->StartState = (QStateHandler)& OregonPlayer_dead; break; } case GHOUL_GOOD: { me->StartState = (QStateHandler)& OregonPlayer_ghoul_good; break; } case GHOUL_WOUNDED: { me->StartState = (QStateHandler)& OregonPlayer_wounded; break; } case GHOUL_HEALING: { me->StartState = (QStateHandler)& OregonPlayer_ghoul_healing; break; } case BLESSED: { me->StartState = (QStateHandler)& OregonPlayer_blessed; break; } default: me->StartState =(QStateHandler)& OregonPlayer_healthy; } Comments: void ShowCurrentHealth (OregonPlayer* me) { Flash(255 - me->CharHP*255/DEFAULT_HP, me>CharHP*255/DEFAULT_HP, 0, FLASH_MS); } void ShowCurrentHealthGhoul (OregonPlayer* me) { Flash(255 - me->CharHP*255/DEFAULT_HP, me>CharHP*255/DEFAULT_HP, 0, FLASH_MS); } void UpdateHP(OregonPlayer* me, unsigned int NewHP) { if (NewHP <= DEFAULT_HP) { me->CharHP = NewHP;; } else { me->CharHP = DEFAULT_HP SaveHP(me->CharHP); } void Reset(OregonPlayer* me) { UpdateHP(me, DEFAULT_HP); me->TimerDeath = 0; UpdateTimerAgony(0); return Q_TRAN(healthy); } void UpdateTimerAgony(PlayerOregon* me, unsigned int Timer) { me->TimerAgony = Timer; SaveTimerAgony(Timer); } active entry/ Folder 4 alive entry/ \ get_shot agony entry/ BeepForPeriod(LONG_BEEP_MS); SaveState(AGONY); UpdateHP(me, 1); me->TimerAgony = 0; TIME_TICK_1S[else]/ me->TimerAgony++; Flash(RED, 0, 0, FLASH_MS); TIME_TICK_10S/ BeepForPeriod(SHORT_BEEP_MS); healthy entry/ SaveState(HEALTHY); BeepForTime(MEDIUM_BEEP_MS); RAD_RCVD[else]/ UpdateHP(me, me->CharHP-((oregonPlayerQEvt*)e)->value); TIME_TICK_1S/ ShowCurrentHealth(me); HEAL/ UpdateHP(me, me->CharHP+((oregonPlayerQEvt*)e)->value); immune entry/ BeepForTime(MEDIUM_BEEP_MS); TIME_TICK_1S/ Flash(0, GREEN_MEDIUM, 0, FLASH_SEC); HEAL/ UpdateHP(me, me->CharHP+((oregonPlayerQEvt*)e)->value); Folder 4 temp_immune entry/ blessed entry/ SaveState(BLESSED); ghoul entry/ TIME_TICK_1S/ ShowCurrentHealthGhoul(me); Folder 4 ghoul_good entry/ SaveState(GHOUL_GOOD); BeepForPeriod(MEDIUM_BEEP_MS); UpdateHP(me, GHOUL_HP); wounded entry/ SaveState(GHOUL_WOUNDED); UpdateHP(me, 1); BeepForPeriod(LONG_BEEP_MS); TIME_TICK_10S/ BeepForPeriod(SHORT_BEEP_MS); ghoul_healing entry/ SaveState(GHOUL_HEALING); RAD_RCVD[else]/ UpdateHP(me, me->CharHP + ((oregonPlayerQEvt*)e)->value); dead entry/ SaveState(DEAD); BeepForTime(LONG_BEEP_MS); UpdateHP(me, 0); Flash(RED, 0, 0, 1000); TIME_TICK_1M/ BeepForPeriod(SHORT_BEEP_MS); Flash(255, 0, 0, FLASH_1M); Event fields (do not delete this caption): unsigned int value; test entry/ BeepForPeriod(SHORT_BEEP_MS); Flash(127, 0, 0, FLASH_MS); RAD_RCVD/ BeepForPeriod(SHORT_BEEP_MS); Flash(127, 0, 0, FLASH_MS); RAD_RCVD[((oregonPlayerQEvt*)e)->value >= me->CharHP] TIME_TICK_1S[me->TimerAgony > TIMEOUT_AGONY_S] return Q_TRAN(me->StartState); AGONY IMMUNE PILL_GHOUL PILL_REMOVED RAD_RCVD/ UpdateHP(me, me->CharHP + ((oregonPlayerQEvt*)e)->value); NOT_IMMUNE BLESSED AGONY PILL_RESET/ Reset(me); RAD_RCVD [((((oregonPlayerQEvt*)e)->value+me->CharHP )>=GHOUL_HP)] PILL_GHOUL PILL_RESET/ Reset(me); PILL_TEST HEAL/ UpdateHP(me, me->CharHP + ((oregonPlayerQEvt*)e)->value); TEST_TRIGGER [me->CharHP>0] [else]