Codebase list gplanarity / debian/17906-7 dialog_level.c
debian/17906-7

Tree @debian/17906-7 (Download .tar.gz)

dialog_level.c @debian/17906-7raw · history · blame

/*
 *
 *  gPlanarity: 
 *     The geeky little puzzle game with a big noodly crunch!
 *    
 *     gPlanarity copyright (C) 2005 Monty <monty@xiph.org>
 *     Original Flash game by John Tantalo <john.tantalo@case.edu>
 *     Original game concept by Mary Radcliffe
 *
 *  gPlanarity is free software; you can redistribute it and/or modify
 *  it under the terms of the GNU General Public License as published by
 *  the Free Software Foundation; either version 2, or (at your option)
 *  any later version.
 *   
 *  gPlanarity is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 *  GNU General Public License for more details.
 *   
 *  You should have received a copy of the GNU General Public License
 *  along with Postfish; see the file COPYING.  If not, write to the
 *  Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.
 *
 * 
 */

#include <math.h>
#include <string.h>
#include <gtk/gtk.h>
#include <gdk/gdk.h>

#include "graph.h"
#include "timer.h"
#include "gameboard.h"
#include "gameboard_draw_button.h"
#include "dialog_level.h"
#include "levelstate.h"
#include "main.h"

static void unlevel_post (Gameboard *g){
  g->level_dialog_active=0;
  pop_curtain(g);
  levelstate_go();
  prepare_reenter_game(g);
  reenter_game(g);
} 

static void unlevel_quit (Gameboard *g){
  gtk_main_quit();
} 

static void local_go (Gameboard *g){
  undeploy_buttons(g,unlevel_post);
}

static void local_quit (Gameboard *g){
  undeploy_buttons(g,unlevel_quit);
}

/* initialize the rather weird little animation engine */
static void setup_level_buttons(Gameboard *g,int bw, int bh){
  int i;
  int w=g->g.width;
  int h=g->g.height;
  buttonstate *states=g->b.states;

  states[0].rollovertext=_("exit gPlanarity");
  states[2].rollovertext=_("reset level");
  states[10].rollovertext=_("play level!");

  states[0].callback = local_quit;
  states[2].callback = local_reset;
  states[10].callback = local_go;

  for(i=0;i<NUMBUTTONS;i++)
    states[i].position=0;

  states[0].position = 2; //center
  states[2].position = -2; //undeployed by default (redundant)
  states[10].position = 2; //center

  {
    buttonstate *b=states;
    b->x = b->x_target = w/2 - bw/2 + LEVEL_BUTTON_BORDER;
    b->y_active = h/2 + bh/2 - LEVEL_BUTTON_Y;
    b->y = b->y_target = b->y_inactive = b->y_active + BUTTON_EXPOSE;
    b->sweepdeploy = 0;
  }

  {
    buttonstate *b=states+2;
    b->x = b->x_target = w/2;
    b->y_active = h/2 + bh/2 - LEVEL_BUTTON_Y;
    b->y = b->y_target = b->y_inactive = b->y_active + BUTTON_EXPOSE;
    b->sweepdeploy = SWEEP_DELTA;
  }

  {
    buttonstate *b=states+10;
    b->x = b->x_target = w/2 + bw/2 - LEVEL_BUTTON_BORDER;
    b->y_active = h/2 + bh/2 - LEVEL_BUTTON_Y;
    b->y = b->y_target = b->y_inactive = b->y_active + BUTTON_EXPOSE;
    b->sweepdeploy = SWEEP_DELTA;
  }

  rollover_extents(g,states);  
  rollover_extents(g,states+2);  
  rollover_extents(g,states+10);  
}

static void draw_levelbox(Gameboard *g){
  int w= g->g.width;
  int h= g->g.height;

  cairo_t *c = cairo_create(g->background);
  borderbox_path(c,
		 w/2 - LEVELBOX_WIDTH/2,
		 h/2 - LEVELBOX_HEIGHT/2,
		 LEVELBOX_WIDTH,
		 LEVELBOX_HEIGHT);
  cairo_set_source_rgb(c,1,1,1);
  cairo_fill(c);

  centerbox(c,
	    w/2 - LEVELBOX_WIDTH/2,
	    h/2 - LEVELBOX_HEIGHT/2,
	    LEVELBOX_WIDTH,
	    SCOREHEIGHT);

  centerbox(c,
	    w/2 - LEVELBOX_WIDTH/2,
	    h/2 + LEVELBOX_HEIGHT/2 - SCOREHEIGHT,
	    LEVELBOX_WIDTH,
	    SCOREHEIGHT);

  set_font(c,18,18,0,1);
  cairo_set_source_rgba (c, TEXT_COLOR);
  
  render_text_centered(c,_("Available Levels"), w/2,h/2-LEVELBOX_HEIGHT/2+SCOREHEIGHT/2);

  cairo_destroy(c);
}

void level_dialog(Gameboard *g, int advance){

  g->level_dialog_active=1;
  levelstate_write();

  if(advance)
    levelstate_next();

  // set up new buttons
  setup_level_buttons(g,LEVELBOX_WIDTH, LEVELBOX_HEIGHT);
  level_icons_init(g);

  // draw pausebox
  push_curtain(g,draw_levelbox);

  // deploy new buttons
  deploy_buttons(g,0);
}