summaryrefslogtreecommitdiff
path: root/core.c
diff options
context:
space:
mode:
Diffstat (limited to 'core.c')
-rw-r--r--core.c28
1 files changed, 20 insertions, 8 deletions
diff --git a/core.c b/core.c
index 0a3f73d..4e2b89e 100644
--- a/core.c
+++ b/core.c
@@ -7,6 +7,8 @@
#include"input.h"
#include"core.h"
+#define DELAY_FALL 0.2
+#define DELAY_BAKE 1.0
#define GRID_W 10
#define GRID_H 20
#define GRID_X 32
@@ -56,12 +58,10 @@ _ V tetro_rot(Tetro*t,S8 c){U8 i;vec2 a;
glm_vec2_rotate(a,GLM_PI_2*(2-c),a),
glm_vec2_add(a,t->org,a),
glm_vec2_copy(a,t->v[i]);}}
-
_ V tetro_bake(Tetro t){U8 i;vec2 a;
glm_vec2_sub(t.pos,(vec2){GRID_X,GRID_Y},a),
glm_vec2_div(a,(vec2){CELL_W,CELL_H},a);
for(i=0;i<4;++i)grid[(U32)(a[1]+t.v[i][1])][(U32)(a[0]+t.v[i][0])]=t.i;}
-
_ V tetro_draw_col(Tetro t,vec4 c){U8 i;vec2 a;vec2 z={CELL_W,CELL_H};
graph_shader_use(shader_tetro),
graph_tex_use(tex_cell_mino,0),
@@ -72,10 +72,22 @@ _ V tetro_draw_col(Tetro t,vec4 c){U8 i;vec2 a;vec2 z={CELL_W,CELL_H};
glm_vec2_add(t.pos,a,a),
graph_quad(a,z);}}
_ V tetro_draw(Tetro t){tetro_draw_col(t,tetros_col[t.i]);}
-_ V tetro_next(Tetro*t){_ Tetro bag[14];_ U8 i=14;U8 j,k;Tetro u;
- Q(i>13,i=0,memcpy(bag,tetros,SZ tetros),memcpy(bag+7,tetros,SZ tetros);
- for(j=0;j<13;++j)k=j+rand()/(RAND_MAX/(14-j)+1),u=bag[k],bag[k]=bag[j],bag[j]=u;)
- OR ++i;t->i=bag[i].i,memcpy(t->org,bag[i].org,SZ(vec2)),memcpy(t->v,bag[i].v,4*SZ(vec2));}
+
+_ Tetro bag[14];
+_ U8 bag_i=14;
+_ V tetro_next(Tetro*t){U8 i,j;Tetro u;
+ Q(bag_i>=13,bag_i=0,memcpy(bag,tetros,SZ tetros),memcpy(bag+7,tetros,SZ tetros);
+ for(i=0;i<13;++i)j=i+rand()/(RAND_MAX/(14-i)+1),u=bag[j],bag[j]=bag[i],bag[i]=u;)
+ OR ++bag_i;*t=bag[bag_i],t->pos[0]=GRID_X+CELL_W*4,t->pos[1]=GRID_Y+CELL_H*(GRID_H-1);}
+_ U8 tetro_in_floor(Tetro t){U8 i;U32 w,x;vec2 a;
+ glm_vec2_sub(t.pos,(vec2){GRID_X,GRID_Y},a),
+ glm_vec2_div(a,(vec2){CELL_W,CELL_H},a);
+ for(i=0;i<4;++i){w=a[1]+t.v[i][1],x=a[0]+t.v[i][0];Q(w>=GRID_H||w<0,R 1)Q(-1!=grid[w][x],R 1)}
+ R 0;}
+_ V tetro_fall(Tetro*t,F64 dt){_ F64 et=0;U8 q;
+ t->pos[1]-=CELL_H,q=tetro_in_floor(*t),t->pos[1]+=CELL_H;
+ Q(q,Q(et>=DELAY_BAKE,tetro_bake(*t),tetro_next(t),et=0)OR et+=dt)
+ OR tetro_trans(t,(vec2){0,-32});}
_ V grid_draw(V){U8 i,j;S8 c;vec2 z={CELL_W,CELL_H},pos={GRID_X,GRID_Y};
graph_shader_use(shader_tetro),
@@ -100,11 +112,11 @@ V core_init(V){
tex_cell_soon=graph_tex_create("res/tex/cell_soon.png"),
memset(grid,-1,GRID_W*GRID_H);
tetro_next(&held);}
-
-V core_tick(InputPoint p,InputButtons b){
+V core_tick(InputPoint p,InputButtons b,F64 dt){_ F64 et=0;
glm_ortho(0,graph_win_w,0,graph_win_h,0,4,proj);
grid_draw();
tetro_draw(held);
+ Q((et+=dt)>=DELAY_FALL,tetro_fall(&held,et),et=0)
Q(IB_Z&b.p,tetro_rot(&held, 1))
Q(IB_X&b.p,tetro_rot(&held,-1))
Q(IB_C&b.p,tetro_next(&held))