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]