
 CxgRg[֌W̊֐ɂ

void slInitEvent(void)
   @\ : CxgA[NǗp̃obt@BCxg͂USA
	  [N͂QTUpӂB
    : CxgA[Np̂q`l̂͏Ȃ̂ŁÄo
	  ɁA[U[vO邱ƁB

EVENT *slGetEvent(void)
   @\ : CxgpɊtꂽq`l̈oÃ|C^
	  B
    : PQWoCg̗̈ŁA[U[RɎgpłB
	  USpӂĂ邪Ag؂Ăꍇɂ mtkk R[h
	  ԂB

EVENT *slSetEvent(void (*func)())
   @\ : CxgoAsXg̖ɒǉB̍ہAw肳
	  ֐s֐Ƃēo^B
    : PQWoCg̗̈ł邪A擪̂PUoCg̓VXeɂgp
	  B
	  CxgcĂȂꍇɂ mtkk R[hԂB

EVENT *slSetEventNext(EVENT *evptr , void (*func)())
   @\ : CxgoAw肳ꂽCxg̎Ɏs悤ɁA
	  sXgɒǉB̍ہAw肳ꂽ֐s֐Ƃēo^
	  B
    : PQWoCg̗̈ł邪A擪̂PUoCg̓VXeɂgp
	  B
	  CxgcĂȂꍇɂ mtkk R[hԂB

void slReturnEvent(EVENT *evptr)
   @\ : sXgɓo^ĂȂCxgVXeɕԂB
    : sXgɓo^ĂCxgɑ΂āÅ֐s
	  Xgɓo^ꂽ܂܂ɂȂ邽߁As͌pB
	  ߂ꂽ|C^̓VXẽobt@ɍēo^邪A̍ۂɓo
	  ^ς݂łĂ`FbNȂ̂ŁA|C^𕡐ԋp
	  ƁǍs slGetEvent(),slSetEvent(),slSetEventNext()
	  ɂĕsB

void slCloseEvent(EVENT *evptr)
   @\ : sXgɓo^ꂽCxgXg؂藣AVXeɕ
	  B܂A[NZbgĂꍇA߂B
    : sXgɓo^ĂȂCxgw肷ƁAXg񂪐
	  Ȃ߁AsȃCxgɑ΂āAXgύX邱Ƃ
	  ȂA\łȂAhXɑ΂鏑݂Aň̏ꍇA
	  bot~ꍇB
	  ߂ꂽ|C^̓VXẽobt@ɍēo^邪A̍ۂɓo
	  ^ς݂łĂ`FbNȂ̂ŁA|C^𕡐ԋp
	  ƁǍs slGetEvent(),slSetEvent(),slSetEventNext()
	  ɂĕsB

void slExecuteEvent(void)
   @\ : sXgɓo^ꂽCxg擪珇ɎsB
    : C[vƂɎsB

WORK *slGetWork(void)
   @\ : [NpɊtꂽq`l̈oÃ|C^ԂB
    : [N͂USoCg̗̈ŁA擪̂SoCgXgp̃|C^
	  āAVXeŎgpBĉUOoCg̓[U[RɎgp
	  łB
	  dudms \̂ vnqj  |C^ZbgĂ΃Cx
	  gN[YꍇɁAVXeɕԋpB

void slReturnWork(WORK *wkptr)
   @\ : [NƂĎgpĂq`l̈VXeɖ߂B
    : ߂ꂽ|C^̓VXẽobt@ɍēo^邪A̍ۂɓo
	  ^ς݂łĂ`FbNȂ̂ŁA|C^𕡐ԋp
	  ƁǍɎs slGetWork() ɂĕsB


 Cxg̓o^Ǝsɂ

  slInitEvent() sɂ͎sXg̓NA܂̂ŁAs
  CxgXgɓo^Ȃ΂Ȃ܂B
  Cxg̓o^ɂ slSetEvent() 邢 slSetEventNext() gp܂B

    void *eventtbl[] = {
	init_camera ,
	init_player1 ,
	init_player2 ,
	init_enemyctrl
    } ;

    void InitGame(){
	void  **evrdptr ;
	EVENT  *evptr ;
	int	cnt ;

	slInitEvent() ;		/* CxgǗpϐ̏ */
	evrptr = eventtbl ;
	for(cnt = sizeof(eventtbl) / sizeof(void *) ; cnt-- > 0 ;){
	    evptr = slSetEvent(*evrptr++) ;
	}
	slInitPolygon(TV_320x224) ;
    }

    void Game(){
	slExecuteEvent() ;	/* Cxg̎s */
	slSynch() ;		/* |Sf[^̏o͂ƃrfI\ */
    }

  Cxg slExecuteEvent() ֐ĂяoƂɎs܂B
  eCxg͊{IɁAo^ꂽɎs܂B
  ͂߂ɓo^ꂽCxg VXe EventTop ϐɒ`A
  N_ƂāACxg̃|C^ EventNow ϐɒ`ȂAeCx
  g̏֐Ăяo܂B֐͈ȉ̌`Œ`Ă܂B

  void function(EVENT *evptr){
	...		/* Cxg */
  }

  AZuŏꍇɂ

  _function:
	...		; Cxg
			; Cxg̃|C^ rSWX^ɃZbgĂ
	rts
	nop

  ЂƂ̃CxgIƁÃCxg̍\̂ɂ next |C^
  EventNow ϐɓAlɏ֐Ɏsڂ܂B next |C^
   mtkk ƂȂ܂ŌJԂ܂B

  EventTop: ----+
	 	|
	 	|    +------------------+
	 	+--> | *work = NULL	|
		     | *before = NULL	|
		+--  | *next		|
		|    | *exad()		|
		|    |  user[]		|
		|    +------------------+
		|
		|    +------------------+	+------------------+
		+--> | *work		|  ---> | *next		   | -+
		     | *before		|	|		   |  |
		+--  | *next		|	|		   |  |
		|    | *exad()		|	+------------------+  |
		|    |  user[]		|   +-------------------------+
		|    +------------------+   |
		|			    |	+------------------+
		|    +------------------+   +-> | *next = NULL     | 
  EventLast: ---+--> | *work		|	|		   |
		     | *before		|	|		   |
		     | *next = NULL	|	+------------------+
		     | *exad()		|
		     |  user[]		|
		     +------------------+

  EventLast ϐɂ͍ŌɎsCxg̃|C^`ĂACx
  gǉۂɎgp܂B
  [U[q`lgpɂ́A[U[pɍ\̂`ACxgq`l
   user[]  ̍\̂ cast ܂B

  )
    typedef struct rob{
	FIXED  posX , posY , posZ ;
	ANGLE  angX , angY , angZ ;
	PDATA *pat ;
    } ROBOT ;		/* ̍\̂͂PPQoCgzȂlɂ邱 */

    void rob_control(EVENT *evptr){
	ROBOT *rbptr ;

	rbptr = (ROBOT *)evptr->user ;
	rbptr->posX = to_fixed(0) ;
	rbptr->posY = to_fixed(0) ;
	rbptr->posZ = to_fixed(0) ;
	rbptr->pat = &PD_Robot ;
    }

  [N̓|C^̃XgɂȂĎƂł܂B
  ЂƂ̃Cxgŕ̃LN^𓮂ꍇɂ̓[NgpāAq`l
  mۂ܂B

    typedef struct road{
	struct road *next ;
	FIXED  posX , posY , posZ ;
	PDATA *pat ;
    } ROAD ;

    typedef struct rdat{
	Sint16 px , py , pz ;
	Uint16 pn ;
    } ROAD_DAT ;

    ROAD_DAT roadtbl[] = {
	{   0 ,   0 ,   0 , PN_ROAD} ,
	{   0 ,   0 , 100 , PN_ROAD} ,
	{   0 ,   0 , 200 , PN_ROAD}
    } ;

    void InitRoadControl(EVENT *evptr){
	WORK  *wkptr ;
	ROAD  *rdptr ;
	ROAD_DAT *rdtptr ;
	int    cnt ;

	rdptr = (ROAD *)evptr ;
	rdtptr = roadtbl ;
	for(cnt = sizeof(roadtbl) / sizeof(ROAD_DAT) ; cnt-- > 0 ;){
	    if((wkptr = slGetWork()) == NULL){
		break ;
	    }
	    rdptr->next = (ROAD *)wkptr ;	/* ЂƂ߂̃|C^ */
						/* Cxg work ɓ */
	    rdptr = (ROAD *)wkptr ;
	    rdptr->posX = rdtptr->px << 16 ;	/* |WV */
	    rdptr->posY = rdtptr->py << 16 ;
	    rdptr->posZ = rdtptr->pz << 16 ;
	    rdptr->pat = pattbl[rdptr->pn] ;	/* p^[f[^ */
	    rdtptr++ ;
	}
	rdptr->next = NULL ;			/* End mark */
	evptr->exad = (void *)RoadControl ;
    }
