git repos / blockattack-game

source/code/theme_editor/ThemeEditorState.hpp

browsing at commit = 727f4a095b4b10d630e54a3ea673343725bd7186

raw · blame · history

/*
===========================================================================
blockattack - Block Attack - Rise of the Blocks
Copyright (C) 2005-2026 Poul Sander

This program 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 of the License, or
(at your option) any later version.

This program 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 this program.  If not, see http://www.gnu.org/licenses/

Source information and contacts persons can be found at
https://blockattack.net
===========================================================================
*/

#pragma once

#include "../global.hpp"
#include "../sago/GameStateInterface.hpp"
#include "../themes.hpp"
#include <string>
#include <vector>
#include <memory>

class BlockGameSdl;

class ThemeEditorState : public sago::GameStateInterface {
public:
	ThemeEditorState();
	ThemeEditorState(const ThemeEditorState& orig) = delete;
	virtual ~ThemeEditorState();

	void Init();

	bool IsActive() override;
	void ProcessInput(const SDL_Event& event, bool& processed) override;
	void Draw(SDL_Renderer* target) override;
	void Update() override;

private:
	void DrawBorderEditor();
	void DrawBackgroundEditor();
	void DrawThemeComposer();
	void DrawPreview(SDL_Renderer* target);

	void SaveCurrentBorder();
	void SaveCurrentBackground();
	void SaveCurrentTheme();

	void LoadBorder(const std::string& name);
	void LoadBackground(const std::string& name);

	bool ValidateSprite(const std::string& sprite_name);
	std::vector<std::string> GetAvailableSprites();

	bool isActive = true;
	int current_tab = 0; // 0=Border, 1=Background, 2=Theme

	// Border editor state
	ThemeBorderData current_border;
	char border_name_buffer[256] = "";
	char border_sprite_buffer[256] = "board_back_back";
	int border_offset_x = -60;
	int border_offset_y = -68;
	int score_offset_x = 310;
	int score_offset_y = 80;
	int time_offset_x = 310;
	int time_offset_y = 129;
	int chain_offset_x = 310;
	int chain_offset_y = 178;
	int speed_offset_x = 310;
	int speed_offset_y = 227;
	int score_field_x = 310;
	int score_field_y = 102;
	int time_field_x = 310;
	int time_field_y = 151;
	int chain_field_x = 310;
	int chain_field_y = 200;
	int speed_field_x = 310;
	int speed_field_y = 249;

	// Background editor state
	BackGroundData current_background;
	char background_name_buffer[256] = "";
	char background_sprite_buffer[256] = "background";
	char background_sprite_16x9_buffer[256] = "background_sixteen_nine";
	int background_scale_mode = 0; // 0=Stretch, 1=Tile, 2=Resize, 3=Cut
	int tile_move_speed_x = 0;
	int tile_move_speed_y = 0;

	// Theme composer state
	char theme_name_buffer[256] = "custom_theme";
	int selected_border_index = 0;
	int selected_background_index = 0;
	int selected_decoration_index = 0;
	int selected_board_background = 0; // 0=back_board, 1=back_board_sample_snow, 2=trans_cover
	std::vector<std::string> border_names;
	std::vector<std::string> background_names;
	std::vector<std::string> decoration_names;
	const std::vector<std::string> board_backgrounds = {"back_board", "back_board_sample_snow", "trans_cover"};

	// Preview
	std::shared_ptr<BlockGameSdl> preview_game;
	Theme preview_theme;
	Theme saved_theme;  // Backup of the global theme
	bool preview_needs_update = true;
	void UpdatePreview();
};