22 ** HOOKS
33 *************************************/
44
5+ #include "s7.h"
6+
57#include "lambda8.h"
6- #include "aria.h"
8+
9+ #include "api.h"
710
811int palette [16 ][3 ] = {
912 {0x00 , 0x00 , 0x00 }, /* BLACK */
@@ -13,81 +16,56 @@ int palette[16][3] = {
1316 {0x7F , 0x00 , 0x00 },
1417 {0x7F , 0x00 , 0x7F },
1518 {0x7F , 0x7F , 0x00 },
16- {0x7F , 0x7F , 0x7F },
17- {0x7F , 0x7F , 0x7F }, /* GREY */
19+ {0x7F , 0x7F , 0x7F }, /* watered white */
20+ {0x4F , 0x4F , 0x4F }, /* GREY */
1821 {0x7F , 0x7F , 0xFF }, /* */
1922 {0x7F , 0xFF , 0x7F },
2023 {0x7F , 0xFF , 0xFF },
2124 {0xFF , 0x7F , 0x7F },
2225 {0xFF , 0x7F , 0xFF },
23- {0xFF , 0xFF , 0x7F },
26+ {0xFF , 0xFF , 0x7F }, /* YELLOW */
2427 {0xFF , 0xFF , 0xFF }
2528};
2629
27- ar_Value * f_spr (ar_State * S , ar_Value * args ) {
28- int i = (int ) ar_check_number (S , ar_car (args ));
29- int x = (int ) ar_check_number (S , ar_nth (args , 1 ));
30- int y = (int ) ar_check_number (S , ar_nth (args , 2 ));
31- int w = (int ) ar_check_number (S , ar_nth (args , 3 ));
32- int h = (int ) ar_check_number (S , ar_nth (args , 4 ));
33- SDL_Rect dst = {x , y , w , h };
34-
35- SDL_RenderCopy ( gRenderer , gSprites [i ],
36- NULL ,
37- & dst /* NULL */ );
38- return NULL ;
39- }
40-
41- ar_Value * f_pix (ar_State * S , ar_Value * args ) {
42- double a = ar_check_number (S , ar_car (args ));
43- double b = ar_check_number (S , ar_nth (args , 1 ));
44- int c = (int ) ar_check_number (S , ar_nth (args , 2 ));
30+ s7_pointer l8_pix (s7_scheme * sc , s7_pointer args ) {
31+ double x = s7_number_to_real (sc , s7_car (args ));
32+ double y = s7_number_to_real (sc , s7_cadr (args ));
33+ int c = (int ) s7_number_to_real (sc , s7_caddr (args ));
4534
4635 SDL_SetRenderDrawColor (gRenderer , palette [c ][0 ], palette [c ][1 ], palette [c ][2 ], 255 );
47- SDL_RenderDrawPoint (gRenderer , a , b );
48- return NULL ;
49- }
50-
51- ar_Value * f_rect (ar_State * S , ar_Value * args ) {
52- double a = ar_check_number (S , ar_car (args ));
53- double b = ar_check_number (S , ar_nth (args , 1 ));
54- double c = ar_check_number (S , ar_nth (args , 2 ));
55- double d = ar_check_number (S , ar_nth (args , 3 ));
56-
57- SDL_Rect dstrect ;
36+ SDL_RenderDrawPoint (gRenderer , x , y );
5837
59- dstrect .x = a ;
60- dstrect .y = b ;
61- dstrect .w = c ;
62- dstrect .h = d ;
63-
64- SDL_SetRenderDrawColor (gRenderer , 255 , 0 , 0 , 255 );
65- SDL_RenderDrawRect (gRenderer , & dstrect );
66- return NULL ;
38+ return s7_make_integer (sc , 1 );
6739}
6840
69- ar_Value * f_line ( ar_State * S , ar_Value * args ) {
70- double a = ar_check_number ( S , ar_car (args ));
71- double b = ar_check_number ( S , ar_nth (args , 1 ));
72- double c = ar_check_number ( S , ar_nth (args , 2 ));
73- double d = ar_check_number ( S , ar_nth ( args , 3 ) );
41+ s7_pointer l8_printxy ( s7_scheme * sc , s7_pointer args ) {
42+ const char * str = s7_string ( s7_car (args ));
43+ double x = s7_number_to_real ( sc , s7_cadr (args ));
44+ double y = s7_number_to_real ( sc , s7_caddr (args ));
45+ printText ( str , x , y );
7446
75- SDL_SetRenderDrawColor (gRenderer , 255 , 0 , 0 , 255 );
76- SDL_RenderDrawLine (gRenderer , a , b , c , d );
77- return NULL ;
47+ return s7_make_integer (sc , 1 );
7848}
7949
80- ar_Value * f_cls (ar_State * S , ar_Value * args ) {
81- int c = (int ) ar_check_number (S , ar_car (args ));
82- SDL_SetRenderDrawColor (gRenderer , palette [c ][0 ], palette [c ][1 ], palette [c ][2 ], 255 );
83- SDL_RenderClear ( gRenderer );
84- return NULL ;
50+ s7_pointer l8_spr (s7_scheme * sc , s7_pointer args ) {
51+ double i = s7_number_to_real (sc , s7_car (args ));
52+ double x = s7_number_to_real (sc , s7_cadr (args ));
53+ double y = s7_number_to_real (sc , s7_caddr (args ));
54+ double w = s7_number_to_real (sc , s7_cadddr (args ));
55+ double h = s7_number_to_real (sc , s7_car (s7_cddddr (args )));
56+ SDL_Rect dst = {x , y , w , h };
57+
58+ SDL_RenderCopy ( gRenderer , gSprites [(int ) i ],
59+ NULL ,
60+ & dst /* NULL */ );
61+
62+ return s7_make_integer (sc , 1 );
8563}
8664
87- ar_Value * f_define_sprite ( ar_State * S , ar_Value * args ) {
88- char * id = ar_check ( S , ar_car (args ), AR_TSTRING ) -> u . str . s ;
65+ s7_pointer l8_define_sprite ( s7_scheme * sc , s7_pointer args ) {
66+ const char * id = s7_string ( s7_car (args )) ;
8967 int success = 1 ;
90-
68+
9169 SDL_Surface * surf = IMG_Load (id );
9270 if (surf == NULL ) {
9371 printf ("Error creating surface for %s\n" , id );
@@ -106,11 +84,11 @@ ar_Value *f_define_sprite(ar_State *S, ar_Value *args) {
10684
10785 SDL_FreeSurface (surf );
10886
109- return success ? ar_new_number ( S , gMaxSprite ) : NULL ;
87+ return s7_make_integer ( sc , success ? gMaxSprite : -1 ) ;
11088}
11189
112- ar_Value * f_define_sfx ( ar_State * S , ar_Value * args ) {
113- char * id = ar_check ( S , ar_car (args ), AR_TSTRING ) -> u . str . s ;
90+ s7_pointer l8_define_sfx ( s7_scheme * sc , s7_pointer args ) {
91+ const char * id = s7_string ( s7_car (args )) ;
11492 int success = 1 ;
11593
11694 ++ gMaxSfx ;
@@ -122,21 +100,74 @@ ar_Value *f_define_sfx(ar_State *S, ar_Value *args) {
122100 success = 0 ;
123101 }
124102
125- return success ? ar_new_number ( S , gMaxSfx ) : NULL ;
103+ return success ? s7_make_integer ( sc , gMaxSfx ) : s7_nil ( sc ) ;
126104}
127105
128- ar_Value * f_sfx ( ar_State * S , ar_Value * args ) {
129- int i = ( int ) ar_check_number ( S , ar_car (args ));
106+ s7_pointer l8_sfx ( s7_scheme * sc , s7_pointer args ) {
107+ int i = s7_integer ( s7_car (args ));
130108 Mix_PlayChannel (-1 , gSfx [i ], 0 );
131109 return NULL ;
132110}
133111
134- ar_Value * f_printxy (ar_State * S , ar_Value * args ) {
135- size_t len ;
136- const char * str = ar_to_stringl (S , ar_car (args ), & len );
137- double x = ar_check_number (S , ar_nth (args , 1 ));
138- double y = ar_check_number (S , ar_nth (args , 2 ));
139- printText (str , x , y );
112+ s7_pointer l8_rect (s7_scheme * sc , s7_pointer args ) {
113+ double a = s7_number_to_real (sc , s7_car (args ));
114+ double b = s7_number_to_real (sc , s7_cadr (args ));
115+ double c = s7_number_to_real (sc , s7_caddr (args ));
116+ double d = s7_number_to_real (sc , s7_cadddr (args ));
117+
118+ SDL_Rect dstrect ;
140119
120+ dstrect .x = a ;
121+ dstrect .y = b ;
122+ dstrect .w = c ;
123+ dstrect .h = d ;
124+
125+ SDL_SetRenderDrawColor (gRenderer , 255 , 0 , 0 , 255 );
126+ SDL_RenderDrawRect (gRenderer , & dstrect );
141127 return NULL ;
142128}
129+
130+ s7_pointer l8_line (s7_scheme * sc , s7_pointer args ) {
131+ double a = s7_number_to_real (sc , s7_car (args ));
132+ double b = s7_number_to_real (sc , s7_cadr (args ));
133+ double c = s7_number_to_real (sc , s7_caddr (args ));
134+ double d = s7_number_to_real (sc , s7_cadddr (args ));
135+
136+ SDL_SetRenderDrawColor (gRenderer , 255 , 0 , 0 , 255 );
137+ SDL_RenderDrawLine (gRenderer , a , b , c , d );
138+ return NULL ;
139+ }
140+
141+ s7_pointer l8_cls (s7_scheme * sc , s7_pointer args ) {
142+ int c = s7_integer (s7_car (args ));
143+ SDL_SetRenderDrawColor (gRenderer , palette [c ][0 ], palette [c ][1 ], palette [c ][2 ], 255 );
144+ SDL_RenderClear (gRenderer );
145+ return NULL ;
146+ }
147+
148+
149+ typedef s7_pointer (* l8_func )(s7_scheme * sc , s7_pointer args );
150+
151+ struct { const char * name ; l8_func fn ; int nargs ; int optargs ; bool restargs ; const char * doc ; } l8_prims [] = {
152+ { "define-sprite" , l8_define_sprite , 1 , 0 , false, "(define-sprite filename) Loads an image from filename, makes a texture and registers it, returning it's handle" },
153+ { "spr" , l8_spr , 5 , 0 , false, "(spr id x y w h) Blits sprite id at x,y with size w,h" },
154+ { "pix" , l8_pix , 3 , 0 , false, "(pix x y c) Sets the pixel at x,y to color c" },
155+
156+ { "define-sfx" , l8_define_sfx , 1 , 0 , false, "(define-sfx filename) Loads a sound effect from filename, returning it's handle" },
157+ { "sfx" , l8_sfx , 1 , 0 , false, "(sfx id) Plays the sound efect with number id" },
158+
159+ { "printxy" , l8_printxy , 3 , 0 , false, "(printxy text x y) Prints text at x,y using the current color" },
160+
161+ { NULL , NULL , 0 , 0 , false, NULL }
162+ };
163+
164+ void initMachineLisp (s7_scheme * sc ) {
165+ // initialise the environment
166+ s7_define_variable (sc , "SCREEN-WIDTH" , s7_make_integer (sc , L8_WIDTH ));
167+ s7_define_variable (sc , "SCREEN-HEIGHT" , s7_make_integer (sc , L8_HEIGHT ));
168+
169+ // register the functions
170+ for (int i = 0 ; l8_prims [i ].name ; ++ i ) {
171+ s7_define_function (sc , l8_prims [i ].name , l8_prims [i ].fn , l8_prims [i ].nargs , l8_prims [i ].optargs , l8_prims [i ].restargs , l8_prims [i ].doc );
172+ }
173+ }
0 commit comments