void gfx_draw_str(const char *str, int n, int x, int y) { int xoff = 0; if (n == -1) n = INT_MAX; while ((*str != 0) && (n-- > 0)) { char c = *str++; const glyph_t* g = font_find_glyph(ctx->cfont, c); gfx_draw_glyph(g, x + xoff + g->xoffset, y + g->yoffset); xoff += g->advance; } }
static void draw_map_non_opengl(struct map * map, int topleft_x, int topleft_y, int width, int height, enum MOVE_DIRECTION ameba_state) { bool stop_diamond_blink; /* If true, then stop the diamond blinking for diamonds that are currently blinking. */ if(gfx_get_frame(MAP_DIAMOND) == gfx_get_maxframe(MAP_DIAMOND) - 1) stop_diamond_blink = true; else stop_diamond_blink = false; gfx_set_current_glyph_set(map->glyph_set); for(int y = 0 - 1; y < height; y++) for(int x = 0 - 1; x < width; x++) { int dx, dy; char m; dx = topleft_x + x * 24 + map->map_fine_x; dy = topleft_y + y * 24 + map->map_fine_y; if(map->map_x + x >= 0 && map->map_x + x < map->width && map->map_y + y >= 0 && map->map_y + y < map->height) { m = map->data[map->map_x + x + (map->map_y + y) * map->width]; } else m = MAP_ILLEGAL; switch((enum MAP_GLYPH) m) { case MAP_SMOKE2: gfx_draw_glyph_frame(dx, dy, MAP_SMOKE, MOVE_NONE, 0); break; case MAP_SMOKE1: gfx_draw_glyph_frame(dx, dy, MAP_SMOKE, MOVE_NONE, 1); break; case MAP_EXTRA_LIFE_ANIM: case MAP_SMOKE: case MAP_PLAYER_ARMOUR0: case MAP_PLAYER_ARMOUR1: case MAP_PLAYER_ARMOUR2: break; case MAP_BORDER: case MAP_BRICK: gfx_draw_glyph(dx, dy, MAP_BRICK, MOVE_NONE); break; case MAP_BRICK_MORPHER: if(map->in_editor == true || map->morpher_is_on) gfx_draw_glyph(dx, dy, MAP_BRICK_MORPHER, MOVE_NONE); else gfx_draw_glyph(dx, dy, MAP_BRICK, MOVE_NONE); break; case MAP_BRICK_EXPANDING: if(map->in_editor == true) gfx_draw_glyph(dx, dy, MAP_BRICK_EXPANDING, MOVE_NONE); else gfx_draw_glyph(dx, dy, MAP_BRICK, MOVE_NONE); break; case MAP_BRICK_UNBREAKABLE: gfx_draw_glyph(dx, dy, MAP_BRICK_UNBREAKABLE, MOVE_NONE); break; case MAP_EMPTY: if(map->extra_life_anim > 0) gfx_draw_glyph(dx, dy, MAP_EXTRA_LIFE_ANIM, MOVE_NONE); else gfx_draw_glyph(dx, dy, MAP_EMPTY, MOVE_NONE); break; case MAP_ILLEGAL: if(map->background_type == 0) gfx_draw_glyph(dx, dy, MAP_ILLEGAL, MOVE_NONE); else gfx_draw_glyph(dx, dy, MAP_EMPTY, MOVE_NONE); break; case MAP_SAND: gfx_draw_glyph(dx, dy, MAP_SAND, MOVE_NONE); break; case MAP_BOULDER: case MAP_BOULDER_FALLING: gfx_draw_glyph(dx, dy, MAP_BOULDER, MOVE_NONE); break; case MAP_DIAMOND: case MAP_DIAMOND_FALLING: { enum MOVE_DIRECTION d; d = map->move_directions[map->map_x + x + (map->map_y + y) * map->width]; gfx_draw_glyph(dx, dy, MAP_DIAMOND, d); if(stop_diamond_blink) map->move_directions[map->map_x + x + (map->map_y + y) * map->width] = MOVE_NONE; } break; case MAP_PLAYER: { enum MAP_GLYPH g; int mdir; if(map->in_editor == false) { if(map->girl->mob->armour == 0) g = MAP_PLAYER_ARMOUR0; else if(map->girl->mob->armour == 1) g = MAP_PLAYER_ARMOUR1; else /* if(map->girl->mob->armour == 2)*/ g = MAP_PLAYER_ARMOUR2; if(map->girl->mob->direction != MOVE_NONE || map->girl->mob->animation == 0) mdir = map->girl->mob->direction; else { switch(map->girl->mob->animation) { default: case 1: mdir = MOVE_NONE + 1; break; case 2: mdir = MOVE_DOWN; break; } } } else { g = MAP_PLAYER_ARMOUR2; mdir = MOVE_NONE; } gfx_draw_glyph(dx, dy, g, mdir); } break; case MAP_AMEBA: gfx_draw_glyph(dx, dy, MAP_AMEBA, ameba_state); break; case MAP_SLIME: gfx_draw_glyph(dx, dy, MAP_SLIME, MOVE_UP); break; case MAP_ENEMY1: gfx_draw_glyph(dx, dy, MAP_ENEMY1, MOVE_NONE); break; case MAP_ENEMY2: gfx_draw_glyph(dx, dy, MAP_ENEMY2, MOVE_NONE); break; case MAP_EXIT_LEVEL: gfx_draw_glyph(dx, dy, MAP_EXIT_LEVEL, MOVE_NONE); break; case MAP_TREASURE: gfx_draw_glyph(dx, dy, MAP_TREASURE, MOVE_NONE); break; case MAP_SIZEOF_: break; } } }