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; }
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); }
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; }
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; }
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); }