Ejemplo n.º 1
0
int __open_level(struct level *self, struct layout *layout)
{
	int i;
	struct place* places[2];
	for (i = 0; i < b6_card_of(self->places); i += 1) {
		struct place *place = &self->places[i];
		initialize_place(self, layout, place);
		self->nplaces += !!place->item;
	}
	places[0] = self->items->teleport[0].place;
	places[1] = self->items->teleport[1].place;
	if (places[0] && places[1]) {
		self->items->teleport[0].place = places[1];
		self->items->teleport[1].place = places[0];
		if (places[0]->item != &self->items->teleport[0].item)
			dispose_item(&self->items->teleport[0].item);
		if (places[1]->item != &self->items->teleport[1].item)
			dispose_item(&self->items->teleport[1].item);
	} else if (places[0]) {
		int x, y;
		place_location(self, places[0], &x, &y);
		log_w("ignored single teleport at (%d,%d).", x, y);
		dispose_item(places[0]->item);
		places[0]->item = clone_empty(self->items);
	}
	b6_assert(!places[1] || (places[1] && places[0]));
	recover_ghosts_den(self, layout);
	if (self->pacman_home)
		return 0;
	__close_level(self);
	return -1;
}
Ejemplo n.º 2
0
static void on_key_pressed(struct controller_observer *observer,
			   enum controller_key key)
{
	struct hall_of_fame_phase *self = b6_cast_of(
		observer, struct hall_of_fame_phase, controller_observer);
	if (self->quit)
		return;
	if (!self->entry) {
		quit_phase(self);
		return;
	}
	if (key == CTRLK_RETURN || key == CTRLK_ENTER || key == CTRLK_ESCAPE) {
		quit_phase(self);
		return;
	}
	if (key != CTRLK_DELETE && key != CTRLK_BACKSPACE)
		return;
	if (b6_utf8_is_empty(&self->name.utf8))
		return;
	b6_assert(self->cursor_base);
	move_renderer_base(self->cursor_base, self->cursor_base->x - 16,
			   self->cursor_base->y);
	self->name.utf8.nchars -= 1; // FIXME: add crop API
	self->name.utf8.nbytes -= 1; // FIXME: add crop API
	alter_hall_of_fame_entry(self->entry, &self->name.utf8);
	setup_label(self, self->rank, self->entry);
}
Ejemplo n.º 3
0
long long int read_ioring(struct istream *is, void *buf,
			  unsigned long long int len)
{
	struct ioring *self = b6_cast_of(is, struct ioring, istream);
	const void *ptr = rget_ioring(self, &len);
	if (ptr) {
		int error;
		memcpy(buf, ptr, len);
		error = rput_ioring(self, len);
		b6_assert(!error);
		b6_unused(error);
	}
	return len;
}
Ejemplo n.º 4
0
long long int write_ioring(struct ostream *os, const void *buf,
			   unsigned long long int len)
{
	struct ioring *self = b6_cast_of(os, struct ioring, ostream);
	void *ptr = wget_ioring(self, &len);
	if (ptr) {
		int error;
		memcpy(ptr, buf, len);
		error = wput_ioring(self, len);
		b6_assert(!error);
		b6_unused(error);
	}
	return len;
}
Ejemplo n.º 5
0
static void on_text_input(struct controller_observer *observer,
			  unsigned short int unicode)
{
	struct hall_of_fame_phase *self = b6_cast_of(
		observer, struct hall_of_fame_phase, controller_observer);
	if (self->quit)
		return;
	if (!self->entry) {
		quit_phase(self);
		return;
	}
	if (unicode < 32)
		return;
	if (unicode > 127)
		return;
	if (self->name.utf8.nchars >= 16)
		return;
	b6_append_utf8_string(&self->name, unicode);
	b6_assert(self->cursor_base);
	move_renderer_base(self->cursor_base,
			   self->cursor_base->x + 16, self->cursor_base->y);
	alter_hall_of_fame_entry(self->entry, &self->name.utf8);
	setup_label(self, self->rank, self->entry);
}