/**
  Coyright(C) 2006 Ueda Laboratory LMNtal Group, All rights reserved.
  $Author: Atsushi Nakano $

  SYNOPSIS
   Typing game.  Works only with LMNtal Java.
   Kill the process to finish.
   Uses the libraries graphic, timer, string, list,
   and integer.
*/

graphic.use.
go:-
{
%%make window
window,name("LMNtal Typing"),size(800,600),timer(30).keyCode.

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%各種パラメータ
%%for naming
now(0).
%%for item index
item([]).
%%アイテム生成の準備完了
item_done.
%%待ち時間[ms]
waittime(1000).
%%時間生成
nowtime(timer.getinttime),oldtime(timer.getinttime).

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%アイテム生成
keyCode([]),item_done :- keyCode([]),seed(integer.rnd(25)+65).
%%seed（int）からアイテム生成用の種、seed(string)とiseed(int)を生成。
keyCode([]),seed(_ISEED):-keyCode([]),seed(string.int_to_str(_ISEED)),iseed(_ISEED).
%%一定時間後にアイテム生成。生成時にアイテム数を数える
keyCode([]),waittime(_IW),now(_IN),iseed(_ISEED),seed(_SSEED),item(L),nowtime(_INOWT),oldtime(_IOLDT):- _INOWT - _IOLDT > _IW | 
keyCode([]),waittime(_IW),now(_IN+1),itemcount([_ISEED,A|reverse(L,[])],[],0),
{+A,draw,name(_IN),getpic(string(_SSEED,20)),position(integer.rnd(700)+50,integer.rnd(500)+50),color(255,0,0)},
nowtime(_INOWT),oldtime(_INOWT).


%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%アイテムの反転
H=reverse([_IT,T|L1],L2):-H=reverse(L1,[_IT,T|L2]).
H=reverse([],L):-H=L.
%%%アイテム数を数える
itemcount([_ISEED,A|L],L2,_ICOUNT):-_ICOUNT<20|itemcount(L,[_ISEED,A|L2],_ICOUNT+1).
%%アイテムが一定数以下。セーフ。
waittime(_IW),itemcount([],L2,_ICOUNT):-_ICOUNT < 20|waittime(_IW-5),item(L2),item_done.
%%アイテムが一定数を超えた。アウト。
score(S),
{+S,getpic(string(_IPOINT,_IS)),position(_IPX,_IPY),+M,$p,@p},
{getpic(string(_SM,_IS2)),position(_IPX2,_IPY2),+M,$q,@q},
itemcount(L,L2,_ICOUNT) :- _ICOUNT >= 20 | 
die(L,L2),
score(S),
{draw,name("gameover"),getpic(string("GAME OVER!",100)),position(50,250),color(0,0,0)},
{+S,getpic(string(_IPOINT,80)),position(300,400),+M,$p,@p},
{getpic(string(_SM,80)),position(50,400),+M,$q,@q}.

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%キー入力受付
item(L),keyCode([]),waittime(_IW),nowtime(_INOWT),oldtime(_IOLDT):- _INOWT - _IOLDT =< _IW |item(L),keyCode([]),waittime(_IW),nowtime(timer.getinttime),oldtime(_IOLDT).
keyCode([_IH|L]),item(L2):-keyCode(L),check(_IH,L2,[]).
%%アイテムのインデックスをすべてチェック
check(_IH,[_IS,X|L1],L2):-_IH=\=_IS|check(_IH,L1,[_IS,X|L2]).
%%ヒット無し。アイテムインデックスを再生成
score(S),check(_IH,[],L),{+S,getpic(string(_ISCO,_IP)),$q,@q}:-item(L),score(S),{+S,getpic(string(_ISCO-1,_IP)),$q,@q}.
%%ヒットあり。得点を加算しアイテムインデックスを再生成
score(S),check(_IH,[_IS,X|L1],L2),{+X,draw,$p[],@p},{+S,getpic(string(_ISCO,_IP)),$q,@q}:-_IH=_IS|score(S),item(list.append(reverse(L2,[]),L1)),{+S,getpic(string(_ISCO+1,_IP)),$q,@q}.

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%得点表示
score(S),
{draw,name("score_moji"),getpic(string("Score:",20)),position(10,30),color(0,0,0),sequence(1),+M},
{+S,draw,name("score"),getpic(string(0,20)),position(70,30),color(0,0,0),sequence(1),+M}.

}.