Source: src/cl_stage.cc


Annotated List
Files
Globals
Hierarchy
Index
//stage class - control room list and display required content

#include "cl_stage.h"

void STAGE::init()
{	
	int i;
	scr = NULL;
	for(i=0;i!=ROOM_LAYERS;i++) {
		layer[i] = NULL;
		empty_layer[i] = 1;
	}
	canvas_w = canvas_h = 0;
	tile_w = tile_h = 0;
	tile_cw = tile_ch = 0;
	rooms = NULL;
	layers_exists = 0;
	rn = "";
//	data = NULL;
}


void STAGE::canvas(BITMAP *b)
{
	scr = b;
	canvas_w = b->w;
	canvas_h = b->h;
}

void STAGE::connect_rooms(MI_ROOM *d)
{
	rooms = d;
}

void STAGE::connect_data(DATADISC *d)
{
	disk = d;
	if(d) {
		message("Data source connected");
	}
}
/*
void STAGE::connect_data(MI_DATASRC *d)
{
	data = d;
}
*/

void STAGE::clear_layer(int i)
{
	if(i == FOREGROUND_LAYER) {
		clear_to_color(layer[i], COL_TRANS);
	} else {
		clear_bitmap(layer[i]);
	}
}

void STAGE::create_layers()
{
	int i;
	destroy_layers();
	for(i=0;i!=ROOM_LAYERS;i++) {
		layer[i] = create_bitmap(canvas_w, canvas_h);
		clear_layer(i);
	}
	layers_exists = 1;
}

void STAGE::destroy_layers()
{
	int i;
	for(i=0;i!=ROOM_LAYERS;i++) {
		destroy_bitmap_safe(layer[i],"Detroy layer");
		layer[i] = NULL;
	}
}


int STAGE::draw()
{
	if(!scr){
		error("No screenbuffer defined!");
		return 1;
	}
	if(!layer[DISPLAY_LAYER]) {
		error("No layer 0 defined");
		return 1;
	}

	if((canvas_w) && (canvas_h)) {
		blit(layer[DISPLAY_LAYER], scr, 0, 0, 0, 0, canvas_w, 
			canvas_h);
//		message("Blit size [%i, %i]", canvas_w, canvas_h);
	} else {
		error("Drawing map with zero size");
	}
	return 0;
}


int STAGE::draw_foreground()
{
	if(!empty_layer[FOREGROUND_LAYER]) {
		draw_sprite(scr,layer[FOREGROUND_LAYER],  0,0);
		return 1;
		//FIXME - small optimization would be good
	}
	return 0;
}

int STAGE::select(string name)
{
	if(rooms->select(name)) {
		render();
		return 1;
	}
	rn = name;
	return 0;
}

string STAGE::room_name()
{
	message("RN [%s]", rn.c_str());
	return rn;
}

int STAGE::render_internal(int l,int x, int y)
{
	if(!disk) {
		error("No datasource connected to stage");
		return 0;
	}
//	tile_w = rooms->tile_w();
//	tile_h = rooms->tile_h();
	tile_w = tile_h = 16;	//FIXME - fixed size of tiles is not good
	if((!tile_w) || (!tile_h)) {
		message("Zero size of tiles! Seems strange to display so small tiles");
		return 0;
	}
	int t = rooms->tile(l,x+y*tile_cw);
	blit(disk->gettexture(t), layer[l],
			0, 0, x*tile_w, y*tile_h, 
			tile_w, tile_h);
//	blit(disk->gettexture(t), screen, 0,0, 0,0, 16, 16
//	message("Render info [%i, %i, %i, %i]",  x*tile_w, y*tile_h,  tile_w, tile_h);
/*	if(t) {
		message("Rendering [%i, %i, %i] -> %i", l, x, y, t);
	}*/

	if(t) {
		return 1;
	} else {
		return 0;
	}

}
	
void STAGE::render_layer(int l)
{
	int a,b;

	clear_layer( l );
	empty_layer[l] = 1;
	
	tile_cw = rooms->tile_cw();
	tile_ch = rooms->tile_ch();
	
	for(a = 0; a != tile_ch; a++) {
		for(b = 0; b != tile_cw; b++) {
			if(render_internal(l,b,a)) {
				empty_layer[l] = 0;
			}
		}
	}
}

void STAGE::merge_layer(int src, int dst)
{
	draw_sprite(layer[dst], layer[src], 0,0);
}

void STAGE::render()
{
	int i;
	for(i=0;i!=ROOM_LAYERS;i++){
		render_layer(i);
/*		message("Visualization of layer [%i], dimension [%i, %i]", i, layer[i]->w, layer[i]->h);
		blit(layer[i], screen, 0,0,0,0,640,480);
		sleep(3);*/
	}	
	merge_layer(1,DISPLAY_LAYER); 	//for faster rendering on screen we merge
				//middle layer with background
//	merge_layer(FOREGROUND_LAYER, DISPLAY_LAYER); //test if fg is ok
}

int STAGE::walkable(int x, int y)
{	
	int p;
	p = getpixel(layer[1], x, y);
	if(p == COL_TRANS) {
		return TEX_WALKABLE;
	} else {
		return TEX_SOLID;
	}
}

void STAGE::tile_list()
{
	int z;
	int i,l,c,j;

	l = 0;
	z = rooms->zero();
	c = tile_count();
	j = 0;
	for(i = 0; i != c; i++) {
		blit(disk->gettexture(i), screen, 0, 0, l, j*16, 16, 16);
		textprintf(screen, font, l+16, j*16, COL_WHITE, "[%c]", i+z);
		rect(screen, l+16, j*16, 16, 16, COL_BLACK);
		j++;
		if(j*16>SCREEN_SIZE_Y) {
			j = 0;
			l += 32;
		}
	}
}


int STAGE::tile_count()
{
	return disk->texture_count();
}

Generated by: georgik on armada on Sat Jul 24 07:07:15 2004, using kdoc 2.0a54.