diff libmlk-adventure/adventure/state/mainmenu.c @ 259:16be1ad3ddba

adventure: start working on maps and teleport
author David Demelier <markand@malikania.fr>
date Sun, 06 Dec 2020 11:22:03 +0100
parents 71b3b7036de7
children bfde372bf152
line wrap: on
line diff
--- a/libmlk-adventure/adventure/state/mainmenu.c	Sat Dec 05 15:57:02 2020 +0100
+++ b/libmlk-adventure/adventure/state/mainmenu.c	Sun Dec 06 11:22:03 2020 +0100
@@ -43,7 +43,9 @@
 #include "mainmenu.h"
 #include "molko.h"
 
-struct mainmenu {
+struct self {
+	struct state state;
+
 	struct {
 		struct texture tex;
 		int x;
@@ -56,21 +58,7 @@
 static void
 new(void)
 {
-	/* TODO: implement here. */
-	if (!map_file_open(&molko.map_file, &molko.map, DIRECTORY "/maps/overworld.map"))
-		panic();
-
-	/* Put a sprite. */
-	if (!image_open(&molko.map_player_texture, DIRECTORY "/sprites/john.png"))
-		panic();
-
-	sprite_init(&molko.map_player_sprite, &molko.map_player_texture, 48, 48);
-	molko.map.player_sprite = &molko.map_player_sprite;
-
-	if (!map_init(&molko.map))
-		panic();
-
-	game_switch(&molko.states[MOLKO_STATE_MAP], false);
+	molko_teleport("assets/maps/map-world.map", -1, -1);
 }
 
 static void
@@ -86,9 +74,9 @@
 }
 
 static void
-perform(struct mainmenu *main)
+perform(struct self *self)
 {
-	assert(main->itemsel < 3);
+	assert(self->itemsel < 3);
 
 	static void (*handlers[])(void) = {
 		[0] = new,
@@ -96,57 +84,54 @@
 		[2] = quit
 	};
 
-	handlers[main->itemsel]();
+	handlers[self->itemsel]();
 }
 
 static void
-init_title(struct mainmenu *main, struct font *font)
+init_title(struct self *self, struct font *font)
 {
-	if (!font_render(font, &main->texts[3].tex, "Molko's Adventure", 0x000000ff))
+	if (!font_render(font, &self->texts[3].tex, "Molko's Adventure", 0x000000ff))
 		panic();
 	
 	/* Align header. */
-	align(ALIGN_CENTER, &main->texts[3].x, NULL, main->texts[3].tex.w, main->texts[3].tex.h,
+	align(ALIGN_CENTER, &self->texts[3].x, NULL, self->texts[3].tex.w, self->texts[3].tex.h,
 	    0, 0, window.w, window.h);
 
-	main->texts[3].y = main->texts[3].x;
+	self->texts[3].y = self->texts[3].x;
 }
 
 static void
-init_items(struct mainmenu *main, struct font *font)
+init_items(struct self *self, struct font *font)
 {
-	if (!font_render(font, &main->texts[0].tex, _("New"), 0x000000ff) ||
-	    !font_render(font, &main->texts[1].tex, _("Continue"), 0x000000ff) ||
-	    !font_render(font, &main->texts[2].tex, _("Quit"), 0x000000ff))
+	if (!font_render(font, &self->texts[0].tex, _("New"), 0x000000ff) ||
+	    !font_render(font, &self->texts[1].tex, _("Continue"), 0x000000ff) ||
+	    !font_render(font, &self->texts[2].tex, _("Quit"), 0x000000ff))
 		panic();
 
-	main->texts[0].x = (window.w / 2) - (main->texts[0].tex.w / 2);
-	main->texts[0].y = window.h * 0.75;
+	self->texts[0].x = (window.w / 2) - (self->texts[0].tex.w / 2);
+	self->texts[0].y = window.h * 0.75;
 
-	main->texts[1].x = main->texts[0].x;
-	main->texts[1].y = main->texts[0].y + main->texts[0].tex.h;
+	self->texts[1].x = self->texts[0].x;
+	self->texts[1].y = self->texts[0].y + self->texts[0].tex.h;
 
-	main->texts[2].x = main->texts[0].x;
-	main->texts[2].y = main->texts[1].y + main->texts[1].tex.h;
+	self->texts[2].x = self->texts[0].x;
+	self->texts[2].y = self->texts[1].y + self->texts[1].tex.h;
 }
 
 static void
 start(struct state *state)
 {
-	struct mainmenu *main;
+	struct self *self = state->data;
 	struct font fonts[2];
 
-	/* Allocate the main menu data. */
-	main = (state->data = alloc_new0(sizeof (*main)));
-
 	if (!font_openmem(&fonts[0], fonts_teutonic, sizeof (fonts_teutonic), 130) ||
 	    !font_openmem(&fonts[1], fonts_pirata_one, sizeof (fonts_pirata_one), 30))
 		panic();
 
 	fonts[0].style = fonts[1].style = FONT_STYLE_ANTIALIASED;
 
-	init_title(main, &fonts[0]);
-	init_items(main, &fonts[1]);
+	init_title(self, &fonts[0]);
+	init_items(self, &fonts[1]);
 
 	font_finish(&fonts[0]);
 	font_finish(&fonts[1]);
@@ -155,19 +140,19 @@
 static void
 handle(struct state *state, const union event *event)
 {
-	struct mainmenu *main = state->data;
+	struct self *self = state->data;
 
 	switch (event->type) {
 	case EVENT_KEYDOWN:
 		switch (event->key.key) {
 		case KEY_UP:
-			main->itemsel = main->itemsel == 0 ? 2 : main->itemsel - 1;
+			self->itemsel = self->itemsel == 0 ? 2 : self->itemsel - 1;
 			break;
 		case KEY_DOWN:
-			main->itemsel = (main->itemsel + 1) % 3;
+			self->itemsel = (self->itemsel + 1) % 3;
 			break;
 		case KEY_ENTER:
-			perform(main);
+			perform(self);
 			break;
 		default:
 			break;
@@ -181,45 +166,44 @@
 static void
 draw(struct state *state)
 {
-	struct mainmenu *main = state->data;
+	struct self *self = state->data;
 
 	painter_set_color(0xffffffff);
 	painter_clear();
 
-	for (size_t i = 0; i < NELEM(main->texts); ++i)
-		texture_draw(&main->texts[i].tex, main->texts[i].x, main->texts[i].y);
+	for (size_t i = 0; i < NELEM(self->texts); ++i)
+		texture_draw(&self->texts[i].tex, self->texts[i].x, self->texts[i].y);
 
 	/* TODO: a sword here. */
 	painter_set_color(0x000000ff);
 	painter_draw_rectangle(
-	    main->texts[main->itemsel].x - 30,
-	    main->texts[main->itemsel].y + 11, 15, 15);
+	    self->texts[self->itemsel].x - 30,
+	    self->texts[self->itemsel].y + 11, 15, 15);
 	painter_present();
 }
 
 static void
 finish(struct state *state)
 {
-	struct mainmenu *main = state->data;
-
-	if (!main)
-		return;
+	struct self *self = state->data;
 
-	for (size_t i = 0; i < NELEM(main->texts); ++i)
-		texture_finish(&main->texts[i].tex);
+	for (size_t i = 0; i < NELEM(self->texts); ++i)
+		texture_finish(&self->texts[i].tex);
 
-	free(main);
-	memset(state, 0, sizeof (*state));
+	free(self);
 }
 
-void
-mainmenu_state(struct state *state)
+struct state *
+mainmenu_state_new(void)
 {
-	assert(state);
+	struct self *self;
 
-	memset(state, 0, sizeof (*state));
-	state->start = start;
-	state->handle = handle;
-	state->draw = draw;
-	state->finish = finish;
+	self = alloc_new0(sizeof (*self));
+	self->state.data = self;
+	self->state.start = start;
+	self->state.handle = handle;
+	self->state.draw = draw;
+	self->state.finish = finish;
+
+	return &self->state;
 }