#include <stdlib.h>
#include <time.h>
#include <assert.h>
+#include <imago2.h>
#include "opengl.h"
#include "game.h"
#include "screen.h"
#include "cmesh.h"
#include "blocks.h"
+#include "logger.h"
static int init(void);
static void cleanup(void);
static void motion(int x, int y);
static void wheel(int dir);
+static void update_cur_block(void);
static void addscore(int nlines);
static int spawn(void);
static int collision(int block, const int *pos);
wheel
};
-static struct cmesh *blkmesh;
+static struct cmesh *blkmesh, *wellmesh;
+static unsigned int tex_well;
+
static float cam_theta, cam_phi, cam_dist = 30;
static int bnstate[16];
static int prev_mx, prev_my;
static int init(void)
{
- if(!(blkmesh = cmesh_alloc())) {
+ if(!(blkmesh = cmesh_alloc()) || cmesh_load(blkmesh, "data/noisecube.obj") == -1) {
+ error_log("failed to load block mesh\n");
+ return -1;
+ }
+
+ if(!(wellmesh = cmesh_alloc()) || cmesh_load(wellmesh, "data/well.obj") == -1) {
+ error_log("failed to load well mesh\n");
return -1;
}
- if(cmesh_load(blkmesh, "data/noisecube.obj") == -1) {
- fprintf(stderr, "failed to load block model\n");
+
+ if(!(tex_well = img_gltexture_load("data/grid.png"))) {
+ error_log("failed to load well texture\n");
return -1;
}
+
return 0;
}
dt -= tick_interval;
prev_tick = time_msec;
}
+
+ update_cur_block();
}
static void draw(void)
glRotatef(cam_phi, 1, 0, 0);
glRotatef(cam_theta, 0, 1, 0);
+ glPushAttrib(GL_ENABLE_BIT);
+ glBindTexture(GL_TEXTURE_2D, tex_well);
+ glEnable(GL_TEXTURE_2D);
+ glDisable(GL_LIGHTING);
+ glColor3f(1, 1, 1);
+ cmesh_draw(wellmesh);
+ glPopAttrib();
+
/* center playfield */
glPushMatrix();
- glTranslatef(-PF_COLS / 2, PF_ROWS / 2, 0);
+ glTranslatef(-PF_COLS / 2 + 0.5, PF_ROWS / 2 - 0.5, 0);
drawpf();
if(cur_block >= 0) {
if(y < 0) continue;
glPushMatrix();
- glTranslatef(x, y, 0);
+ glTranslatef(x, -y, 0);
cmesh_draw(blkmesh);
glPopMatrix();
}
unsigned int val = *sptr++;
if(val & PF_FULL) {
glPushMatrix();
- glTranslatef(j, i, 0);
+ glTranslatef(j, -i, 0);
cmesh_draw(blkmesh);
glPopMatrix();
}
next_pos[0] = pos[0] + 1;
if(collision(cur_block, next_pos)) {
next_pos[0] = pos[0];
+ update_cur_block();
stick(cur_block, next_pos); /* stick immediately */
}
}
next_pos[0]++;
}
next_pos[0]--;
+ update_cur_block();
stick(cur_block, next_pos); /* stick immediately */
}
break;
{
}
+static void update_cur_block(void)
+{
+ if(cur_block < 0) return;
+
+ memcpy(pos, next_pos, sizeof pos);
+ prev_rot = cur_rot;
+}
+
static void addscore(int nlines)
{
static const int stab[] = {40, 100, 300, 1200}; /* bonus per line completed */
if(y < 0) continue;
+ if(x < 0 || x >= PF_COLS || y >= PF_ROWS) return 1;
if(pfield[y * PF_COLS + x] & PF_FULL) return 1;
}