U0 AnimationDelaySet()
{
animation_delay=PopUpRangeF64(0,100,25,"%3f% %%","Animation Delay\n")/100;
}
U0 TurnNew()
{
I64 i,j;
for (j=0;j<2;j++)
for (i=0;i<UNITS_NUM;i++) {
units[j][i].remaining_movement=units[j][i].movement;
units[j][i].fired=FALSE;
}
phase=PHASE_START;
moving_unit=NULL;
SleepUntil(msg_off_timeout);
msg_off_timeout=cnts.jiffies+JIFFY_FREQ*2*animation_delay+1;
Snd(74);
StrPrint(msg_buf,"Turn %d",++turn);
VRSetUp(0);
VRSetUp(1);
VisRecalc(VR_ALL_UNITS);
cur_player=(turn&1)^1;
enemy_player=cur_player^1;
}
U0 PhaseNew()
{
cur_player^=1;
enemy_player=cur_player^1;
if (++phase>=PHASE_END) {
IndirectResolveAll;
TurnNew;
}
SleepUntil(msg_off_timeout);
msg_off_timeout=cnts.jiffies+JIFFY_FREQ*2*animation_delay+1;
Snd(74);
switch (phase) {
case PHASE_INDIRECT0:
case PHASE_INDIRECT1:
StrPrint(msg_buf,"Player %d Artillery Plot",cur_player+1);
break;
case PHASE_MOVE0:
case PHASE_MOVE1:
StrPrint(msg_buf,"Player %d Move",cur_player+1);
break;
case PHASE_DIRECT0:
case PHASE_DIRECT1:
StrPrint(msg_buf,"Player %d Fire",cur_player+1);
break;
}
}
U0 CharDo(U8 ch)
{
I64 old_inhibit,old_draw_it;
Bool old_cursor;
switch (ch) {
case CH_ESC:
case CH_SHIFT_ESC:
throw('ExitGame',TRUE);
case CH_SPACE:
throw('PhaseOvr',TRUE);
case '\n':
throw('NewGame',TRUE);
case '1':
ViewPlayerSet(0);
break;
case '2':
ViewPlayerSet(1);
break;
case 'c':
old_draw_it=Fs->draw_it;
old_inhibit=Fs->win_inhibit;
Fs->draw_it=Fs->next_settings->draw_it;
Fs->win_inhibit=WIG_USER_TASK_DFT;
old_cursor=DocCursor(ON);
DocBottom;
"\n$GREEN$<SHIFT-ESC>$FG$ to return to game.\n";
View;
DocBottom;
DocCursor(old_cursor);
Fs->win_inhibit=old_inhibit;
Fs->draw_it=old_draw_it;
break;
case 'd':
AnimationDelaySet;
break;
}
}
U0 UserChk()
{
I64 ch;
if (!alive_cnt[0] || !alive_cnt[1])
throw('GameOver',TRUE);
if (ch=ScanChar)
CharDo(ch);
}
U0 TaskEndCB()
{
Snd;
progress4=progress4_max=progress1=progress1_max=0;
Exit;
}
I64 PhaseDo()
{
I64 res='ExitGame';
PhaseNew;
try {
if (phase&~1==PHASE_INDIRECT)
Call(player_indirect[cur_player]);
else if (phase&~1==PHASE_MOVE)
Call(player_move[cur_player]);
else
Call(player_direct[cur_player]);
} catch {
res=Fs->except_ch;
Fs->catch_except=TRUE;
}
return res;
}
U0 ToTheFront()
{
I64 res,ch;
map_dc=DCNew(MAP_WIDTH,MAP_HEIGHT);
SettingsPush; //See SettingsPush
Cd(__DIR__);
Fs->win_inhibit|=WIF_SELF_MS_L|WIF_SELF_MS_R|WIG_DBL_CLICK;
MenuPush(
"File {"
" Abort(,CH_SHIFT_ESC);"
" Exit(,CH_ESC);"
"}"
"Play {"
" EndPhase(,CH_SPACE);"
" Restart(,'\n');"
"}"
"View {"
" Player1(,'1');"
" Player2(,'2');"
" OddsCalculations(,'c');"
" LOS(,0,SCF_SHIFT);"
"}"
"Settings {"
" AnimationDelay(,'d');"
"}"
);
AutoComplete;
WinBorder;
WinMax;
DocCursor;
DocMax;
Init;
PlayerPick("AIs",0);
PlayerPick("AIs",1);
PopUpOk("$PURPLE$$TX+CX,\"ToTheFront\"$$FG$\n\n"
"$GREEN${Left-click}$FG$ to move or fire units.\n"
"$GREEN$<SPACE>$FG$\tor $GREEN${Right-click}$FG$ to end phase.\n"
"$GREEN$<SHIFT>$FG$\tto show line-of-sight.\n"
"$GREEN$<ENTER>$FG$\tto start new game.\n"
"$GREEN$1$FG$\tPlayer 1 view.\n"
"$GREEN$2$FG$\tPlayer 2 view.\n"
"$GREEN$c$FG$\tView odds calculations.\n"
"$GREEN$d$FG$\tSet animation delay.");
Fs->task_end_cb=&TaskEndCB; //<CTRL-ALT-x>
Fs->draw_it=&DrawIt;
try {
do {
res=PhaseDo;
if (res=='GameOver') {
while (TRUE) {
msg_off_timeout=0;
StrCpy(msg_buf,"Game Over");
Snd;
ch=GetChar(,FALSE);
if (ch=='\n') {
CleanUp;
Init;
break;
} else if (ch==CH_ESC || ch==CH_SHIFT_ESC) {
res='ExitGame';
break;
} else if (ch=='1')
ViewPlayerSet(0);
else if (ch=='2')
ViewPlayerSet(1);
else if (ch=='d')
AnimationDelaySet;
}
} else if (res=='NewGame') {
CleanUp;
Init;
}
} while (res!='ExitGame');
} catch
PutExcept;
ProgressBarsRst;
SettingsPop;
DCDel(map_dc);
CleanUp;
MenuPop;
Seed;
}