From 0c0d28ab367cf2dadbfae20f0ea7f877ae6b2397 Mon Sep 17 00:00:00 2001 From: Leo Firmin Date: Mon, 27 Oct 2025 23:12:49 +0100 Subject: [PATCH] github to gitea --- Makefile | 187 ++++ assets/bookshelf.xpm | 901 +++++++++++++++++++ assets/bookshelf_01.xpm | 686 +++++++++++++++ assets/bookshelf_02.xpm | 821 ++++++++++++++++++ assets/bookshelf_03.xpm | 753 ++++++++++++++++ assets/cobblestone.xpm | 124 +++ assets/cobblestone_01.xpm | 124 +++ assets/cobblestone_02.xpm | 124 +++ assets/cyan_concrete.xpm | 79 ++ assets/e.xpm | 37 + assets/mossy_cobblestone1.xpm | 1097 ++++++++++++++++++++++++ assets/n.xpm | 37 + assets/s.xpm | 37 + assets/test/east.xpm | 37 + assets/test/north.xpm | 37 + assets/test/south.xpm | 37 + assets/test/west.xpm | 37 + assets/w.xpm | 37 + cub3d.h | 68 -- gnl/Makefile | 60 ++ gnl/include/get_next_line.h | 32 + gnl/readme.md | 41 + gnl/srcs/get_next_line.c | 109 +++ gnl/srcs/get_next_line_utils.c | 106 +++ includes/cub.h | 64 ++ includes/exec.h | 157 ++++ includes/keys.h | 35 + includes/parsing.h | 89 ++ input.c | 46 - libft/Makefile | 68 ++ libft/Readme.md | 55 ++ libft/include/libft.h | 93 ++ libft/srcs/ft_arrcpy.c | 41 + libft/srcs/ft_atoi.c | 40 + libft/srcs/ft_atoll.c | 38 + libft/srcs/ft_bzero.c | 24 + libft/srcs/ft_calloc.c | 31 + libft/srcs/ft_isalnum.c | 19 + libft/srcs/ft_isalpha.c | 19 + libft/srcs/ft_isascii.c | 19 + libft/srcs/ft_isdigit.c | 19 + libft/srcs/ft_isprint.c | 19 + libft/srcs/ft_itoa.c | 51 ++ libft/srcs/ft_lstadd_back_bonus.c | 27 + libft/srcs/ft_lstadd_front_bonus.c | 21 + libft/srcs/ft_lstclear_bonus.c | 28 + libft/srcs/ft_lstdelone_bonus.c | 20 + libft/srcs/ft_lstiter_bonus.c | 23 + libft/srcs/ft_lstlast_bonus.c | 23 + libft/srcs/ft_lstmap_bonus.c | 41 + libft/srcs/ft_lstnew_bonus.c | 24 + libft/srcs/ft_lstsize_bonus.c | 27 + libft/srcs/ft_memchr.c | 26 + libft/srcs/ft_memcmp.c | 30 + libft/srcs/ft_memcpy.c | 32 + libft/srcs/ft_memmove.c | 39 + libft/srcs/ft_memset.c | 24 + libft/srcs/ft_putchar_fd.c | 17 + libft/srcs/ft_putendl_fd.c | 18 + libft/srcs/ft_putnbr_fd.c | 31 + libft/srcs/ft_putstr_fd.c | 24 + libft/srcs/ft_split.c | 95 ++ libft/srcs/ft_straddchar.c | 37 + libft/srcs/ft_strchr.c | 26 + libft/srcs/ft_strcmp.c | 22 + libft/srcs/ft_strcpy.c | 27 + libft/srcs/ft_strdup.c | 34 + libft/srcs/ft_striteri.c | 27 + libft/srcs/ft_strjoin.c | 34 + libft/srcs/ft_strlcat.c | 32 + libft/srcs/ft_strlcpy.c | 34 + libft/srcs/ft_strlen.c | 22 + libft/srcs/ft_strmapi.c | 32 + libft/srcs/ft_strncmp.c | 32 + libft/srcs/ft_strnstr.c | 36 + libft/srcs/ft_strrchr.c | 35 + libft/srcs/ft_strtrim.c | 68 ++ libft/srcs/ft_substr.c | 34 + libft/srcs/ft_tolower.c | 19 + libft/srcs/ft_toupper.c | 19 + main.c | 69 -- maps/bad/color_invalid_rgb.cub | 21 + maps/bad/color_missing.cub | 20 + maps/bad/color_missing_ceiling_rgb.cub | 21 + maps/bad/color_missing_floor_rgb.cub | 21 + maps/bad/color_none.cub | 18 + test => maps/bad/empty.cub | 0 maps/bad/file_letter_end.cub | 35 + maps/bad/filetype_missing | 21 + maps/bad/filetype_wrong.buc | 21 + maps/bad/map_only.cub | 13 + maps/bad/map_too_small.cub | 10 + maps/bad/player_multiple.cub | 21 + maps/bad/player_none.cub | 21 + maps/bad/player_on_edge.cub | 21 + maps/bad/textures_dir.cub | 21 + maps/bad/textures_duplicates.cub | 22 + maps/bad/textures_forbidden.cub | 21 + maps/bad/textures_invalid.cub | 21 + maps/bad/textures_missing.cub | 20 + maps/bad/textures_none.cub | 16 + maps/bad/textures_not_xpm.cub | 21 + maps/bad/wall_hole_east.cub | 21 + maps/bad/wall_hole_north.cub | 21 + maps/bad/wall_hole_south.cub | 21 + maps/bad/wall_hole_west.cub | 21 + maps/bad/wall_none.cub | 21 + maps/good/dungeon.cub | 18 + maps/good/library.cub | 22 + maps/good/test.cub | 29 + render.c | 140 --- srcs/exec/draw.c | 59 ++ srcs/exec/hooks.c | 66 ++ srcs/exec/image.c | 23 + srcs/exec/init.c | 55 ++ srcs/exec/loop.c | 25 + srcs/exec/player.c | 80 ++ srcs/exec/raycast.c | 243 ++++++ srcs/exec/textures.c | 53 ++ srcs/exec/world.c | 81 ++ srcs/main.c | 207 +++++ srcs/parsing/check_colors.c | 35 + srcs/parsing/check_file.c | 40 + srcs/parsing/check_map.c | 129 +++ srcs/parsing/check_map_2.c | 54 ++ srcs/parsing/get_map.c | 64 ++ srcs/parsing/get_map_2.c | 77 ++ srcs/parsing/get_textures.c | 91 ++ srcs/parsing/init_parsing.c | 56 ++ srcs/parsing/line_detect.c | 104 +++ srcs/parsing/parsing.c | 62 ++ srcs/utils/init.c | 35 + srcs/utils/utils.c | 70 ++ utils.c | 15 - 134 files changed, 9850 insertions(+), 338 deletions(-) create mode 100644 Makefile create mode 100644 assets/bookshelf.xpm create mode 100644 assets/bookshelf_01.xpm create mode 100644 assets/bookshelf_02.xpm create mode 100644 assets/bookshelf_03.xpm create mode 100644 assets/cobblestone.xpm create mode 100644 assets/cobblestone_01.xpm create mode 100644 assets/cobblestone_02.xpm create mode 100644 assets/cyan_concrete.xpm create mode 100644 assets/e.xpm create mode 100644 assets/mossy_cobblestone1.xpm create mode 100644 assets/n.xpm create mode 100644 assets/s.xpm create mode 100644 assets/test/east.xpm create mode 100644 assets/test/north.xpm create mode 100644 assets/test/south.xpm create mode 100644 assets/test/west.xpm create mode 100644 assets/w.xpm delete mode 100644 cub3d.h create mode 100644 gnl/Makefile create mode 100644 gnl/include/get_next_line.h create mode 100644 gnl/readme.md create mode 100644 gnl/srcs/get_next_line.c create mode 100644 gnl/srcs/get_next_line_utils.c create mode 100644 includes/cub.h create mode 100644 includes/exec.h create mode 100644 includes/keys.h create mode 100644 includes/parsing.h delete mode 100644 input.c create mode 100644 libft/Makefile create mode 100644 libft/Readme.md create mode 100644 libft/include/libft.h create mode 100644 libft/srcs/ft_arrcpy.c create mode 100644 libft/srcs/ft_atoi.c create mode 100644 libft/srcs/ft_atoll.c create mode 100644 libft/srcs/ft_bzero.c create mode 100644 libft/srcs/ft_calloc.c create mode 100644 libft/srcs/ft_isalnum.c create mode 100644 libft/srcs/ft_isalpha.c create mode 100644 libft/srcs/ft_isascii.c create mode 100644 libft/srcs/ft_isdigit.c create mode 100644 libft/srcs/ft_isprint.c create mode 100644 libft/srcs/ft_itoa.c create mode 100644 libft/srcs/ft_lstadd_back_bonus.c create mode 100644 libft/srcs/ft_lstadd_front_bonus.c create mode 100644 libft/srcs/ft_lstclear_bonus.c create mode 100644 libft/srcs/ft_lstdelone_bonus.c create mode 100644 libft/srcs/ft_lstiter_bonus.c create mode 100644 libft/srcs/ft_lstlast_bonus.c create mode 100644 libft/srcs/ft_lstmap_bonus.c create mode 100644 libft/srcs/ft_lstnew_bonus.c create mode 100644 libft/srcs/ft_lstsize_bonus.c create mode 100644 libft/srcs/ft_memchr.c create mode 100644 libft/srcs/ft_memcmp.c create mode 100644 libft/srcs/ft_memcpy.c create mode 100644 libft/srcs/ft_memmove.c create mode 100644 libft/srcs/ft_memset.c create mode 100644 libft/srcs/ft_putchar_fd.c create mode 100644 libft/srcs/ft_putendl_fd.c create mode 100644 libft/srcs/ft_putnbr_fd.c create mode 100644 libft/srcs/ft_putstr_fd.c create mode 100644 libft/srcs/ft_split.c create mode 100644 libft/srcs/ft_straddchar.c create mode 100644 libft/srcs/ft_strchr.c create mode 100644 libft/srcs/ft_strcmp.c create mode 100644 libft/srcs/ft_strcpy.c create mode 100644 libft/srcs/ft_strdup.c create mode 100644 libft/srcs/ft_striteri.c create mode 100644 libft/srcs/ft_strjoin.c create mode 100644 libft/srcs/ft_strlcat.c create mode 100644 libft/srcs/ft_strlcpy.c create mode 100644 libft/srcs/ft_strlen.c create mode 100644 libft/srcs/ft_strmapi.c create mode 100644 libft/srcs/ft_strncmp.c create mode 100644 libft/srcs/ft_strnstr.c create mode 100644 libft/srcs/ft_strrchr.c create mode 100644 libft/srcs/ft_strtrim.c create mode 100644 libft/srcs/ft_substr.c create mode 100644 libft/srcs/ft_tolower.c create mode 100644 libft/srcs/ft_toupper.c delete mode 100644 main.c create mode 100644 maps/bad/color_invalid_rgb.cub create mode 100644 maps/bad/color_missing.cub create mode 100644 maps/bad/color_missing_ceiling_rgb.cub create mode 100644 maps/bad/color_missing_floor_rgb.cub create mode 100644 maps/bad/color_none.cub rename test => maps/bad/empty.cub (100%) create mode 100644 maps/bad/file_letter_end.cub create mode 100644 maps/bad/filetype_missing create mode 100644 maps/bad/filetype_wrong.buc create mode 100644 maps/bad/map_only.cub create mode 100644 maps/bad/map_too_small.cub create mode 100644 maps/bad/player_multiple.cub create mode 100644 maps/bad/player_none.cub create mode 100644 maps/bad/player_on_edge.cub create mode 100644 maps/bad/textures_dir.cub create mode 100644 maps/bad/textures_duplicates.cub create mode 100644 maps/bad/textures_forbidden.cub create mode 100644 maps/bad/textures_invalid.cub create mode 100644 maps/bad/textures_missing.cub create mode 100644 maps/bad/textures_none.cub create mode 100644 maps/bad/textures_not_xpm.cub create mode 100644 maps/bad/wall_hole_east.cub create mode 100644 maps/bad/wall_hole_north.cub create mode 100644 maps/bad/wall_hole_south.cub create mode 100644 maps/bad/wall_hole_west.cub create mode 100644 maps/bad/wall_none.cub create mode 100644 maps/good/dungeon.cub create mode 100644 maps/good/library.cub create mode 100644 maps/good/test.cub delete mode 100644 render.c create mode 100644 srcs/exec/draw.c create mode 100644 srcs/exec/hooks.c create mode 100644 srcs/exec/image.c create mode 100644 srcs/exec/init.c create mode 100644 srcs/exec/loop.c create mode 100644 srcs/exec/player.c create mode 100644 srcs/exec/raycast.c create mode 100644 srcs/exec/textures.c create mode 100644 srcs/exec/world.c create mode 100644 srcs/main.c create mode 100644 srcs/parsing/check_colors.c create mode 100644 srcs/parsing/check_file.c create mode 100644 srcs/parsing/check_map.c create mode 100644 srcs/parsing/check_map_2.c create mode 100644 srcs/parsing/get_map.c create mode 100644 srcs/parsing/get_map_2.c create mode 100644 srcs/parsing/get_textures.c create mode 100644 srcs/parsing/init_parsing.c create mode 100644 srcs/parsing/line_detect.c create mode 100644 srcs/parsing/parsing.c create mode 100644 srcs/utils/init.c create mode 100644 srcs/utils/utils.c delete mode 100644 utils.c diff --git a/Makefile b/Makefile new file mode 100644 index 0000000..ba486ea --- /dev/null +++ b/Makefile @@ -0,0 +1,187 @@ +CC = gcc +CFLAGS = -Wall -Wextra -Werror +NAME = cub3d + +SRCDIR = srcs +INCDIR = includes +LIBFT = libft/libft.a +GNL = gnl/gnl.a +MLX_DIR = minilibx-linux +MLX = $(MLX_DIR)/libmlx_Linux.a +MLX_REPO = https://git.gasoff.ovh/lfirmin/mlx_42.git + +# Flags pour MLX (Linux) +MLX_FLAGS = -lXext -lX11 -lm + +# Couleurs +RED = \033[0;31m +GREEN = \033[0;32m +YELLOW = \033[0;33m +BLUE = \033[0;34m +MAGENTA = \033[0;35m +CYAN = \033[0;36m +WHITE = \033[0;37m +RESET = \033[0m +BOLD = \033[1m + +SRCS = \ + $(SRCDIR)/main.c \ + $(SRCDIR)/parsing/parsing.c \ + $(SRCDIR)/parsing/check_file.c \ + $(SRCDIR)/parsing/init_parsing.c \ + $(SRCDIR)/parsing/get_map.c \ + $(SRCDIR)/parsing/get_map_2.c \ + $(SRCDIR)/parsing/line_detect.c \ + $(SRCDIR)/parsing/get_textures.c \ + $(SRCDIR)/parsing/check_colors.c \ + $(SRCDIR)/parsing/check_map.c \ + $(SRCDIR)/parsing/check_map_2.c \ + $(SRCDIR)/utils/init.c \ + $(SRCDIR)/utils/utils.c \ + $(SRCDIR)/exec/draw.c \ + $(SRCDIR)/exec/hooks.c \ + $(SRCDIR)/exec/image.c \ + $(SRCDIR)/exec/init.c \ + $(SRCDIR)/exec/loop.c \ + $(SRCDIR)/exec/player.c \ + $(SRCDIR)/exec/raycast.c \ + $(SRCDIR)/exec/textures.c \ + $(SRCDIR)/exec/world.c + +# === Includes === +INCS = \ + $(INCDIR)/parsing.h \ + $(INCDIR)/cub.h \ + $(INCDIR)/exec.h \ + $(INCDIR)/keys.h + +# Animation de chargement +define loading_animation + @echo "$(1)" + @for i in 1 2 3 4 5 6 7 8 9 10; do \ + printf "$(CYAN)["; \ + for j in $$(seq 1 $$i); do printf "█"; done; \ + for j in $$(seq $$i 9); do printf " "; done; \ + printf "] $$(($$i * 10))%%$(RESET)\r"; \ + sleep 0.1; \ + done + @echo "" +endef + +all: + @echo "$(BOLD)$(MAGENTA)" + @echo "╔════════════════════════════════════════╗" + @echo "║ 🎮 CUB3D BUILD 🎮 ║" + @echo "╚════════════════════════════════════════╝" + @echo "$(RESET)" + @$(MAKE) -s $(NAME) + +$(MLX_DIR): + @echo "$(BOLD)$(CYAN)📦 Cloning MLX42...$(RESET)" + $(call loading_animation,$(YELLOW)⬇️ Downloading MLX42 library...) + @if [ ! -d "$(MLX_DIR)/.git" ]; then \ + rm -rf $(MLX_DIR) > /dev/null 2>&1; \ + git clone $(MLX_REPO) $(MLX_DIR) > /dev/null 2>&1; \ + fi + @echo "$(GREEN)✅ MLX42 cloned successfully!$(RESET)" + @echo "" + +$(MLX): $(MLX_DIR) + @echo "$(BOLD)$(BLUE)🔨 Building MLX42...$(RESET)" + $(call loading_animation,$(YELLOW)⚙️ Compiling MLX42...) + @$(MAKE) -s -C $(MLX_DIR) > /dev/null 2>&1 + @echo "$(GREEN)✅ MLX42 built successfully!$(RESET)" + @echo "" + +$(LIBFT): + @echo "$(BOLD)$(BLUE)📚 Building libft...$(RESET)" + @$(MAKE) -s -C libft > /dev/null 2>&1 & \ + PID=$$!; \ + for i in 1 2 3 4 5 6 7 8 9 10; do \ + printf "$(CYAN)["; \ + for j in $$(seq 1 $$i); do printf "█"; done; \ + for j in $$(seq $$i 9); do printf " "; done; \ + printf "] $$(($$i * 10))%%$(RESET)\r"; \ + sleep 0.1; \ + done; \ + wait $$PID; \ + echo "" + @echo "" + +$(GNL): + @echo "$(BOLD)$(BLUE)📚 Building gnl...$(RESET)" + @$(MAKE) -s -C gnl > /dev/null 2>&1 & \ + PID=$$!; \ + for i in 1 2 3 4 5 6 7 8 9 10; do \ + printf "$(CYAN)["; \ + for j in $$(seq 1 $$i); do printf "█"; done; \ + for j in $$(seq $$i 9); do printf " "; done; \ + printf "] $$(($$i * 10))%%$(RESET)\r"; \ + sleep 0.1; \ + done; \ + wait $$PID; \ + echo "" + @echo "" + +$(NAME): $(MLX) $(LIBFT) $(GNL) $(SRCS) $(INCS) + @echo "$(BOLD)$(BLUE)🎯 Building $(NAME)...$(RESET)" + $(call loading_animation,$(YELLOW)🚀 Compiling main executable...) + @$(CC) -g -I$(INCDIR) -I$(MLX_DIR)/include $(SRCS) -o $(NAME) $(LIBFT) $(GNL) $(MLX) $(MLX_FLAGS) + @echo "$(BOLD)$(GREEN)" + @echo "╔════════════════════════════════════════╗" + @echo "║ 🎉 BUILD SUCCESSFUL! 🎉 ║" + @echo "║ ║" + @echo "║ Your $(NAME) is ready to use! 🚀 ║" + @echo "╚════════════════════════════════════════╝" + @echo "$(RESET)" + +clean: + @echo "$(BOLD)$(YELLOW)" + @echo "╔════════════════════════════════════════╗" + @echo "║ 🧹 CLEANING UP 🧹 ║" + @echo "╚════════════════════════════════════════╝" + @echo "$(RESET)" + $(call loading_animation,$(YELLOW)🗑️ Cleaning object files...) + @rm -f $(NAME) + @make clean -s -C libft > /dev/null 2>&1 + @make clean -s -C gnl > /dev/null 2>&1 + @if [ -d "$(MLX_DIR)" ]; then make clean -s -C $(MLX_DIR) > /dev/null 2>&1; fi + @echo "$(GREEN)✅ Clean completed!$(RESET)" + +clean1: + @echo "$(CYAN)🗑️ Removing executable...$(RESET)" + @rm -f $(NAME) + @echo "$(GREEN)✅ Executable removed!$(RESET)" + +fclean: + @echo "$(BOLD)$(RED)" + @echo "╔════════════════════════════════════════╗" + @echo "║ 💣 DEEP CLEAN 💣 ║" + @echo "╚════════════════════════════════════════╝" + @echo "$(RESET)" + @$(MAKE) -s clean1 + $(call loading_animation,$(RED)🔥 Full cleanup in progress...) + @make fclean -s -C libft > /dev/null 2>&1 + @make fclean -s -C gnl > /dev/null 2>&1 + @if [ -d "$(MLX_DIR)/minilibx-linux" ]; then make fclean -s -C $(MLX_DIR)/minilibx-linux > /dev/null 2>&1; fi + @rm -rf $(MLX_DIR) + @echo "" + @echo "$(BOLD)$(GREEN)" + @echo "╔════════════════════════════════════════╗" + @echo "║ ✨ DEEP CLEAN COMPLETE! ✨ ║" + @echo "║ ║" + @echo "║ All files have been removed! 🗑️ ║" + @echo "╚════════════════════════════════════════╝" + @echo "$(RESET)" + +re: + @echo "$(BOLD)$(MAGENTA)" + @echo "╔════════════════════════════════════════╗" + @echo "║ 🔄 REBUILDING 🔄 ║" + @echo "╚════════════════════════════════════════╝" + @echo "$(RESET)" + @$(MAKE) -s fclean + @echo "" + @$(MAKE) -s all + +.PHONY: all clean fclean re clean1 \ No newline at end of file diff --git a/assets/bookshelf.xpm b/assets/bookshelf.xpm new file mode 100644 index 0000000..8251411 --- /dev/null +++ b/assets/bookshelf.xpm @@ -0,0 +1,901 @@ +/* XPM */ +static char * bookshelf_xpm[] = { +"64 64 834 2", +" c #9E7449", +". c #9D7348", +"+ c #865E35", +"@ c #9C7248", +"# c #885F37", +"$ c #764D25", +"% c #8C633B", +"& c #774E26", +"* c #784F27", +"= c #855C33", +"- c #754C24", +"; c #8B633A", +"> c #744C24", +", c #744B24", +"' c #734B24", +") c #976D43", +"! c #684321", +"~ c #603E1F", +"{ c #5F3E1F", +"] c #593A1E", +"^ c #58391E", +"/ c #55371E", +"( c #52351D", +"_ c #51351D", +": c #4B311C", +"< c #4D311C", +"[ c #482F1B", +"} c #452D1A", +"| c #453335", +"1 c #46508E", +"2 c #47549A", +"3 c #425095", +"4 c #3C4B8D", +"5 c #493B48", +"6 c #9B7247", +"7 c #986E44", +"8 c #412A1A", +"9 c #572C1D", +"0 c #A1302C", +"a c #A7312D", +"b c #A8312D", +"c c #AE322F", +"d c #AA312E", +"e c #9A2620", +"f c #97261F", +"g c #502A1A", +"h c #435298", +"i c #456CD0", +"j c #456CD1", +"k c #466ED2", +"l c #3B66CA", +"m c #2D5FC2", +"n c #3F4F90", +"o c #9B7248", +"p c #58391D", +"q c #402A19", +"r c #3F2C1C", +"s c #3F2F21", +"t c #3F3024", +"u c #3F2D1D", +"v c #A4302C", +"w c #DC363A", +"x c #DB3539", +"y c #CA2124", +"z c #C92023", +"A c #97251E", +"B c #472B1F", +"C c #532D2A", +"D c #5F3032", +"E c #7F3848", +"F c #6A3136", +"G c #512C26", +"H c #47539B", +"I c #598BDE", +"J c #4270CE", +"K c #3D5195", +"L c #9B7249", +"M c #534C3E", +"N c #2C6C70", +"O c #217377", +"P c #157D82", +"Q c #0F8389", +"R c #108288", +"S c #1B6D69", +"T c #296059", +"U c #37483F", +"V c #3F2918", +"W c #4A321A", +"X c #7B5A23", +"Y c #A87E2B", +"Z c #AC812C", +"` c #A47724", +" . c #785218", +".. c #A9352D", +"+. c #99251E", +"@. c #A84166", +"#. c #F05698", +"$. c #F15798", +"%. c #F25799", +"&. c #F25798", +"*. c #E54A87", +"=. c #E14782", +"-. c #9A5AAA", +";. c #598CDE", +">. c #5A8CDF", +",. c #3B559E", +"'. c #9B724B", +"). c #4B7271", +"!. c #01919A", +"~. c #019199", +"{. c #028382", +"]. c #027D78", +"^. c #2B5E58", +"/. c #3E2818", +"(. c #402A18", +"_. c #AF842D", +":. c #E1AB38", +"<. c #E4AD39", +"[. c #DAA02C", +"}. c #CE9119", +"|. c #D46E2D", +"1. c #E03B40", +"2. c #E44247", +"3. c #DE3A3E", +"4. c #98241E", +"5. c #B84572", +"6. c #F5589B", +"7. c #F55A9E", +"8. c #F666AA", +"9. c #F661A4", +"0. c #E94B89", +"a. c #E64885", +"b. c #AE5CB0", +"c. c #4B7372", +"d. c #2A5E58", +"e. c #3D2817", +"f. c #422C18", +"g. c #BB8D30", +"h. c #D09219", +"i. c #D6702D", +"j. c #E23F44", +"k. c #E7464C", +"l. c #DF3C41", +"m. c #982624", +"n. c #3B3033", +"o. c #3C2B24", +"p. c #3E2B1F", +"q. c #F65DA0", +"r. c #F872B8", +"s. c #F769AE", +"t. c #0198A0", +"u. c #01A6AD", +"v. c #019AA2", +"w. c #2B5F59", +"x. c #5A4E47", +"y. c #7F766F", +"z. c #6A5E57", +"A. c #C0923A", +"B. c #E7B841", +"C. c #E9BC43", +"D. c #E9BD44", +"E. c #DBA12D", +"F. c #935682", +"G. c #0781CA", +"H. c #0680C8", +"I. c #1E6196", +"J. c #3B2920", +"K. c #3C2717", +"L. c #3F322E", +"M. c #7C9FBB", +"N. c #7EA1BE", +"O. c #698197", +"P. c #B94B78", +"Q. c #F65CA0", +"R. c #3B559F", +"S. c #547573", +"T. c #019BA2", +"U. c #01B1B7", +"V. c #01A2A9", +"W. c #456C68", +"X. c #F5F6F6", +"Y. c #FBFBFB", +"Z. c #E7EDF8", +"`. c #E0C7A8", +" + c #E4AE3A", +".+ c #EBC248", +"++ c #ECC64A", +"@+ c #ECC549", +"#+ c #DBA22D", +"$+ c #C72126", +"%+ c #73669F", +"&+ c #0084CF", +"*+ c #0082CC", +"=+ c #0A70B1", +"-+ c #392C2B", +";+ c #3B2616", +">+ c #525962", +",+ c #97CAF1", +"'+ c #99CDF5", +")+ c #8DBCE2", +"!+ c #C687B6", +"~+ c #F55A9D", +"{+ c #395AAC", +"]+ c #9B734E", +"^+ c #466D68", +"/+ c #F9FAFA", +"(+ c #FEFFFF", +"_+ c #EAF1FD", +":+ c #E1CDBD", +"<+ c #ECC54A", +"[+ c #DCA430", +"}+ c #71679F", +"|+ c #0674B9", +"1+ c #382C2F", +"2+ c #3A2516", +"3+ c #3A2517", +"4+ c #7698B4", +"5+ c #A0D0F5", +"6+ c #A3D1F5", +"7+ c #84AED4", +"8+ c #BE648E", +"9+ c #F5599C", +"0+ c #52736E", +"a+ c #FAFBFA", +"b+ c #DCA530", +"c+ c #E03D42", +"d+ c #372B2F", +"e+ c #392415", +"f+ c #3E3533", +"g+ c #8FBCDF", +"h+ c #ABD5F7", +"i+ c #A5CDEE", +"j+ c #7BA0C2", +"k+ c #F76AAF", +"l+ c #5C7973", +"m+ c #FAFBFB", +"n+ c #EBC247", +"o+ c #E13E43", +"p+ c #0574B9", +"q+ c #362B2F", +"r+ c #372415", +"s+ c #596878", +"t+ c #99CBF2", +"u+ c #B5DAF8", +"v+ c #94BFE3", +"w+ c #66809B", +"x+ c #B74472", +"y+ c #F76CB1", +"z+ c #E94B8A", +"A+ c #5B7973", +"B+ c #E4AE39", +"C+ c #EAC046", +"D+ c #352A2E", +"E+ c #362314", +"F+ c #372417", +"G+ c #779AB7", +"H+ c #A2D1F6", +"I+ c #B3D8F6", +"J+ c #84ADD2", +"K+ c #4A4E58", +"L+ c #0198A1", +"M+ c #5A7973", +"N+ c #008ED3", +"O+ c #008DD0", +"P+ c #34292E", +"Q+ c #352214", +"R+ c #3D3738", +"S+ c #93C3E9", +"T+ c #ACD6F7", +"U+ c #A3CCEC", +"V+ c #7A9FC0", +"W+ c #392E2C", +"X+ c #B74372", +"Y+ c #01969F", +"Z+ c #557F7A", +"`+ c #DCA631", +" @ c #0098D6", +".@ c #0096D3", +"+@ c #33292E", +"@@ c #342113", +"#@ c #5C6E80", +"$@ c #99CCF2", +"%@ c #B5DAF7", +"&@ c #92BDE1", +"*@ c #657F9A", +"=@ c #352114", +"-@ c #3959AC", +";@ c #54807B", +">@ c #EABF45", +",@ c #32282D", +"'@ c #332012", +")@ c #342318", +"!@ c #799DBA", +"~@ c #A4D2F6", +"{@ c #B2D8F6", +"]@ c #83ACD1", +"^@ c #474A53", +"/@ c #F76DB2", +"(@ c #E94C8A", +"_@ c #53807B", +":@ c #0474B9", +"<@ c #31272D", +"[@ c #321F12", +"}@ c #3B373A", +"|@ c #94C6EC", +"1@ c #A2CAEB", +"2@ c #799DBE", +"3@ c #362C2A", +"4@ c #F76FB4", +"5@ c #3859AC", +"6@ c #4C7974", +"7@ c #DF3B40", +"8@ c #E34046", +"9@ c #0097D4", +"0@ c #30272D", +"a@ c #311E11", +"b@ c #627B90", +"c@ c #9ACCF3", +"d@ c #91BBE0", +"e@ c #637E99", +"f@ c #311E12", +"g@ c #B74272", +"h@ c #F871B7", +"i@ c #F76EB3", +"j@ c #01B0B6", +"k@ c #3F706B", +"l@ c #009AD5", +"m@ c #0475B9", +"n@ c #2F262D", +"o@ c #32221A", +"p@ c #7BA0BE", +"q@ c #A5D2F6", +"r@ c #B1D8F6", +"s@ c #42434B", +"t@ c #301E10", +"u@ c #B74271", +"v@ c #E84B89", +"w@ c #01939B", +"x@ c #3F6F6B", +"y@ c #2E262D", +"z@ c #3A383D", +"A@ c #96C8EF", +"B@ c #A2C9E9", +"C@ c #769ABA", +"D@ c #332827", +"E@ c #2F1D10", +"F@ c #F5589A", +"G@ c #3E5EAF", +"H@ c #9B734F", +"I@ c #008FD1", +"J@ c #2D252D", +"K@ c #647E94", +"L@ c #98CCF3", +"M@ c #9DCFF5", +"N@ c #8DB9DE", +"O@ c #617B95", +"P@ c #2E1C10", +"Q@ c #2E1C0F", +"R@ c #B64271", +"S@ c #4462B2", +"T@ c #9C7350", +"U@ c #3E6F6B", +"V@ c #72679F", +"W@ c #2E2A32", +"X@ c #7CA3C1", +"Y@ c #98CBF3", +"Z@ c #81AAD0", +"`@ c #3C3C43", +" # c #2D1B0F", +".# c #3A66CA", +"+# c #C82024", +"@# c #8A639B", +"## c #0374B9", +"$# c #373D4A", +"%# c #8FBFE6", +"&# c #7193B2", +"*# c #2F2421", +"=# c #2B1A0E", +"-# c #4462B1", +";# c #9C734F", +"># c #936299", +",# c #65849E", +"'# c #98CCF4", +")# c #99CCF4", +"!# c #88B5DC", +"~# c #5E7790", +"{# c #2A190E", +"]# c #B64171", +"^# c #4F64A9", +"/# c #9C744E", +"(# c #3E6F6A", +"_# c #0E76BB", +":# c #7EA7C9", +"<# c #97CAF2", +"[# c #80AACF", +"}# c #35343A", +"|# c #29190D", +"1# c #5465A6", +"2# c #9C744D", +"3# c #1979BD", +"4# c #8BB9DE", +"5# c #8EBEE5", +"6# c #6E8EAC", +"7# c #2B201D", +"8# c #28180D", +"9# c #29180D", +"0# c #B54271", +"a# c #F4589A", +"b# c #F3599A", +"c# c #F35899", +"d# c #E74C87", +"e# c #E44A83", +"f# c #AE5DAE", +"g# c #496CCE", +"h# c #4B6CCE", +"i# c #4B6CCD", +"j# c #4366C6", +"k# c #3860BF", +"l# c #5966A3", +"m# c #597571", +"n# c #209098", +"o# c #209097", +"p# c #208280", +"q# c #247C74", +"r# c #4A6E64", +"s# c #ECE7E3", +"t# c #F0EBE7", +"u# c #DCDADD", +"v# c #D0B7A0", +"w# c #D29F3E", +"x# c #CF9C3F", +"y# c #CC9940", +"z# c #C59038", +"A# c #BE8730", +"B# c #BF743A", +"C# c #C05B42", +"D# c #B6573A", +"E# c #B5573A", +"F# c #996C7A", +"G# c #737C9F", +"H# c #737B9D", +"I# c #73748F", +"J# c #795E4B", +"K# c #82726B", +"L# c #949AA8", +"M# c #84797A", +"N# c #765535", +"O# c #795736", +"P# c #7B5937", +"Q# c #A46258", +"R# c #C36A6F", +"S# c #BE6B69", +"T# c #B86D63", +"U# c #B06C59", +"V# c #AA6E54", +"W# c #9F705C", +"X# c #927364", +"Y# c #997359", +"Z# c #9C7455", +"`# c #9B7354", +" $ c #9B7353", +".$ c #8C633A", +"+$ c #845B33", +"@$ c #9A734A", +"#$ c #9B754F", +"$$ c #9B754E", +"%$ c #9B754C", +"&$ c #9B744B", +"*$ c #9C744A", +"=$ c #A27A54", +"-$ c #A27B55", +";$ c #A17952", +">$ c #A0764C", +",$ c #A07549", +"'$ c #9F7549", +")$ c #9F7449", +"!$ c #91683E", +"~$ c #8A6139", +"{$ c #8F663C", +"]$ c #8F663D", +"^$ c #92693F", +"/$ c #946A40", +"($ c #966C42", +"_$ c #7F562E", +":$ c #90663D", +"<$ c #6E4823", +"[$ c #6E4723", +"}$ c #6B4622", +"|$ c #694421", +"1$ c #654221", +"2$ c #644121", +"3$ c #734E2C", +"4$ c #9C7247", +"5$ c #634020", +"6$ c #4A311C", +"7$ c #452D1B", +"8$ c #442D1A", +"9$ c #432C1A", +"0$ c #432F2F", +"a$ c #434C85", +"b$ c #44539A", +"c$ c #415197", +"d$ c #394B8E", +"e$ c #3E3955", +"f$ c #422C1B", +"g$ c #422C1A", +"h$ c #7A5837", +"i$ c #412B1A", +"j$ c #412D20", +"k$ c #3F3336", +"l$ c #34495F", +"m$ c #2E5D8A", +"n$ c #2D6499", +"o$ c #2D6397", +"p$ c #305071", +"q$ c #3A3A44", +"r$ c #402E27", +"s$ c #435297", +"t$ c #466DD1", +"u$ c #3F69CD", +"v$ c #2E5FC2", +"w$ c #3157AA", +"x$ c #492E2A", +"y$ c #5A2C1E", +"z$ c #822F26", +"A$ c #9B302B", +"B$ c #A2302C", +"C$ c #7A281E", +"D$ c #562A1B", +"E$ c #7C5937", +"F$ c #3F3023", +"G$ c #393F37", +"H$ c #334C47", +"I$ c #3C3629", +"J$ c #402A1A", +"K$ c #422D1D", +"L$ c #54473F", +"M$ c #564841", +"N$ c #6C5F57", +"O$ c #827871", +"P$ c #827870", +"Q$ c #635751", +"R$ c #50433F", +"S$ c #47352C", +"T$ c #30577E", +"U$ c #0881CA", +"V$ c #0283CC", +"W$ c #0084CE", +"X$ c #017BC2", +"Y$ c #2D5988", +"Z$ c #43539A", +"`$ c #4870D3", +" % c #5585DC", +".% c #406ACE", +"+% c #2F5BB7", +"@% c #A3333B", +"#% c #D83639", +"$% c #DA363A", +"%% c #DB363A", +"&% c #C82124", +"*% c #C42123", +"=% c #9B5739", +"-% c #5F3D1F", +";% c #3E2D1F", +">% c #1C797E", +",% c #069098", +"'% c #03969D", +")% c #0C7A76", +"!% c #3A3629", +"~% c #857D78", +"{% c #F7F7F7", +"]% c #FAFAFA", +"^% c #FBFCFB", +"/% c #EBF0F9", +"(% c #D9E3F7", +"_% c #9FA2AE", +":% c #522C29", +"<% c #5D2F30", +"[% c #733540", +"}% c #753541", +"|% c #5A2D2B", +"1% c #4D2B23", +"2% c #007CC3", +"3% c #0076BC", +"4% c #2C5A8A", +"5% c #42539A", +"6% c #4871D3", +"7% c #2E5DBE", +"8% c #A6333E", +"9% c #DE383D", +"0% c #C82023", +"a% c #AD5739", +"b% c #5E3D1F", +"c% c #3D2F23", +"d% c #0E8389", +"e% c #01AFB5", +"f% c #067E7A", +"g% c #36392D", +"h% c #B3B0AE", +"i% c #FDFEFE", +"j% c #EEF4FE", +"k% c #DDE8FC", +"l% c #B9AEC0", +"m% c #ED5696", +"n% c #F15698", +"o% c #E34884", +"p% c #D8457C", +"q% c #3F649A", +"r% c #0092D4", +"s% c #0095D5", +"t% c #007DC4", +"u% c #2B5A8A", +"v% c #DF3B3F", +"w% c #E6454B", +"x% c #5E3D1E", +"y% c #3C2E22", +"z% c #01A3AA", +"A% c #057E7A", +"B% c #333F33", +"C% c #BFBDBC", +"D% c #C3B0C3", +"E% c #F4579A", +"F% c #E74986", +"G% c #E24783", +"H% c #42649B", +"I% c #0086D0", +"J% c #00A7DC", +"K% c #00A9DD", +"L% c #007EC4", +"M% c #2A598A", +"N% c #46352A", +"O% c #53463F", +"P% c #50433E", +"Q% c #44549B", +"R% c #3A2D22", +"S% c #047E7A", +"T% c #2F443A", +"U% c #BEBDBC", +"V% c #DAB8D3", +"W% c #F4599B", +"X% c #41649B", +"Y% c #00A8DC", +"Z% c #376492", +"`% c #D4D3D2", +" & c #E9EEF7", +".& c #8D9BCD", +"+& c #A6323E", +"@& c #5D3C1E", +"#& c #392D22", +"$& c #2E4339", +"%& c #E6BCDB", +"&& c #F55A9C", +"*& c #41649A", +"=& c #416D99", +"-& c #F9FAFB", +";& c #A8B8E8", +">& c #A5323D", +",& c #DF3A3F", +"'& c #5F3E1E", +")& c #392A15", +"!& c #382F15", +"~& c #372F21", +"{& c #0D8389", +"]& c #2D4339", +"^& c #40649A", +"/& c #416C98", +"(& c #DE393D", +"_& c #613F1F", +":& c #325112", +"<& c #187A0B", +"[& c #0D8B08", +"}& c #0D8A08", +"|& c #116918", +"1& c #058888", +"2& c #2D4239", +"3& c #E24782", +"4& c #406C98", +"5& c #286A0F", +"6& c #088E07", +"7& c #099A08", +"8& c #089807", +"9& c #007715", +"0& c #018D87", +"a& c #2C4238", +"b& c #E6C0DE", +"c& c #F55B9D", +"d& c #F663A7", +"e& c #F666AB", +"f& c #F664A8", +"g& c #E74987", +"h& c #40639A", +"i& c #2D5DBE", +"j& c #A5313D", +"k& c #613E1E", +"l& c #276A0F", +"m& c #09A408", +"n& c #099F08", +"o& c #037E7A", +"p& c #2B4138", +"q& c #E4C6E4", +"r& c #F55C9D", +"s& c #F873B9", +"t& c #F76EB4", +"u& c #E74A87", +"v& c #3F639A", +"w& c #E6444A", +"x& c #603E1E", +"y& c #276A0E", +"z& c #2A4138", +"A& c #E4C7E4", +"B& c #00A8DD", +"C& c #DC373B", +"D& c #266A0E", +"E& c #2A4038", +"F& c #F55B9E", +"G& c #0085CF", +"H& c #0089D1", +"I& c #3D709F", +"J& c #F9FBFB", +"K& c #476FD3", +"L& c #A5303D", +"M& c #294037", +"N& c #3E639A", +"O& c #3D71A1", +"P& c #588BDE", +"Q& c #65411F", +"R& c #283F37", +"S& c #BDBDBC", +"T& c #F770B5", +"U& c #3C71A1", +"V& c #654120", +"W& c #256A0D", +"X& c #09A208", +"Y& c #273F37", +"Z& c #F772B7", +"`& c #E74A88", +" * c #3D639A", +".* c #A4303D", +"+* c #25690D", +"@* c #09A008", +"#* c #263F36", +"$* c #24690D", +"%* c #099D08", +"&* c #253E36", +"** c #B8B7B6", +"=* c #F771B6", +"-* c #3C70A1", +";* c #4F7CD8", +">* c #A42F3D", +",* c #64411F", +"'* c #23690C", +")* c #088F07", +"!* c #243E36", +"~* c #9C9895", +"{* c #FCFDFD", +"]* c #F65EA2", +"^* c #F55B9F", +"/* c #3C629A", +"(* c #A42F3C", +"_* c #C92123", +":* c #B05B3C", +"<* c #088D07", +"[* c #01929B", +"}* c #01929A", +"|* c #037C78", +"1* c #233E37", +"2* c #9A9694", +"3* c #3C70A0", +"4* c #AF5B3D", +"5* c #6B4521", +"6* c #24690C", +"7* c #019099", +"8* c #027D79", +"9* c #204B46", +"0* c #3B6299", +"a* c #1F4C46", +"b* c #999694", +"c* c #3C527C", +"d* c #0083CD", +"e* c #A42E3C", +"f* c #23690B", +"g* c #1E4C45", +"h* c #999693", +"i* c #3C517B", +"j* c #C82324", +"k* c #AB6140", +"l* c #22690B", +"m* c #007714", +"n* c #018D86", +"o* c #1D4C45", +"p* c #999593", +"q* c #3B507B", +"r* c #A32E3C", +"s* c #AA6140", +"t* c #79522B", +"u* c #756E34", +"v* c #738234", +"w* c #738134", +"x* c #737535", +"y* c #738066", +"z* c #73847A", +"A* c #738379", +"B* c #737964", +"C* c #756247", +"D* c #9B8675", +"E* c #D4C8BF", +"F* c #D5C9C1", +"G* c #CBC2C0", +"H* c #C1BABF", +"I* c #C5A4AE", +"J* c #CF697C", +"K* c #D0677B", +"L* c #CF677A", +"M* c #C7616D", +"N* c #C4616B", +"O* c #796465", +"P* c #737C9D", +"Q* c #737897", +"R* c #737591", +"S* c #7A727E", +"T* c #D2C6BE", +"U* c #A39BB0", +"V* c #7C70A0", +"W* c #7A6F9D", +"X* c #776A96", +"Y* c #776993", +"Z* c #A15943", +"`* c #A46B45", +" = c #825931", +".= c #9B7146", +"+= c #885F36", +"@= c #8A6138", +"#= c #8B623A", +"$= c #8B6239", +" . + ", +" . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . @ # $ ", +" % & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & * = $ - ", +" ; - - - - - - - > > > > > > , , , , , , , , , , , , , ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' , # ) & - ", +" ; - ! ~ ~ ~ { ] ^ ^ ^ ^ ^ / ( ( ( ( ( _ : : : : : < [ } } } } } } } } } } } } } } } } } } } } } } } | 1 2 2 2 3 4 5 6 7 & - ", +" ; > ^ 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 9 0 a b c d e f g 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 h i j k k l m n o 7 & - ", +" ; > p q r s t t u q q q q q q q q q q q q v w w w w x y z A q q q q q q q q q q q q B C D E E E F G H j k I I J m K L 7 & - ", +" ; > M N O P Q R S T U V V V W X Y Z Z ` ...w w w w x y z +.V V V V V V V V V V V V @.#.$.%.%.&.*.=.-.j k ;.>.J m ,.'.7 & - ", +" ; > ).!.!.!.!.~.{.].^././.(._.:.<.<.<.[.}.|.w w 1.2.3.y z 4././././././././././././.5.6.6.7.8.9.0.a.b.j k ;.>.J m ,.'.7 & - ", +" ; > c.!.!.!.!.~.{.].d.e.e.f.g.<.<.<.<.[.h.i.w w j.k.l.y z m.n.n.o.e.e.e.e.e.e.p.p.e.5.6.6.q.r.s.0.a.b.j k ;.>.J m ,.'.7 & - ", +" ; > c.!.!.t.u.v.{.].w.x.y.z.A.<.B.C.D.E.h.i.w w j.k.l.y z F.G.H.I.J.K.K.K.K.L.M.N.O.P.6.6.Q.r.s.0.a.b.j k ;.>.J m R.'.7 & - ", +" ; - S.!.!.T.U.V.{.].W.X.Y.Z.`. +.+++@+#+h.i.w w j.k.l.y $+%+&+*+=+-+;+;+;+;+>+,+'+)+!+6.6.~+r.s.0.a.b.j k ;.>.J m {+]+7 & - ", +" ; - S.!.!.T.U.V.{.].^+/+(+_+:+ +.+++<+[+h.i.w w j.k.l.y $+}+&+*+|+1+2+2+2+3+4+5+6+7+8+6.6.9+r.s.0.a.b.j k ;.>.J m {+]+7 & - ", +" ; - S.!.!.T.U.V.{.].0+a+(+_+:+ +.+++<+b+h.i.w w j.k.c+y $+}+&+*+|+d+e+e+e+f+g+h+i+j+P.6.6.9+r.k+0.a.b.j k ;.>.J m {+]+7 & - ", +" ; - S.!.!.T.U.V.{.].l+m+(+_+:+ +n+++<+b+h.i.w w j.k.o+y $+}+&+*+p+q+r+r+r+s+t+u+v+w+x+6.6.9+r.y+z+a.b.j k ;.>.J m {+]+7 & - ", +" ; - S.!.!.T.U.V.{.].A+m+(+_+:+B+C+++<+b+h.i.w w j.k.o+y $+}+&+*+p+D+E+E+F+G+H+I+J+K+x+6.6.9+r.y+z+a.b.j k ;.>.J m {+]+7 & - ", +" ; - S.!.!.L+U.V.{.].M+m+(+_+:+B+C+++<+b+h.i.w w j.k.o+y $+}+N+O+p+P+Q+Q+R+S+T+U+V+W+X+6.6.9+r.y+z+a.b.j k ;.>.J m {+]+7 & - ", +" ; - S.!.!.Y+U.V.{.].Z+m+(+_+:+B+C+++<+`+h.i.w w j.k.o+y $+}+ @.@p++@@@@@#@$@%@&@*@=@X+6.6.9+r.y+z+a.b.j k ;.>.J m -@]+7 & - ", +" ; - S.!.!.Y+U.V.{.].;@m+(+_+:+B+>@@+n+`+h.i.w w j.k.o+y $+}+ @.@p+,@'@)@!@~@{@]@^@'@X+6.6.9+r./@(@a.b.j k ;.>.J m -@]+7 & - ", +" ; - S.!.!.Y+U.V.{.]._@m+(+_+:+<. + + +[.h.i.w w j.k.o+y $+}+ @.@:@<@[@}@|@T+1@2@3@[@X+6.6.9+r.4@(@a.b.j k ;.>.J m 5@]+7 & - ", +" ; - S.!.!.Y+U.V.{.].6@m+(+_+:+<.<.<.<.[.h.i.w w 7@8@3.y $+}+ @9@:@0@a@b@c@%@d@e@f@a@g@6.6.9+h@i@(@a.b.j k ;.>.J m 5@]+7 & - ", +" ; - S.!.!.Y+j@V.{.].k@/+(+_+:+<.<.<.<.[.h.i.w w w w x y $+}+ @l@m@n@o@p@q@r@]@s@t@t@u@6.6.6.9+9+v@a.b.j k ;.>.J m 5@]+7 & - ", +" ; - S.!.!.!.w@!.{.].x@/+(+_+:+<.<.<.<.[.h.i.w w w w x y $+}+ @l@m@y@z@A@T+B@C@D@E@E@u@6.6.6.6.F@v@a.b.j k I I J m G@H@7 & - ", +" ; - S.!.!.!.!.~.{.].x@/+(+_+:+<.<.<.<.[.h.i.w w w w x y $+}+N+I@m@J@K@L@M@N@O@P@Q@Q@R@6.6.6.6.F@v@a.b.j j k k l m S@T@7 & - ", +" ; - S.!.!.!.!.~.{.].U@/+(+_+:+<.<.<.<.[.h.i.w w w w x y $+V@&+*+:@W@X@'+Y@Z@`@ # # #R@6.6.6.6.F@v@a.b.j j j j .#m S@T@7 & - ", +" ; - S.!.!.!.!.~.{.].U@/+(+_+:+<.<.<.<.[.h.i.w w w w x y +#@#&+*+##$#A@'+%#&#*#=#=#=#R@6.6.6.6.F@v@a.b.j j j j .#m -#;#7 & - ", +" ; - S.!.!.!.!.~.{.].U@/+(+_+:+<.<.<.<.[.h.i.w w w w x y z >#&+*+##,#'#)#!#~#{#{#{#{#]#6.6.6.6.F@v@a.b.j j j j .#m ^#/#7 & - ", +" ; - S.!.!.!.!.~.{.].(#/+(+_+:+<.<.<.<.[.h.i.w w w w x y z >#&+*+_#:#'+<#[#}#|#|#|#|#]#6.6.6.6.F@v@a.b.j j j j .#m 1#2#7 & - ", +" ; - S.!.!.!.!.~.{.].(#/+(+_+:+<.<.<.<.[.h.i.w w w w x y z >#&+*+3#4#,+5#6#7#8#8#9#{#0#a#a#b#b#c#d#e#f#g#h#i#i#j#k#l#2#7 & - ", +" ; - m#n#n#n#n#o#p#q#r#s#t#u#v#w#w#x#y#z#A#B#C#C#C#C#C#D#E#F#G#H#I#J#K#L#M#N#N#N#O#P#Q#R#S#T#T#T#U#V#W#X#Y#Z#Z#`# $T@ 7 & - ", +" .$+$@$#$#$#$#$$$%$&$*$=$-$;$>$,$,$'$'$)$)$ 7 & - ", +" !$~$; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; .${$]$]$]$]$]$]$]$^$/$/$/$/$/$/$/$($7 7 7 7 7 7 7 7 @ . . . . . . . . . . . ) & - ", +" ; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - $ $ $ $ $ $ $ $ $ & & & & & & & & & & & & & & & & & & & _$:$& - ", +" ; - > , , ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' <$[$[$[$}$|$|$|$|$1$2$2$2$2$~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ 3$4$7 & - ", +" ; - 5$: 6$7$} } } } } } } } } } } } } } } } } } } } } } 8$8$8$8$8$9$9$9$9$9$9$9$9$0$a$b$b$b$c$d$e$f$g$g$g$g$g$g$g$h$ 7 & - ", +" ; - { i$i$i$i$i$i$i$i$i$i$i$i$i$i$i$i$i$i$i$i$i$i$i$i$i$i$j$k$l$m$n$o$p$q$r$i$i$i$s$i j j t$u$v$w$x$y$z$A$a B$C$D$E$ 7 & - ", +" ; - { q q q q q F$G$H$I$J$K$L$M$N$O$P$Q$R$S$q q q q q q q T$U$V$W$&+&+X$p+Y$q q q Z$j j `$ %.%v$+%@%#%$%%%w x &%*%=% 7 & - ", +" ; - -%V V V V ;%>%,%'%)%!%~%{%]%m+^%^%/%(%_%:%<%[%E }%|%1%n$&+&+&+&+&+2%3%4%V V V 5%j j 6%I .%v$7%8%w w 9%o+%%y 0%a% 7 & - ", +" ; - b%/./././.c%d%V.e%f%g%h%i%(+(+(+(+j%k%l%m%$.%.%.n%o%p%q%&+&+N+r%s%t%3%u%/././.5%j j 6%I .%v$7%8%w w v%w%w y z E# 7 & - ", +" ; - x%e.e.e.e.y%d%z%j@A%B%C%(+(+(+(+(+j%k%D%%.6.6.6.E%F%G%H%&+I%J%K%J%L%3%M%N%O%P%Q%j j 6%I .%v$7%8%w w v%w%w y z E# 7 & - ", +" ; - x%K.K.K.K.R%d%z%j@S%T%U%(+(+(+(+(+j%k%V%W%6.6.6.E%F%G%X%&+I%Y%K%Y%L%3%Z%`%/+ &.&j j 6%I .%v$7%+&w w v%w%w y z E# 7 & - ", +" ; - @&;+;+;+;+#&d%z%j@S%$&U%(+(+(+(+(+j%k%%&&&6.6.6.E%F%G%*&&+I%Y%K%Y%L%3%=&-&(+j%;&j j 6%I .%v$7%>&w w ,&w%w y z E# 7 & - ", +" ; - '&2+)&!&!&~&{&z%j@S%]&U%(+(+(+(+(+j%k%%&&&6.6.6.E%F%G%^&&+I%Y%K%Y%L%3%/&-&(+j%;&j j 6%I .%v$7%>&w w (&w%w y z E# 7 & - ", +" ; - _&:&<&[&}&|&1&z%j@S%2&U%(+(+(+(+(+j%k%%&&&6.6.6.E%F%3&^&&+I%Y%K%Y%L%3%4&-&(+j%;&j j 6%I .%v$7%>&w w (&w%w y z E# 7 & - ", +" ; - _&5&6&7&8&9&0&z%j@S%a&U%(+(+(+(+(+j%k%b&c&~+d&e&f&g&3&h&&+I%Y%K%Y%L%3%4&-&(+j%;&j j 6%I .%v$i&j&w w (&w%w y z E# 7 & - ", +" ; - k&l&6&m&n&9&0&z%j@o&p&U%(+(+(+(+(+j%k%q&r&q.r.s&t&u&3&v&&+I%Y%K%Y%L%3%4&-&(+j%;&j j 6%I .%v$i&j&w w (&w&w y z E# 7 & - ", +" ; - x&y&6&m&n&9&0&z%j@o&z&U%(+(+(+(+(+j%k%A&r&q.r.s&t&u&3&v&&+I%J%B&J%L%3%4&-&(+j%;&j j 6%I .%v$i&j&w w w C&x y z E# 7 & - ", +" ; - x&D&6&m&n&9&0&z%j@o&E&U%(+(+(+(+(+j%k%A&r&F&r.s&t&u&3&v&&+G&r%N+H&2%3%I&J&(+j%;&j j K&I .%v$i&L&w w w w x y z E# 7 & - ", +" ; - k&D&6&m&n&9&0&z%j@o&M&U%(+(+(+(+(+j%k%A&r&9+r.s&t&u&3&N&&+&+&+&+&+2%3%O&J&(+j%;&j j k P&.%v$i&L&w w w w x y z E# 7 & - ", +" ; - Q&D&6&m&n&9&0&z%j@o&R&S&(+(+(+(+(+j%k%A&r&9+r.s&T&u&3&N&&+&+&+&+&+2%3%U&J&(+j%;&j j k P&.%v$i&L&w w w w x y z E# 7 & - ", +" ; - V&W&6&X&n&9&0&z%j@o&Y&S&(+(+(+(+(+j%k%A&r&9+r.s&Z&`&3& *&+&+&+&+&+2%3%U&J&(+j%;&j j k P&.%v$i&.*w w w w x y z E# 7 & - ", +" ; - Q&+*6&@*n&9&0&z%j@o&#*S&(+(+(+(+(+j%k%A&r&9+r.s&Z&`&3& *&+&+&+&+&+2%3%U&J&(+j%;&j j k P&.%v$i&.*w w w w x y z E# 7 & - ", +" ; - Q&$*6&n&%*9&0&z%j@o&&***(+(+(+(+(+j%k%A&r&9+h@r.=*`&3& *&+&+&+&+&+2%3%-*J&(+j%;&j j t$;*.%v$i&>*w w w w x y z E# 7 & - ", +" ; - ,*'*6&)*6&9&0&V.e%o&!*~*{*(+(+(+(+j%k%A&r&6.]*^*9+F%3&/*&+&+&+&+&+2%3%-*J&(+j%;&j j j j u$v$i&(*w w w w x y _*:* 7 & - ", +" ; - ,*'*6&6&<*9&0&[*}*|*1*2*{*(+(+(+(+j%k%A&r&6.6.6.E%F%3&/*&+&+&+&+&+2%3%3*J&(+j%;&j j j j u$v$i&(*w w w w x y _*4* 7 & - ", +" ; - 5*6*6&6&<*9&0&!.7*8*9*2*{*(+(+(+(+j%k%A&r&6.6.6.E%F%3&0*&+&+&+&+&+2%3%3*J&(+j%;&j j j j u$v$i&(*w w w w x y _*4* 7 & - ", +" ; - 5*'*6&6&<*9&0&!.7*8*a*b*{*(+(+(+(+j%k%A&r&6.6.6.E%F%3&c*d*&+&+&+&+2%3%3*J&(+j%;&j j j j u$v$i&e*w w w w x y _*4* 7 & - ", +" ; - 5*f*6&6&<*9&0&!.7*8*g*h*{*(+(+(+(+j%k%A&r&6.6.6.E%F%3&i*d*&+&+&+&+2%3%3*J&(+j%;&j j j j u$v$i&e*w w w w x y j*k* 7 & - ", +" ; - 5*l*6&6&<*m*n*!.7*8*o*p*{*(+(+(+(+j%k%A&r&6.6.6.E%F%3&q*d*&+&+&+&+2%3%3*J&(+j%;&j j j j u$v$i&r*w w w w x y j*s* 7 & - ", +" ; - t*u*v*v*w*x*y*z*A*B*C*D*E*F*F*F*F*G*H*I*J*K*K*K*L*M*N*O*P*G#G#G#G#Q*R*S*T*F*G*U*V*V*V*V*W*X*Y*Z*C#C#C#C#C#D#E#`* 7 & - ", +" ; =.= 7 & - ", +" . +=@=#=; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; # $ - ", +". $=$ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ", +"+ $ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - "}; diff --git a/assets/bookshelf_01.xpm b/assets/bookshelf_01.xpm new file mode 100644 index 0000000..1eba9a2 --- /dev/null +++ b/assets/bookshelf_01.xpm @@ -0,0 +1,686 @@ +/* XPM */ +static char * bookshelf_01_xpm[] = { +"64 64 619 2", +" c #9E7449", +". c #9D7348", +"+ c #835A32", +"@ c #9C7247", +"# c #845B33", +"$ c #754C24", +"% c #875E36", +"& c #774E26", +"* c #795028", +"= c #835A31", +"- c #865D35", +"; c #744C24", +"> c #744B24", +", c #734B24", +"' c #8F663C", +") c #634020", +"! c #603E1F", +"~ c #5F3E1F", +"{ c #593A1E", +"] c #58391E", +"^ c #55371E", +"/ c #52351D", +"( c #50351D", +"_ c #4B311C", +": c #462E1B", +"< c #452D1A", +"[ c #462D1B", +"} c #472D1B", +"| c #4B331E", +"1 c #9B7248", +"2 c #8F663D", +"3 c #4A301B", +"4 c #412A1A", +"5 c #412B1A", +"6 c #6B2D21", +"7 c #A5312D", +"8 c #A7312D", +"9 c #AA312E", +"0 c #AE322F", +"a c #A8312D", +"b c #9A2620", +"c c #8B271E", +"d c #452A1A", +"e c #48301D", +"f c #49301B", +"g c #402A19", +"h c #442A1A", +"i c #482A1A", +"j c #4A2A1B", +"k c #492A1A", +"l c #432A19", +"m c #B73332", +"n c #DC363A", +"o c #DB3539", +"p c #CA2124", +"q c #C52023", +"r c #54291A", +"s c #47301D", +"t c #7D3224", +"u c #A6302D", +"v c #B33230", +"w c #C03434", +"x c #C73435", +"y c #C33334", +"z c #A72623", +"A c #98251E", +"B c #66281A", +"C c #3F2918", +"D c #3F2A18", +"E c #393D16", +"F c #2F6012", +"G c #2D6B11", +"H c #2D6A11", +"I c #2D5410", +"J c #393616", +"K c #452A19", +"L c #B93332", +"M c #C62023", +"N c #5C281A", +"O c #462F1C", +"P c #A9352E", +"Q c #CC2427", +"R c #C92023", +"S c #97241E", +"T c #3E2818", +"U c #344515", +"V c #0E8A08", +"W c #098D07", +"X c #088E07", +"Y c #088D07", +"Z c #017600", +"` c #0B7102", +" . c #472F19", +".. c #C63435", +"+. c #E23F44", +"@. c #E44147", +"#. c #C72023", +"$. c #6A261B", +"%. c #462E1C", +"&. c #AA372E", +"*. c #98241E", +"=. c #3D2817", +"-. c #314B13", +";. c #0A8C07", +">. c #007600", +",. c #067301", +"'. c #462E18", +"). c #DC363B", +"!. c #E54348", +"~. c #E7454B", +"{. c #6C261A", +"]. c #442E1B", +"^. c #AC392E", +"/. c #E03C41", +"(. c #E34046", +"_. c #DE393D", +":. c #992823", +"<. c #5D514A", +"[. c #7F766F", +"}. c #605652", +"|. c #3E2A1D", +"1. c #3C2717", +"2. c #304A13", +"3. c #089707", +"4. c #09A108", +"5. c #09A408", +"6. c #089A07", +"7. c #452E18", +"8. c #E44247", +"9. c #6C251A", +"0. c #432D1B", +"a. c #AC382E", +"b. c #E7464C", +"c. c #B36A66", +"d. c #F6F7F7", +"e. c #FAFBFB", +"f. c #E0E8F5", +"g. c #6A6363", +"h. c #3B2616", +"i. c #2F4A13", +"j. c #09A008", +"k. c #0AB009", +"l. c #099F08", +"m. c #442D17", +"n. c #6C241A", +"o. c #432D1A", +"p. c #AB382E", +"q. c #E03D42", +"r. c #B97672", +"s. c #FBFCFB", +"t. c #FDFFFF", +"u. c #E4ECFA", +"v. c #736D6F", +"w. c #3A2516", +"x. c #2C5711", +"y. c #442C17", +"z. c #C82023", +"A. c #80231B", +"B. c #422C1A", +"C. c #E13E43", +"D. c #B97671", +"E. c #726D6F", +"F. c #392415", +"G. c #2A5910", +"H. c #099C08", +"I. c #432C16", +"J. c #412B19", +"K. c #B97571", +"L. c #736E70", +"M. c #372415", +"N. c #2A5810", +"O. c #057301", +"P. c #422B16", +"Q. c #C63335", +"R. c #80221A", +"S. c #402B19", +"T. c #B87571", +"U. c #E5EDFB", +"V. c #898A92", +"W. c #362314", +"X. c #295810", +"Y. c #09A308", +"Z. c #007700", +"`. c #412B15", +" + c #7F221A", +".+ c #442D1B", +"++ c #AE3C2F", +"@+ c #8A8B93", +"#+ c #352214", +"$+ c #2A4C10", +"%+ c #098C07", +"&+ c #402A15", +"*+ c #DC373B", +"=+ c #7F211A", +"-+ c #4A321E", +";+ c #9C7248", +">+ c #8A8A93", +",+ c #342113", +"'+ c #2A4710", +")+ c #099808", +"!+ c #0AAF09", +"~+ c #402914", +"{+ c #DD383C", +"]+ c #7F201A", +"^+ c #49311E", +"/+ c #332012", +"(+ c #29470F", +"_+ c #089708", +":+ c #0AAE09", +"<+ c #0AAC09", +"[+ c #3E2914", +"}+ c #C63334", +"|+ c #7F2019", +"1+ c #49311D", +"2+ c #B87471", +"3+ c #898A93", +"4+ c #321F12", +"5+ c #29460F", +"6+ c #089007", +"7+ c #088F07", +"8+ c #047301", +"9+ c #3B2813", +"0+ c #BE3233", +"a+ c #7E1F19", +"b+ c #4F3721", +"c+ c #B87470", +"d+ c #311E11", +"e+ c #28460F", +"f+ c #372712", +"g+ c #B63031", +"h+ c #DF3B40", +"i+ c #E23F45", +"j+ c #563B24", +"k+ c #9C7348", +"l+ c #E6454B", +"m+ c #B77470", +"n+ c #301E10", +"o+ c #27450E", +"p+ c #362711", +"q+ c #B63030", +"r+ c #553B24", +"s+ c #B24230", +"t+ c #B77370", +"u+ c #898992", +"v+ c #2F1D10", +"w+ c #26450E", +"x+ c #352611", +"y+ c #7D1E18", +"z+ c #888992", +"A+ c #2E1C0F", +"B+ c #25450D", +"C+ c #037301", +"D+ c #322A10", +"E+ c #5D4128", +"F+ c #2D1B0F", +"G+ c #24440D", +"H+ c #027300", +"I+ c #2F2F0E", +"J+ c #B53030", +"K+ c #7E1D18", +"L+ c #65482C", +"M+ c #878992", +"N+ c #2B1A0E", +"O+ c #23440D", +"P+ c #2E2E0E", +"Q+ c #B52F30", +"R+ c #951D1A", +"S+ c #64472B", +"T+ c #B67270", +"U+ c #878892", +"V+ c #2A190E", +"W+ c #22430C", +"X+ c #2D2D0E", +"Y+ c #961D1A", +"Z+ c #64472C", +"`+ c #B6726F", +" @ c #868891", +".@ c #29190D", +"+@ c #22420C", +"@@ c #2D2D0D", +"#@ c #961C1A", +"$@ c #735333", +"%@ c #28180D", +"&@ c #24330C", +"*@ c #0A8E07", +"=@ c #0B8D08", +"-@ c #037601", +";@ c #B43130", +">@ c #DB383A", +",@ c #DA393A", +"'@ c #DA393B", +")@ c #DA383A", +"!@ c #C92626", +"~@ c #C72825", +"{@ c #96251E", +"]@ c #342213", +"^@ c #785736", +"/@ c #B14532", +"(@ c #DA3A3B", +"_@ c #D93A3A", +":@ c #CA2B29", +"<@ c #C52D28", +"[@ c #B27068", +"}@ c #EDE8E4", +"|@ c #F0EBE7", +"1@ c #D8D7DB", +"2@ c #8A807D", +"3@ c #513822", +"4@ c #5C4127", +"5@ c #62462B", +"6@ c #63472B", +"7@ c #765535", +"8@ c #755A35", +"9@ c #738034", +"0@ c #738234", +"a@ c #758035", +"b@ c #777E36", +"c@ c #767535", +"d@ c #767435", +"e@ c #7F6039", +"f@ c #A06342", +"g@ c #B06545", +"h@ c #AA6A46", +"i@ c #A96C47", +"j@ c #A86B47", +"k@ c #A56944", +"l@ c #A07248", +"m@ c #9E7248", +"n@ c #875E35", +"o@ c #A17248", +"p@ c #9F744A", +"q@ c #A27B55", +"r@ c #A07952", +"s@ c #9D744B", +"t@ c #8B6239", +"u@ c #8B633A", +"v@ c #8C633A", +"w@ c #936940", +"x@ c #946A40", +"y@ c #966C42", +"z@ c #986E44", +"A@ c #996F44", +"B@ c #8F653C", +"C@ c #764D25", +"D@ c #774E27", +"E@ c #825931", +"F@ c #6E4823", +"G@ c #6E4723", +"H@ c #6B4622", +"I@ c #694421", +"J@ c #684421", +"K@ c #644121", +"L@ c #7A5530", +"M@ c #452D1B", +"N@ c #442D1A", +"O@ c #432C1A", +"P@ c #452C1B", +"Q@ c #4E2C1C", +"R@ c #512C1C", +"S@ c #4C2B1A", +"T@ c #432B1A", +"U@ c #7B5937", +"V@ c #402E27", +"W@ c #3E363A", +"X@ c #324D68", +"Y@ c #2E5D8A", +"Z@ c #2D6499", +"`@ c #2D6397", +" # c #314D6B", +".# c #3B373D", +"+# c #402E26", +"@# c #422B1A", +"## c #832E25", +"$# c #B23230", +"%# c #CF3537", +"&# c #D83639", +"*# c #D73538", +"=# c #BE2223", +"-# c #9D251F", +";# c #805837", +"># c #2E5F8F", +",# c #0682CB", +"'# c #0283CD", +")# c #0084CE", +"!# c #0084CF", +"~# c #0179C0", +"{# c #0574B9", +"]# c #2E5785", +"^# c #B33231", +"/# c #8E5838", +"(# c #5F3D1F", +"_# c #2C6499", +":# c #007AC1", +"<# c #0076BC", +"[# c #2C5A8A", +"}# c #452919", +"|# c #955738", +"1# c #5E3D1F", +"2# c #3D2E18", +"3# c #344B14", +"4# c #2D6412", +"5# c #2D6212", +"6# c #363C15", +"7# c #3E2918", +"8# c #2B6399", +"9# c #008FD3", +"0# c #0093D5", +"a# c #0095D5", +"b# c #007BC2", +"c# c #2B5A8A", +"d# c #442819", +"e# c #B83232", +"f# c #965738", +"g# c #5E3D1E", +"h# c #2C6911", +"i# c #0B8C07", +"j# c #077302", +"k# c #353814", +"l# c #542C2A", +"m# c #B2436E", +"n# c #B84572", +"o# c #B64370", +"p# c #AE3B62", +"q# c #8F344E", +"r# c #2E6399", +"s# c #0086D0", +"t# c #00A7DC", +"u# c #00A9DD", +"v# c #007CC2", +"w# c #2A598A", +"x# c #432818", +"y# c #A35739", +"z# c #2A6A10", +"A# c #0AA609", +"B# c #099E08", +"C# c #027501", +"D# c #2F4012", +"E# c #B54470", +"F# c #F5589B", +"G# c #F35698", +"H# c #E64986", +"I# c #E04782", +"J# c #41649A", +"K# c #00A8DC", +"L# c #29598A", +"M# c #412718", +"N# c #A45739", +"O# c #5D3C1E", +"P# c #0AAB09", +"Q# c #2E4011", +"R# c #B84472", +"S# c #E24783", +"T# c #28598A", +"U# c #412617", +"V# c #B83231", +"W# c #296A0F", +"X# c #2D4011", +"Y# c #40649A", +"Z# c #402517", +"`# c #E23E44", +" $ c #5D3C1D", +".$ c #286A0F", +"+$ c #2C4110", +"@$ c #E24782", +"#$ c #27598A", +"$$ c #3F2416", +"%$ c #B73131", +"&$ c #276A0F", +"*$ c #017501", +"=$ c #284B0E", +"-$ c #B74472", +";$ c #F65CA0", +">$ c #F663A7", +",$ c #F666AB", +"'$ c #F45FA2", +")$ c #40639A", +"!$ c #26598A", +"~$ c #3E2416", +"{$ c #B25739", +"]$ c #5C3B1D", +"^$ c #266A0E", +"/$ c #0AA808", +"($ c #274B0D", +"_$ c #F872B8", +":$ c #F873B9", +"<$ c #F567AB", +"[$ c #E74986", +"}$ c #3F639A", +"|$ c #25598A", +"1$ c #3C2315", +"2$ c #B5573A", +"3$ c #09A708", +"4$ c #264A0D", +"5$ c #B74372", +"6$ c #F661A5", +"7$ c #00A8DD", +"8$ c #00A6DC", +"9$ c #24588A", +"0$ c #3C2215", +"a$ c #C92123", +"b$ c #B2593B", +"c$ c #25690E", +"d$ c #352113", +"e$ c #F660A3", +"f$ c #0085CF", +"g$ c #0091D4", +"h$ c #008DD2", +"i$ c #0088D0", +"j$ c #007AC2", +"k$ c #3B2114", +"l$ c #E03C42", +"m$ c #AF5B3D", +"n$ c #5B3B1C", +"o$ c #25690D", +"p$ c #254A0C", +"q$ c #342012", +"r$ c #F569AD", +"s$ c #3E639A", +"t$ c #23588A", +"u$ c #3A2013", +"v$ c #B73031", +"w$ c #DE383D", +"x$ c #DE3A3E", +"y$ c #5B3A1C", +"z$ c #24690D", +"A$ c #244A0C", +"B$ c #F56AAE", +"C$ c #E74987", +"D$ c #22588A", +"E$ c #392013", +"F$ c #23690D", +"G$ c #09A608", +"H$ c #017500", +"I$ c #23490B", +"J$ c #B74272", +"K$ c #F65EA2", +"L$ c #3D639A", +"M$ c #21588A", +"N$ c #381F12", +"O$ c #C82224", +"P$ c #AC5F3F", +"Q$ c #22690C", +"R$ c #B74271", +"S$ c #F65DA0", +"T$ c #20588A", +"U$ c #371E12", +"V$ c #C82324", +"W$ c #AA6140", +"X$ c #5A3A1C", +"Y$ c #21690C", +"Z$ c #22490A", +"`$ c #F872B7", +" % c #361D11", +".% c #5C3B1C", +"+% c #21480A", +"@% c #B64271", +"#% c #F5599C", +"$% c #F55B9E", +"%% c #F35799", +"&% c #3C629A", +"*% c #1F578A", +"=% c #321C10", +"-% c #AD2E2E", +";% c #5E3C1D", +">% c #20480A", +",% c #1E578A", +"'% c #2F1B10", +")% c #AA2D2D", +"!% c #C82525", +"~% c #A56844", +"{% c #20690B", +"]% c #1F4809", +"^% c #2C1A0E", +"/% c #3B629A", +"(% c #1D578A", +"_% c #2E1A0F", +":% c #1F690B", +"<% c #1E4709", +"[% c #2A1A0E", +"}% c #1C578A", +"|% c #2D1A0F", +"1% c #AA2C2D", +"2% c #1E690B", +"3% c #1D4708", +"4% c #B54170", +"5% c #1B578A", +"6% c #2C190E", +"7% c #AA2C2C", +"8% c #1E690A", +"9% c #96375B", +"0% c #F3579A", +"a% c #3A629A", +"b% c #1A578A", +"c% c #2B180E", +"d% c #77512D", +"e% c #756E34", +"f% c #738134", +"g% c #737533", +"h% c #756134", +"i% c #995C52", +"j% c #CE677A", +"k% c #D0677B", +"l% c #CE6679", +"m% c #C7616D", +"n% c #C4616B", +"o% c #796B7A", +"p% c #737C9F", +"q% c #737C9E", +"r% c #737795", +"s% c #737591", +"t% c #74676F", +"u% c #A4593D", +"v% c #C05B42", +"w% c #B6573A", +"x% c #B4583A", +"y% c #9F7348", +"z% c #825A32", +"A% c #8A6138", +"B% c #865D34", +" . + ", +" . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . @ # $ ", +" % & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & * = $ $ ", +" - $ $ $ $ $ $ $ ; ; ; ; ; ; > > > > > > > > > > > > , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , ; ' ' $ $ ", +" - ; ) ! ! ! ~ { ] ] ] ] ] ^ / / / / / ( _ _ _ _ _ _ : < < < < < < < < < < < < < < < < < < < < < [ } [ < < < < < < | 1 2 $ $ ", +" - > 3 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 5 6 7 8 9 0 a b c d 4 4 4 e 1 2 $ $ ", +" - > f g h i j k l g g g g g g g g g g g g g g g g g g g g g g g g g g g g g g g g g g g d m n n n n o p q r g g g s 1 2 $ $ ", +" - > t u v w x y z A B C C C C C C C C C C C C C C C C C C C C C C C C C D E F G G H I J K L n n n n o p M N C C C O 1 2 $ $ ", +" - > P n n n n o Q R S T T T T T T T T T T T T T T T T T T T T T T T T T U V W X X Y Z ` ...n n +.@.n p #.$.T T T %.1 2 $ $ ", +" - > &.n n n n o Q R *.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.-.;.X X X Y >.,.'.x n ).!.~.n p #.{.=.=.=.].1 2 $ $ ", +" - > ^.n n /.(._.Q R :.<.[.}.|.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.2.;.3.4.5.6.>.,.7.x n n 8.~.n p #.9.1.1.1.0.1 2 $ $ ", +" - > a.n n +.b./.Q R c.d.e.f.g.h.h.h.h.h.h.h.h.h.h.h.h.h.h.h.h.h.h.h.h.h.i.;.j.k.k.l.>.,.m.x n n 8.~.n p #.n.h.h.h.o.1 2 $ $ ", +" - > p.n n +.b.q.Q R r.s.t.u.v.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.x.W j.k.k.l.>.,.y...n n 8.~.n p z.A.w.w.w.B.1 2 $ $ ", +" - > p.n n C.b.C.Q R D.s.t.u.E.F.F.F.F.F.F.F.F.F.F.F.F.F.F.F.F.F.F.F.F.F.G.W H.k.k.l.>.,.I...n n @.~.n p z.A.F.F.F.J.1 2 $ $ ", +" - > p.n n q.b.C.Q R K.s.t.u.L.M.M.M.M.M.M.M.M.M.M.M.M.M.M.M.M.M.M.M.M.M.N.W H.k.k.j.>.O.P.Q.n n (.~.n p z.R.M.M.M.S.1 2 $ $ ", +" - > ^.n n q.b.C.Q R T.s.t.U.V.W.W.W.W.W.W.W.W.W.W.W.W.W.W.W.W.W.W.W.W.W.X.W H.k.k.Y.Z.O.`.Q.n n (.~.n p z. +W.W.W..+1 2 $ $ ", +" - ; ++n n q.b.C.Q R T.s.t.U.@+#+#+#+#+#+#+#+#+#+#+#+#+#+#+#+#+#+#+#+#+#+$+%+H.k.k.Y.Z.O.&+Q.n n (.~.*+p z.=+#+#+#+-+;+2 $ $ ", +" - ; ++n n q.b.C.Q R T.s.t.U.>+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+'+%+)+!+k.Y.Z.O.~+Q.n n (.b.{+p z.]+,+,+,+^+;+2 $ $ ", +" - ; ++n n q.b.C.Q R T.s.t.U.>+/+/+/+/+/+/+/+/+/+/+/+/+/+/+/+/+/+/+/+/+/+(+%+_+:+<+l.Z.O.[+}+n n +.b.{+p z.|+/+/+/+1+;+2 $ $ ", +" - ; ++n n q.b.C.Q R 2+s.t.U.3+4+4+4+4+4+4+4+4+4+4+4+4+4+4+4+4+4+4+4+4+4+5+%+X 6+7+X >.8+9+0+n n +.b.{+p z.a+4+4+4+b+;+2 $ $ ", +" - ; ++n n q.b.C.Q R c+s.t.U.V.d+d+d+d+d+d+d+d+d+d+d+d+d+d+d+d+d+d+d+d+d+e+%+X X X Y >.8+f+g+n n h+i+*+p z.a+d+d+d+j+k+2 $ $ ", +" - ; ++n n /.l+C.Q R m+s.t.U.V.n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+o+%+X X X Y >.8+p+q+n n n n o p z.a+n+n+n+r+k+2 $ $ ", +" - $ s+n n n *+n Q R t+s.t.U.u+v+v+v+v+v+v+v+v+v+v+v+v+v+v+v+v+v+v+v+v+v+w+%+X X X Y >.8+x+q+n n n n o p z.y+v+v+v+r+k+2 $ $ ", +" - $ s+n n n n o Q R t+s.t.U.z+A+A+A+A+A+A+A+A+A+A+A+A+A+A+A+A+A+A+A+A+A+B+%+X X X Y >.C+D+q+n n n n o p z.y+A+A+A+E+. 2 $ $ ", +" - $ s+n n n n o Q R t+s.t.U.z+F+F+F+F+F+F+F+F+F+F+F+F+F+F+F+F+F+F+F+F+F+G+%+X X X Y >.H+I+J+n n n n o p z.K+F+F+F+L+. 2 $ $ ", +" - $ s+n n n n o Q R t+s.t.U.M+N+N+N+N+N+N+N+N+N+N+N+N+N+N+N+N+N+N+N+N+N+O+%+X X X Y >.H+P+Q+n n n n o p R R+N+N+N+S+. 2 $ $ ", +" - $ s+n n n n o Q R T+s.t.U.U+V+V+V+V+V+V+V+V+V+V+V+V+V+V+V+V+V+V+V+V+V+W+%+X X X Y >.H+X+Q+n n n n o p R Y+V+V+V+Z+. 2 $ $ ", +" - $ s+n n n n o Q R `+s.t.U. @.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@+@%+X X X Y >.H+@@Q+n n n n o p R #@.@.@.@$@ 2 $ $ ", +" - $ s+n n n n o Q R `+s.t.U. @%@%@%@%@%@%@%@%@%@%@%@%@%@%@%@%@%@%@%@%@%@&@;.X X *@=@-@O.P+;@>@>@,@'@)@!@~@{@]@]@]@^@ 2 $ $ ", +" - $ /@(@(@(@(@_@:@<@[@}@|@1@2@3@3@4@5@5@6@$@7@7@7@7@7@7@7@7@7@7@7@7@7@7@8@9@0@0@a@b@c@d@e@f@g@g@h@i@j@k@l@m@1 1 1 . 2 $ $ ", +" % n@m@o@o@o@o@o@l@l@p@q@q@r@s@k+k+. . . . 2 $ $ ", +" ' t@u@u@u@u@u@u@u@u@u@u@u@u@u@u@u@u@u@u@u@v@' 2 2 2 2 2 2 2 w@x@x@x@x@x@x@x@y@z@z@z@z@z@z@z@A@k+. . . . . . . . . . . B@$ $ ", +" - $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ C@C@C@C@C@C@C@C@C@& & & & & & & & & & & & & & & & & & D@E@n@$ $ ", +" - $ ; > > , , , , , , , , , , , , , , , , , , , , , , , F@G@G@G@H@I@I@I@J@K@K@K@K@) ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! L@. 2 $ $ ", +" - $ ) _ f M@< < < < < < < < < < < < < < < < < < < < < < N@N@N@N@N@O@O@O@O@O@O@O@O@B.B.B.B.B.B.B.B.B.P@Q@R@R@R@S@T@U@ 2 $ $ ", +" - $ ~ 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 V@W@X@Y@Z@`@ #.#+#5 5 5 5 5 5 5 5 5 5 @###$#%#&#&#*#=#-#;# 2 $ $ ", +" - $ ~ g g g g g g g g g g g g g g g g g g g g g g g g g g >#,#'#)#!#!#~#{#]#g g g g g g g g g g h ^#n n n n o p M /# 2 $ $ ", +" - $ (#C C C C C C C C C C C C C C C C C C C C C C C C C C _#!#!#!#!#!#:#<#[#C C C C C C C C C C }#L n n n n o p #.|# 2 $ $ ", +" - $ 1#2#3#4#5#6#7#T T T T T T T T T T T T T T T T T T T T 8#!#!#9#0#a#b#<#c#T T T T T T T T T T d#e#n n n n o p #.f# 2 $ $ ", +" - $ g#h#i#7+Y j#k#=.=.=.=.=.=.=.=.=.=.=.=.l#m#n#n#n#o#p#q#r#!#s#t#u#t#v#<#w#=.=.=.=.=.=.=.=.=.=.x#e#n n n n o p z.y# 2 $ $ ", +" - $ g#z#7+A#B#C#D#1.1.1.1.1.1.1.1.1.1.1.1.E#F#F#F#F#G#H#I#J#!#s#K#u#t#v#<#L#1.1.1.1.1.1.1.1.1.1.M#e#n n n *+o p z.N# 2 $ $ ", +" - $ O#z#7+P#l.C#Q#h.h.h.h.h.h.h.h.h.h.h.h.R#F#F#F#F#G#H#S#J#!#s#K#u#t#v#<#T#h.h.h.h.h.h.h.h.h.h.U#V#n n C.l+n p z.N# 2 $ $ ", +" - $ O#W#7+P#l.C#X#w.w.w.w.w.w.w.w.w.w.w.w.R#F#F#F#F#G#H#S#Y#!#s#K#u#t#v#<#T#w.w.w.w.w.w.w.w.w.w.Z#V#n n `#~.n p z.y# 2 $ $ ", +" - $ $.$7+P#l.C#+$F.F.F.F.F.F.F.F.F.F.F.F.R#F#F#F#F#G#H#@$Y#!#s#K#u#t#v#<##$F.F.F.F.F.F.F.F.F.F.$$%$n n q.l+n p z.N# 2 $ $ ", +" - $ $&$7+P#l.*$=$M.M.M.M.M.M.M.M.M.M.M.M.-$F#;$>$,$'$H#@$)$!#s#K#u#t#v#<#!$M.M.M.M.M.M.M.M.M.M.~$%$n n q.l+n p R {$ 2 $ $ ", +" - $ ]$^$7+/$l.*$($W.W.W.W.W.W.W.W.W.W.W.W.-$F#>$_$:$<$[$@$}$!#s#K#u#t#v#<#|$W.W.W.W.W.W.W.W.W.W.1$%$n n q.l+n p R 2$ 2 $ $ ", +" - $ ]$^$7+3$l.*$4$#+#+#+#+#+#+#+#+#+#+#+#+5$F#6$:$:$<$[$@$}$!#s#t#7$8$v#<#9$#+#+#+#+#+#+#+#+#+#+0$%$n n q.l+n p a$b$ 2 $ $ ", +" - $ ]$c$7+3$l.*$4$d$d$d$d$d$d$d$d$d$d$d$d$5$F#e$_$:$<$[$@$}$!#f$g$h$i$j$<#9$d$d$d$d$d$d$d$d$d$d$k$%$n n l$l+n p a$m$ 2 $ $ ", +" - $ n$o$7+3$l.*$p$q$q$q$q$q$q$q$q$q$q$q$q$5$F#e$_$:$r$[$@$s$!#!#!#!#!#:#<#t$q$q$q$q$q$q$q$q$q$q$u$v$n n w$x$o p a$m$ 2 $ $ ", +" - $ y$z$7+3$l.*$A$4+4+4+4+4+4+4+4+4+4+4+4+5$F#e$_$:$B$C$@$s$!#!#!#!#!#:#<#D$4+4+4+4+4+4+4+4+4+4+E$g+n n n n o p a$m$ 2 $ $ ", +" - $ y$F$7+G$l.H$I$d+d+d+d+d+d+d+d+d+d+d+d+J$F#K$_$:$B$C$@$L$!#!#!#!#!#:#<#M$d+d+d+d+d+d+d+d+d+d+N$g+n n n n o p O$P$ 2 $ $ ", +" - $ y$Q$X 7+X H$I$n+n+n+n+n+n+n+n+n+n+n+n+R$F#S$_$:$B$C$@$L$!#!#!#!#!#:#<#T$n+n+n+n+n+n+n+n+n+n+U$q+n n n n o p V$W$ 2 $ $ ", +" - $ X$Y$X X Y H$Z$v+v+v+v+v+v+v+v+v+v+v+v+R$F#;$`$_$r$[$@$L$!#!#!#!#!#:#<#T$v+v+v+v+v+v+v+v+v+v+ %q+n n n n o p V$W$ 2 $ $ ", +" - $ .%Y$X X Y H$+%A+A+A+A+A+A+A+A+A+A+A+A+@%F##%K$$%%%H#@$&%!#!#!#!#!#:#<#*%A+A+A+A+A+A+A+A+A+A+=%-%n n n n o p V$W$ 2 $ $ ", +" - $ ;%Y$X X Y H$>%F+F+F+F+F+F+F+F+F+F+F+F+@%F#F#F#F#G#H#@$&%!#!#!#!#!#:#<#,%F+F+F+F+F+F+F+F+F+F+'%)%n n n n o p !%~% 2 $ $ ", +" - $ ;%{%X X Y H$]%^%^%^%^%^%^%^%^%^%^%^%^%@%F#F#F#F#G#H#@$/%!#!#!#!#!#:#<#(%^%^%^%^%^%^%^%^%^%^%_%)%n n n n o p !%k@ 2 $ $ ", +" - $ ;%:%X X Y H$<%[%[%[%[%[%[%[%[%[%[%[%[%@%F#F#F#F#G#H#@$/%!#!#!#!#!#:#<#}%[%[%[%[%[%[%[%[%[%[%|%1%n n n n o p !%k@ 2 $ $ ", +" - $ $2%X X Y H$3%.@.@.@.@.@.@.@.@.@.@.@.@4%F#F#F#F#G#H#@$/%!#!#!#!#!#:#<#5%.@.@.@.@.@.@.@.@.@.@6%7%n n n n o p !%k@ 2 $ $ ", +" - $ $8%X X Y H$3%%@%@%@%@%@%@%@%@%@%@%@%@9%0%F#F#F#G#H#@$a%!#!#!#!#!#:#<#b%%@%@%@%@%@%@%@%@%@%@c%7%n n n n o p ~@l@ 2 $ $ ", +" - $ d%e%0@0@f%g%h%7@7@7@7@7@7@7@7@7@7@7@7@i%j%k%k%k%l%m%n%o%p%p%p%p%q%r%s%t%7@7@7@7@7@7@7@7@7@7@7@u%v%v%v%v%v%w%x%y% 2 $ $ ", +" - z%@ 2 $ $ ", +" . = A%u@u@u@u@u@u@u@u@u@u@u@u@u@u@u@u@u@u@u@u@u@u@u@u@u@u@u@u@u@u@u@u@u@u@u@u@u@u@u@u@u@u@u@u@u@u@u@u@u@u@u@u@u@u@u@u@u@+ $ $ ", +". B%C@$ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ ", +"+ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ "}; diff --git a/assets/bookshelf_02.xpm b/assets/bookshelf_02.xpm new file mode 100644 index 0000000..8be1d7e --- /dev/null +++ b/assets/bookshelf_02.xpm @@ -0,0 +1,821 @@ +/* XPM */ +static char * bookshelf_02_xpm[] = { +"64 64 754 2", +" c #9E7449", +". c #9D7348", +"+ c #835A32", +"@ c #9C7247", +"# c #845B33", +"$ c #754C24", +"% c #875E36", +"& c #774E26", +"* c #795028", +"= c #835A31", +"- c #865D35", +"; c #744C24", +"> c #744B24", +", c #734B24", +"' c #8F663C", +") c #634020", +"! c #603E1F", +"~ c #5F3E1F", +"{ c #593A1E", +"] c #58391E", +"^ c #55371E", +"/ c #52351D", +"( c #50351D", +"_ c #4B311C", +": c #4D311C", +"< c #472E1B", +"[ c #452D1A", +"} c #45353C", +"| c #465294", +"1 c #47549A", +"2 c #425095", +"3 c #3C4B8D", +"4 c #4A393E", +"5 c #9B7248", +"6 c #8F663D", +"7 c #4A301B", +"8 c #412A1A", +"9 c #602C1F", +"0 c #A5312D", +"a c #A7312D", +"b c #A8312E", +"c c #AE322F", +"d c #AA312E", +"e c #9A2620", +"f c #92261E", +"g c #482A1A", +"h c #412B1B", +"i c #43549A", +"j c #456CD1", +"k c #466ED2", +"l c #3A66CA", +"m c #2D5FC2", +"n c #404D8D", +"o c #49301B", +"p c #402A19", +"q c #442A1A", +"r c #4A2A1B", +"s c #492A1A", +"t c #432A19", +"u c #A5302C", +"v c #DC363A", +"w c #DB3539", +"x c #CA2124", +"y c #C72023", +"z c #75271C", +"A c #49382D", +"B c #554840", +"C c #65574F", +"D c #827870", +"E c #837972", +"F c #5E524E", +"G c #4F4340", +"H c #4458A0", +"I c #598BDE", +"J c #3C67CA", +"K c #404D90", +"L c #7D3224", +"M c #A6302D", +"N c #B33230", +"O c #C03434", +"P c #C73435", +"Q c #C33334", +"R c #A72623", +"S c #98251E", +"T c #66281A", +"U c #3F2918", +"V c #3E3118", +"W c #325214", +"X c #2D6A11", +"Y c #2D6B11", +"Z c #2C6210", +"` c #354213", +" . c #AC332E", +".. c #C82023", +"+. c #83261C", +"@. c #402919", +"#. c #422A1B", +"$. c #462A1E", +"%. c #442A1C", +"&. c #B4B2B0", +"*. c #F9FAFA", +"=. c #FAFBFB", +"-. c #FBFCFB", +";. c #FBFCFC", +">. c #DBE5F8", +",. c #D7E1F5", +"'. c #7689C7", +"). c #598CDE", +"!. c #3C68CA", +"~. c #3F4D8F", +"{. c #A9352E", +"]. c #CC2427", +"^. c #C92023", +"/. c #97241E", +"(. c #3E2818", +"_. c #3D2D18", +":. c #187C0B", +"<. c #0A8D07", +"[. c #088E07", +"}. c #048204", +"|. c #087301", +"1. c #A5512A", +"2. c #E03C41", +"3. c #E44147", +"4. c #DD373B", +"5. c #88251D", +"6. c #83374D", +"7. c #B84572", +"8. c #BC4774", +"9. c #C24978", +"0. c #CC4C7E", +"a. c #C64A7A", +"b. c #B23C65", +"c. c #AB3A60", +"d. c #552B28", +"e. c #BFBDBC", +"f. c #FEFFFF", +"g. c #F8FBFE", +"h. c #EEF4FE", +"i. c #F5F9FE", +"j. c #DFE9FC", +"k. c #DCE7FC", +"l. c #90A6E2", +"m. c #AA372E", +"n. c #98241E", +"o. c #3D2817", +"p. c #3B2E17", +"q. c #13800A", +"r. c #088F07", +"s. c #057401", +"t. c #A5532A", +"u. c #E34046", +"v. c #E7464C", +"w. c #DD383C", +"x. c #982726", +"y. c #3B3033", +"z. c #3B2F32", +"A. c #3C2A22", +"B. c #B74572", +"C. c #F5589B", +"D. c #F4579A", +"E. c #E74986", +"F. c #E44884", +"G. c #913650", +"H. c #BFBEBC", +"I. c #F2F7FE", +"J. c #DDE8FC", +"K. c #EDF3FD", +"L. c #A7B7E8", +"M. c #3E4D90", +"N. c #AC392E", +"O. c #DE393D", +"P. c #992823", +"Q. c #5D514A", +"R. c #7F766F", +"S. c #5F5A51", +"T. c #158812", +"U. c #09A008", +"V. c #09A308", +"W. c #09A508", +"X. c #048404", +"Y. c #E23F45", +"Z. c #C82227", +"`. c #795F90", +" + c #0781CA", +".+ c #067CC4", +"++ c #265682", +"@+ c #F5599C", +"#+ c #F4589A", +"$+ c #E64885", +"%+ c #AD3C62", +"&+ c #C6C3C2", +"*+ c #F4F8FE", +"=+ c #DEE8FC", +"-+ c #A8B8E8", +";+ c #3C5094", +">+ c #9B7249", +",+ c #AC382E", +"'+ c #E23F44", +")+ c #B36A66", +"!+ c #F6F7F7", +"~+ c #E0E9F5", +"{+ c #52A45D", +"]+ c #089007", +"^+ c #0AAF09", +"/+ c #0AB009", +"(+ c #C6242B", +"_+ c #526EAA", +":+ c #0084CF", +"<+ c #007FC8", +"[+ c #166498", +"}+ c #B84674", +"|+ c #F666AA", +"1+ c #F871B7", +"2+ c #F55C9F", +"3+ c #AE3C63", +"4+ c #C6C4C2", +"5+ c #F6F9FE", +"6+ c #DEE9FC", +"7+ c #AB382E", +"8+ c #E03D42", +"9+ c #B97672", +"0+ c #FDFFFF", +"a+ c #E3EDF9", +"b+ c #5DA96A", +"c+ c #C6252E", +"d+ c #4871AF", +"e+ c #156499", +"f+ c #B74674", +"g+ c #F767AB", +"h+ c #F872B8", +"i+ c #F55FA3", +"j+ c #E13E43", +"k+ c #B97671", +"l+ c #DF3A3E", +"m+ c #C52732", +"n+ c #3877B8", +"o+ c #146399", +"p+ c #B74574", +"q+ c #AD3C63", +"r+ c #3B5094", +"s+ c #B97571", +"t+ c #E4EDFA", +"u+ c #5FAA6C", +"v+ c #3877B9", +"w+ c #B74573", +"x+ c #C6C3C1", +"y+ c #F7FAFE", +"z+ c #3B4F94", +"A+ c #B87571", +"B+ c #E5EEFB", +"C+ c #7DB58F", +"D+ c #136399", +"E+ c #AD3B63", +"F+ c #C5C3C1", +"G+ c #F9FBFE", +"H+ c #3F5295", +"I+ c #AE3C2F", +"J+ c #7FB590", +"K+ c #008ED3", +"L+ c #008ACC", +"M+ c #F873B9", +"N+ c #F561A5", +"O+ c #465696", +"P+ c #9C7349", +"Q+ c #DF3B40", +"R+ c #0098D6", +"S+ c #0094CF", +"T+ c #0B6BA6", +"U+ c #B74675", +"V+ c #F562A7", +"W+ c #AD3B62", +"X+ c #EAF1FD", +"Y+ c #465596", +"Z+ c #9C7249", +"`+ c #0AAA09", +" @ c #0AAE09", +".@ c #0AA909", +"+@ c #DF3C41", +"@@ c #0B6BA7", +"#@ c #AC3861", +"$@ c #BEBDBC", +"%@ c #FAFDFF", +"&@ c #E9F0FD", +"*@ c #598CDF", +"=@ c #3E6ACC", +"-@ c #465697", +";@ c #B87471", +">@ c #C52731", +",@ c #3976B8", +"'@ c #0A6AA7", +")@ c #B74575", +"!@ c #BDBDBC", +"~@ c #FDFEFF", +"{@ c #3E6BCC", +"]@ c #4D60A3", +"^@ c #9C734C", +"/@ c #B87470", +"(@ c #E34045", +"_@ c #DD393D", +":@ c #516EAA", +"<@ c #0A6AA6", +"[@ c #F664A7", +"}@ c #E0EAFC", +"|@ c #5465A6", +"1@ c #9C744D", +"2@ c #E6454B", +"3@ c #B77470", +"4@ c #037500", +"5@ c #A35629", +"6@ c #B64575", +"7@ c #F664A8", +"8@ c #F76EB3", +"9@ c #F662A6", +"0@ c #AC3761", +"a@ c #FCFEFF", +"b@ c #B24230", +"c@ c #DC373B", +"d@ c #B77370", +"e@ c #007500", +"f@ c #A15C28", +"g@ c #096AA6", +"h@ c #F5589C", +"i@ c #AB3761", +"j@ c #BDBCBC", +"k@ c #3B66CA", +"l@ c #5D66A1", +"m@ c #9D744C", +"n@ c #B64475", +"o@ c #65689C", +"p@ c #9D744B", +"q@ c #086AA6", +"r@ c #B67270", +"s@ c #AB3661", +"t@ c #9D744A", +"u@ c #B6726F", +"v@ c #746A97", +"w@ c #076AA6", +"x@ c #AA3761", +"y@ c #BCBBBB", +"z@ c #FDFEFD", +"A@ c #FDFDFD", +"B@ c #FCFDFC", +"C@ c #DDE6F9", +"D@ c #A7B6E4", +"E@ c #496CCE", +"F@ c #4B6CCE", +"G@ c #4B6CCD", +"H@ c #4366C6", +"I@ c #3860BF", +"J@ c #796B93", +"K@ c #B14532", +"L@ c #DA3A3B", +"M@ c #D93A3A", +"N@ c #CA2B29", +"O@ c #C52D28", +"P@ c #B27068", +"Q@ c #EDE8E4", +"R@ c #F0EBE7", +"S@ c #D7D7DB", +"T@ c #83A57C", +"U@ c #42871F", +"V@ c #43871F", +"W@ c #528625", +"X@ c #5A8529", +"Y@ c #597D28", +"Z@ c #597527", +"`@ c #9D6939", +" # c #C05B42", +".# c #B6573A", +"+# c #B3573C", +"@# c #7F7185", +"## c #737C9F", +"$# c #737A9A", +"%# c #736F82", +"&# c #AA6062", +"*# c #D0677B", +"=# c #CF677A", +"-# c #C7616D", +";# c #C16368", +"># c #A05F51", +",# c #A7907D", +"'# c #C8B4A4", +")# c #C1AB97", +"!# c #BBA188", +"~# c #BAA087", +"{# c #AB8E75", +"]# c #A9896E", +"^# c #9E7F69", +"/# c #927363", +"(# c #9B7456", +"_# c #9C7455", +":# c #9B7354", +"<# c #9B7353", +"[# c #9D744E", +"}# c #875E35", +"|# c #9E7248", +"1# c #A17248", +"2# c #A07248", +"3# c #9F744A", +"4# c #A27B55", +"5# c #A07952", +"6# c #9D764A", +"7# c #9C7548", +"8# c #9C7448", +"9# c #9D7448", +"0# c #8B6239", +"a# c #8B633A", +"b# c #8C633A", +"c# c #92693F", +"d# c #946A40", +"e# c #966C42", +"f# c #986E44", +"g# c #996F44", +"h# c #9C7348", +"i# c #8F653C", +"j# c #764D25", +"k# c #774E27", +"l# c #825931", +"m# c #6E4823", +"n# c #6E4723", +"o# c #6B4622", +"p# c #694421", +"q# c #684421", +"r# c #644121", +"s# c #7A5530", +"t# c #452D1B", +"u# c #442D1A", +"v# c #432C1A", +"w# c #422C1A", +"x# c #452C1B", +"y# c #4E2C1C", +"z# c #512C1C", +"A# c #4C2B1A", +"B# c #432B1A", +"C# c #7B5937", +"D# c #412B1A", +"E# c #402E27", +"F# c #3E363A", +"G# c #324D68", +"H# c #2E5D8A", +"I# c #2D6499", +"J# c #2D6397", +"K# c #314D6B", +"L# c #3B373D", +"M# c #402E26", +"N# c #422B1A", +"O# c #832E25", +"P# c #B23230", +"Q# c #CF3537", +"R# c #D83639", +"S# c #D73538", +"T# c #BE2223", +"U# c #9D251F", +"V# c #805837", +"W# c #3F3226", +"X# c #37433B", +"Y# c #344943", +"Z# c #3E3326", +"`# c #443021", +" $ c #54473F", +".$ c #5A4D44", +"+$ c #73675F", +"@$ c #827971", +"#$ c #7E746D", +"$$ c #5D514C", +"%$ c #50433F", +"&$ c #463328", +"*$ c #2E5F8F", +"=$ c #0682CB", +"-$ c #0283CD", +";$ c #0084CE", +">$ c #0179C0", +",$ c #0574B9", +"'$ c #2E5785", +")$ c #453124", +"!$ c #4E3E36", +"~$ c #402A1A", +"{$ c #B33231", +"]$ c #C62023", +"^$ c #8E5838", +"/$ c #5F3D1F", +"($ c #3E3025", +"_$ c #12858B", +":$ c #059098", +"<$ c #04939B", +"[$ c #0E7A76", +"}$ c #3E3022", +"|$ c #A09C99", +"1$ c #F8F9F9", +"2$ c #FAFAFA", +"3$ c #E3EBF9", +"4$ c #D8E3F6", +"5$ c #999BA6", +"6$ c #2C6499", +"7$ c #007AC1", +"8$ c #0076BC", +"9$ c #3C628F", +"0$ c #CAC8C7", +"a$ c #DDE0E6", +"b$ c #82828A", +"c$ c #452919", +"d$ c #B93332", +"e$ c #955738", +"f$ c #5E3D1F", +"g$ c #3D2E18", +"h$ c #344B14", +"i$ c #2D6412", +"j$ c #2D6212", +"k$ c #344327", +"l$ c #078F97", +"m$ c #01A2A9", +"n$ c #01A8AF", +"o$ c #087D78", +"p$ c #3D2F23", +"q$ c #E6EFFD", +"r$ c #A7ACBA", +"s$ c #2B6399", +"t$ c #008FD3", +"u$ c #0093D5", +"v$ c #0095D5", +"w$ c #007BC2", +"x$ c #476994", +"y$ c #442819", +"z$ c #B83232", +"A$ c #965738", +"B$ c #5E3D1E", +"C$ c #2C6911", +"D$ c #0B8C07", +"E$ c #088D07", +"F$ c #04761F", +"G$ c #019097", +"H$ c #01A3AA", +"I$ c #01A9AF", +"J$ c #3C2F22", +"K$ c #AFADBC", +"L$ c #B2436E", +"M$ c #B64370", +"N$ c #AE3B62", +"O$ c #8F344E", +"P$ c #2E6399", +"Q$ c #0086D0", +"R$ c #00A7DC", +"S$ c #00A9DD", +"T$ c #007CC2", +"U$ c #A7AFC4", +"V$ c #415298", +"W$ c #41539A", +"X$ c #3D4F96", +"Y$ c #364A8F", +"Z$ c #403B65", +"`$ c #A35739", +" % c #2A6A10", +".% c #0AA609", +"+% c #099E08", +"@% c #00771F", +"#% c #3A2E22", +"$% c #E7B3D2", +"%% c #F35698", +"&% c #E64986", +"*% c #E04782", +"=% c #41649A", +"-% c #00A8DC", +";% c #466994", +">% c #A8B8E7", +",% c #456DD1", +"'% c #4972D3", +")% c #3D67CC", +"!% c #394F98", +"~% c #B83335", +"{% c #A45739", +"]% c #5D3C1E", +"^% c #0AAB09", +"/% c #099F08", +"(% c #392E21", +"_% c #E9B3D3", +":% c #E24783", +"<% c #4D79D6", +"[% c #3E69CC", +"}% c #38529D", +"|% c #B83336", +"1% c #296A0F", +"2% c #382D21", +"3% c #40649A", +"4% c #456994", +"5% c #4E7AD7", +"6% c #3754A5", +"7% c #B83439", +"8% c #E23E44", +"9% c #E7454B", +"0% c #5D3C1D", +"a% c #286A0F", +"b% c #077D78", +"c% c #372C21", +"d% c #E24782", +"e% c #3657AC", +"f% c #B7343B", +"g% c #276A0F", +"h% c #362C20", +"i% c #F65CA0", +"j% c #F663A7", +"k% c #F666AB", +"l% c #F45FA2", +"m% c #40639A", +"n% c #B25739", +"o% c #5C3B1D", +"p% c #266A0E", +"q% c #0AA808", +"r% c #352B20", +"s% c #F567AB", +"t% c #3F639A", +"u% c #446894", +"v% c #B7333B", +"w% c #B5573A", +"x% c #09A708", +"y% c #067D78", +"z% c #332C21", +"A% c #F661A5", +"B% c #00A8DD", +"C% c #00A6DC", +"D% c #4C77D5", +"E% c #C92123", +"F% c #B2593B", +"G% c #25690E", +"H% c #057D79", +"I% c #2E3329", +"J% c #F660A3", +"K% c #0085CF", +"L% c #0091D4", +"M% c #008DD2", +"N% c #0088D0", +"O% c #007AC2", +"P% c #4B76D5", +"Q% c #355AB5", +"R% c #B7343E", +"S% c #E03C42", +"T% c #AF5B3D", +"U% c #5B3B1C", +"V% c #25690D", +"W% c #2D3329", +"X% c #F569AD", +"Y% c #3E639A", +"Z% c #436894", +"`% c #355DBE", +" & c #B73441", +".& c #DE383D", +"+& c #DE3A3E", +"@& c #5B3A1C", +"#& c #24690D", +"$& c #01AAB0", +"%& c #2C3329", +"&& c #F56AAE", +"*& c #E74987", +"=& c #B63441", +"-& c #23690D", +";& c #09A608", +">& c #01ACB3", +",& c #047D79", +"'& c #2B3229", +")& c #F65EA2", +"!& c #3D639A", +"~& c #C82224", +"{& c #AC5F3F", +"]& c #22690C", +"^& c #01ADB3", +"/& c #2A3228", +"(& c #F65DA0", +"_& c #426894", +":& c #C82324", +"<& c #AA6140", +"[& c #5A3A1C", +"}& c #21690C", +"|& c #293128", +"1& c #F872B7", +"2& c #345DBE", +"3& c #B63340", +"4& c #5C3B1C", +"5& c #01ABB2", +"6& c #283027", +"7& c #F55B9E", +"8& c #F35799", +"9& c #3C629A", +"0& c #4B75D5", +"a& c #588ADE", +"b& c #315DBE", +"c& c #AD323F", +"d& c #5E3C1D", +"e& c #01929B", +"f& c #01929A", +"g& c #047C78", +"h& c #273027", +"i& c #416894", +"j& c #3D67CB", +"k& c #305DBE", +"l& c #AA313E", +"m& c #C82525", +"n& c #A56844", +"o& c #20690B", +"p& c #01919A", +"q& c #019099", +"r& c #262F27", +"s& c #3B629A", +"t& c #416794", +"u& c #A56944", +"v& c #1F690B", +"w& c #252F27", +"x& c #E8B8D8", +"y& c #AA303E", +"z& c #1E690B", +"A& c #242E26", +"B& c #E6BCDB", +"C& c #F55A9C", +"D& c #406794", +"E& c #1E690A", +"F& c #232E26", +"G& c #3A629A", +"H& c #2F5DBE", +"I& c #C72825", +"J& c #77512D", +"K& c #756E34", +"L& c #738234", +"M& c #738134", +"N& c #737638", +"O& c #738378", +"P& c #73847A", +"Q& c #738379", +"R& c #737864", +"S& c #75593A", +"T& c #AE9D91", +"U& c #D5C9C1", +"V& c #C7BEC0", +"W& c #C1BABF", +"X& c #C79DA7", +"Y& c #CF687B", +"Z& c #CE6679", +"`& c #C4616B", +" * c #796B7A", +".* c #737C9E", +"+* c #737795", +"@* c #737591", +"#* c #7A6E76", +"$* c #D2C6BE", +"%* c #CBC2C0", +"&* c #A39BB0", +"** c #7C70A0", +"=* c #7A6E9C", +"-* c #776A96", +";* c #776993", +">* c #A45A44", +",* c #B4583A", +"'* c #9F7348", +")* c #825A32", +"!* c #8A6138", +"~* c #865D34", +" . + ", +" . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . @ # $ ", +" % & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & * = $ $ ", +" - $ $ $ $ $ $ $ ; ; ; ; ; ; > > > > > > > > > > > > , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , ; ' ' $ $ ", +" - ; ) ! ! ! ~ { ] ] ] ] ] ^ / / / / / ( _ _ _ _ _ : < [ [ [ [ [ [ [ [ [ [ [ [ [ [ [ [ [ [ [ [ [ [ [ } | 1 1 1 2 3 4 5 6 $ $ ", +" - > 7 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 9 0 a b c d e f g 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 h i j j k k l m n 5 6 $ $ ", +" - > o p q g r s t p p p p p p p p p p p p u v v v v w x y z p p p p p p p p p p p p A B C D E D F G H j k I I J m K 5 6 $ $ ", +" - > L M N O P Q R S T U U U V W X Y Y Z ` .v v v v w x ..+.U U U U U @.#.$.%.@.U U &.*.=.-.;.=.>.,.'.j k ).).!.m ~.5 6 $ $ ", +" - > {.v v v v w ].^./.(.(._.:.<.[.[.[.}.|.1.v v 2.3.4.x ..5.(.(.(.6.7.8.9.0.a.b.c.d.e.f.f.g.h.i.j.k.l.j k ).).!.m ~.5 6 $ $ ", +" - > m.v v v v w ].^.n.o.o.p.q.[.[.[.r.}.s.t.v v u.v.w.x ^.x.y.z.A.B.C.C.C.C.D.E.F.G.H.f.f.I.J.K.j.J.L.j k ).).!.m M.5 6 $ $ ", +" - > N.v v 2.u.O.].^.P.Q.R.S.T.r.U.V.W.X.s.t.v v Y.v.w.x Z.`. +.+++7.C.C.@+@+#+E.$+%+&+f.f.*+=+K.j.J.-+j k ).).!.m ;+>+6 $ $ ", +" - > ,+v v '+v.2.].^.)+!+=.~+{+]+^+/+^+X.s.t.v v '+v.w.x (+_+:+<+[+}+C.C.|+1+2+E.$+3+4+f.f.5+6+K.j.J.-+j k ).).!.m ;+>+6 $ $ ", +" - > 7+v v '+v.8+].^.9+-.0+a+b+]+^+/+^+X.s.t.v v '+v.O.x c+d+:+<+e+f+C.C.g+h+i+E.$+3+4+f.f.5+6+K.j.J.-+j k ).).!.m ;+>+6 $ $ ", +" - > 7+v v j+v.j+].^.k+-.0+a+b+]+^+/+^+X.s.t.v v '+v.l+x m+n+:+<+o+p+C.C.g+h+i+E.$+q+&+f.f.5+6+K.j.J.-+j k ).).!.m r+>+6 $ $ ", +" - > 7+v v 8+v.j+].^.s+-.0+t+u+]+^+/+^+X.s.t.v v '+v.l+x m+v+:+<+o+w+C.C.g+h+i+E.$+q+x+f.f.y+6+K.j.J.-+j k ).).!.m z+>+6 $ $ ", +" - > N.v v 8+v.j+].^.A+-.0+B+C+]+^+/+^+X.s.t.v v '+v.l+x m+v+:+<+D+w+C.C.g+h+i+E.$+E+F+f.f.G+6+K.j.J.-+j k ).).!.m H+>+6 $ $ ", +" - ; I+v v 8+v.j+].^.A+-.0+B+J+]+^+/+^+X.s.t.v v '+v.l+x m+v+K+L+D+w+C.C.g+M+N+E.$+E+F+f.f.G+6+K.6+J.-+j k ).).!.m O+P+6 $ $ ", +" - ; I+v v 8+v.j+].^.A+-.0+B+J+]+^+/+^+X.s.t.v v '+v.Q+x m+v+R+S+T+U+C.C.g+M+V+E.$+W+F+f.f.G+6+X+6+J.-+j k ).).!.m Y+Z+6 $ $ ", +" - ; I+v v 8+v.j+].^.A+-.0+B+J+r.`+ @.@X.s.t.v v '+v.+@x m+v+R+S+@@U+C.C.g+M+V+E.$+#@$@f.f.%@6+&@6+J.-+j k ).*@=@m -@P+6 $ $ ", +" - ; I+v v 8+v.j+].^.;@-.0+B+J+[.r.]+r.}.s.t.v v '+v.+@x >@,@R+S+'@)@C.C.g+M+V+E.$+#@!@f.f.~@j.&@6+J.-+j k ).*@{@m ]@^@6 $ $ ", +" - ; I+v v 8+v.j+].^./@-.0+B+J+[.[.[.[.}.s.t.v v Q+(@_@x (+:@R+S+<@)@C.C.g+M+[@E.$+#@!@f.f.~@}@X+6+J.-+j k ).*@{@m |@1@6 $ $ ", +" - ; I+v v 2.2@j+].^.3@-.0+B+J+[.[.[.[.}.4@5@v v v v w x (+_+R+S+<@6@C.C.7@8@9@E.$+0@!@f.f.f.~@a@6+J.-+j k ).*@{@m |@1@6 $ $ ", +" - $ b@v v v c@v ].^.d@-.0+B+J+[.[.[.[.}.e@f@v v v v w x (+_+R+S+g@6@C.C.h@@+#+E.$+i@!@f.f.f.f.~@j.J.-+j k I I {@m |@1@6 $ $ ", +" - $ b@v v v v w ].^.d@-.0+B+J+[.[.[.[.}.e@f@v v v v w x (+_+K+L+g@6@C.C.C.C.D.E.$+i@j@f.f.f.f.~@j.J.-+j j k k k@m l@m@6 $ $ ", +" - $ b@v v v v w ].^.d@-.0+B+J+[.[.[.[.}.e@f@v v v v w x (+_+:+<+g@n@C.C.C.C.D.E.$+i@j@f.f.f.f.~@j.J.-+j j j j l m o@p@6 $ $ ", +" - $ b@v v v v w ].^.d@-.0+B+J+[.[.[.[.}.e@f@v v v v w x (+_+:+<+q@n@C.C.C.C.D.E.$+i@j@f.f.f.f.~@j.J.-+j j j j l m o@p@6 $ $ ", +" - $ b@v v v v w ].^.r@-.0+B+J+[.[.[.[.}.e@f@v v v v w x (+_+:+<+q@n@C.C.C.C.D.E.$+s@j@f.f.f.f.~@j.J.-+j j j j l m o@t@6 $ $ ", +" - $ b@v v v v w ].^.u@-.0+B+J+[.[.[.[.}.e@f@v v v v w x (+_+:+<+q@n@C.C.C.C.D.E.$+s@j@f.f.f.f.~@j.J.-+j j j j l m v@ 6 $ $ ", +" - $ b@v v v v w ].^.u@-.0+B+J+[.[.[.[.}.e@f@v v v v w x (+_+:+<+w@n@C.C.C.C.D.E.$+x@y@z@A@B@B@;.C@>.D@E@F@G@G@H@I@J@ 6 $ $ ", +" - $ K@L@L@L@L@M@N@O@P@Q@R@S@T@U@V@W@X@Y@Z@`@ # # # # #.#+#@###$#%#&#*#*#*#*#=#-#;#>#,#'#)#!#!#~#{#]#^#/#(#_#_#:#<#[# 6 $ $ ", +" % }#|#1#1#1#1#1#2#2#3#4#4#5#6#7#7#8#9#9#9# 6 $ $ ", +" ' 0#a#a#a#a#a#a#a#a#a#a#a#a#a#a#a#a#a#a#a#b#' 6 6 6 6 6 6 6 c#d#d#d#d#d#d#d#e#f#f#f#f#f#f#f#g#h#. . . . . . . . . . . i#$ $ ", +" - $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ j#j#j#j#j#j#j#j#j#& & & & & & & & & & & & & & & & & & k#l#}#$ $ ", +" - $ ; > > , , , , , , , , , , , , , , , , , , , , , , , m#n#n#n#o#p#p#p#q#r#r#r#r#) ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! s#. 6 $ $ ", +" - $ ) _ o t#[ [ [ [ [ [ [ [ [ [ [ [ [ [ [ [ [ [ [ [ [ [ u#u#u#u#u#v#v#v#v#v#v#v#v#w#w#w#w#w#w#w#w#w#x#y#z#z#z#A#B#C# 6 $ $ ", +" - $ ~ D#D#D#D#D#D#D#D#D#D#D#D#D#D#D#D#D#D#D#D#D#D#D#D#D#D#E#F#G#H#I#J#K#L#M#D#D#D#D#D#D#D#D#D#D#N#O#P#Q#R#R#S#T#U#V# 6 $ $ ", +" - $ ~ p p p p p W#X#Y#Z#p `# $.$+$@$#$$$%$&$p p p p p p p *$=$-$;$:+:+>$,$'$)$ $!$~$p p p p p p q {$v v v v w x ]$^$ 6 $ $ ", +" - $ /$U U U U ($_$:$<$[$}$|$1$2$=.;.=.3$4$5$U U U U U U U 6$:+:+:+:+:+7$8$9$0$1$a$b$U U U U U U c$d$v v v v w x y e$ 6 $ $ ", +" - $ f$g$h$i$j$k$l$m$n$o$p$e.f.f.f.f.0+q$J.r$(.(.(.(.(.(.(.s$:+:+t$u$v$w$8$x$2$f.h.r$(.(.(.(.(.(.y$z$v v v v w x y A$ 6 $ $ ", +" - $ B$C$D$r.E$F$G$H$I$o$J$e.f.f.f.f.0+q$J.K$L$7.7.7.M$N$O$P$:+Q$R$S$R$T$8$x$2$f.h.U$V$W$W$W$X$Y$Z$z$v v v v w x ..`$ 6 $ $ ", +" - $ B$ %r..%+%@%G$H$I$o$#%$@f.f.f.f.0+q$J.$%C.C.C.C.%%&%*%=%:+Q$-%S$R$T$8$;%2$f.h.>%j j ,%'%)%m !%~%v v v c@w x ..{% 6 $ $ ", +" - $ ]% %r.^%/%@%G$H$I$o$(%$@f.f.f.f.0+q$J._%C.C.C.C.%%&%:%=%:+Q$-%S$R$T$8$;%*.f.h.-+j j <%I [%m }%|%v v j+2@v x ..{% 6 $ $ ", +" - $ ]%1%r.^%/%@%G$H$I$o$2%$@f.f.f.f.0+q$J._%C.C.C.C.%%&%:%3%:+Q$-%S$R$T$8$4%*.f.h.-+j j 5%I [%m 6%7%v v 8%9%v x ..`$ 6 $ $ ", +" - $ 0%a%r.^%/%@%G$H$I$b%c%$@f.f.f.f.0+q$J._%C.C.C.C.%%&%d%3%:+Q$-%S$R$T$8$4%*.f.h.-+j j 5%I [%m e%f%v v 8+2@v x ..{% 6 $ $ ", +" - $ 0%g%r.^%/%@%G$H$I$b%h%$@f.f.f.f.0+q$J._%C.i%j%k%l%&%d%m%:+Q$-%S$R$T$8$4%*.f.h.-+j j 5%I [%m e%f%v v 8+2@v x ^.n% 6 $ $ ", +" - $ o%p%r.q%/%@%G$H$I$b%r%$@f.f.f.f.0+q$J._%C.j%h+M+s%E.d%t%:+Q$-%S$R$T$8$u%*.f.h.-+j j 5%I [%m e%v%v v 8+2@v x ^.w% 6 $ $ ", +" - $ o%p%r.x%/%@%G$H$I$y%z%$@f.f.f.f.0+q$J._%C.A%M+M+s%E.d%t%:+Q$R$B%C%T$8$u%*.f.h.-+j j D%I [%m e%v%v v 8+2@v x E%F% 6 $ $ ", +" - $ o%G%r.x%/%@%G$H$I$H%I%$@f.f.f.f.0+q$J._%C.J%h+M+s%E.d%t%:+K%L%M%N%O%8$u%*.f.h.-+j j P%I [%m Q%R%v v S%2@v x E%T% 6 $ $ ", +" - $ U%V%r.x%/%@%G$H$I$H%W%$@f.f.f.f.0+q$J._%C.J%h+M+X%E.d%Y%:+:+:+:+:+7$8$Z%*.f.h.-+j j P%I [%m `% &v v .&+&w x E%T% 6 $ $ ", +" - $ @&#&r.x%/%@%G$H$$&H%%&!@f.f.f.f.0+q$J._%C.J%h+M+&&*&d%Y%:+:+:+:+:+7$8$Z%*.f.h.-+j j P%I [%m `%=&v v v v w x E%T% 6 $ $ ", +" - $ @&-&r.;&/%@%G$H$>&,&'&!@f.f.f.f.0+q$J._%C.)&h+M+&&*&d%!&:+:+:+:+:+7$8$Z%*.f.h.-+j j P%I [%m `%=&v v v v w x ~&{& 6 $ $ ", +" - $ @&]&[.r.[.@%G$H$^&,&/&!@f.f.f.f.0+q$J._%C.(&h+M+&&*&d%!&:+:+:+:+:+7$8$_&*.f.h.-+j j P%I [%m `%=&v v v v w x :&<& 6 $ $ ", +" - $ [&}&[.[.E$@%G$H$^&,&|&!@f.f.f.f.0+q$J._%C.i%1&h+X%E.d%!&:+:+:+:+:+7$8$_&*.f.h.-+j j P%I [%m 2&3&v v v v w x :&<& 6 $ $ ", +" - $ 4&}&[.[.E$@%G$m$5&,&6&j@f.f.f.f.0+q$J._%C.@+)&7&8&&%d%9&:+:+:+:+:+7$8$_&*.f.h.-+j j 0&a&[%m b&c&v v v v w x :&<& 6 $ $ ", +" - $ d&}&[.[.E$@%G$e&f&g&h&j@f.f.f.f.0+q$J._%C.C.C.C.%%&%d%9&:+:+:+:+:+7$8$i&*.f.h.-+j j j k j&m k&l&v v v v w x m&n& 6 $ $ ", +" - $ d&o&[.[.E$@%G$p&q&g&r&j@f.f.f.f.0+q$J._%C.C.C.C.%%&%d%s&:+:+:+:+:+7$8$t&*.f.h.-+j j j j j&m k&l&v v v v w x m&u& 6 $ $ ", +" - $ d&v&[.[.E$@%G$p&q&g&w&j@f.f.f.f.0+q$J.x&@+C.C.C.%%&%d%s&:+:+:+:+:+7$8$t&*.f.h.-+j j j j j&m k&y&v v v v w x m&u& 6 $ $ ", +" - $ 0%z&[.[.E$@%G$p&q&g&A&j@f.f.f.f.0+q$J.B&C&C.C.C.%%&%d%s&:+:+:+:+:+7$8$D&*.f.h.-+j j j j j&m k&y&v v v v w x m&u& 6 $ $ ", +" - $ 0%E&[.[.E$@%G$p&q&g&F&j@f.f.f.f.0+q$J.B&C&C.C.C.%%&%d%G&:+:+:+:+:+7$8$D&*.f.h.-+j j j j j&m H&y&v v v v w x I&2# 6 $ $ ", +" - $ J&K&L&L&M&N&O&P&Q&R&S&T&U&U&U&U&U&V&W&X&Y&*#*#*#Z&-#`& *########.*+*@*#*$*U&%*&*********=*-*;*>* # # # # #.#,*'* 6 $ $ ", +" - )*@ 6 $ $ ", +" . = !*a#a#a#a#a#a#a#a#a#a#a#a#a#a#a#a#a#a#a#a#a#a#a#a#a#a#a#a#a#a#a#a#a#a#a#a#a#a#a#a#a#a#a#a#a#a#a#a#a#a#a#a#a#a#a#a#a#+ $ $ ", +". ~*j#$ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ ", +"+ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ "}; diff --git a/assets/bookshelf_03.xpm b/assets/bookshelf_03.xpm new file mode 100644 index 0000000..d746928 --- /dev/null +++ b/assets/bookshelf_03.xpm @@ -0,0 +1,753 @@ +/* XPM */ +static char * bookshelf_03_xpm[] = { +"64 64 686 2", +" c #9E7449", +". c #9D7348", +"+ c #835A32", +"@ c #9C7247", +"# c #845B33", +"$ c #754C24", +"% c #875E36", +"& c #774E26", +"* c #795028", +"= c #835A31", +"- c #865D35", +"; c #744C24", +"> c #744B24", +", c #734B24", +"' c #8E653C", +") c #8F663C", +"! c #634020", +"~ c #603E1F", +"{ c #5F3E1F", +"] c #593A1E", +"^ c #58391E", +"/ c #55371E", +"( c #52351D", +"_ c #50351D", +": c #4B311C", +"< c #462E1B", +"[ c #452D1A", +"} c #413B30", +"| c #336B6D", +"1 c #336E72", +"2 c #336766", +"3 c #335F58", +"4 c #473D2D", +"5 c #9B7247", +"6 c #8F663D", +"7 c #4A301B", +"8 c #412A1A", +"9 c #412B1B", +"0 c #296E72", +"a c #01919A", +"b c #01939B", +"c c #02888A", +"d c #027D78", +"e c #386058", +"f c #9B7248", +"g c #49301B", +"h c #402A19", +"i c #3F2C19", +"j c #3F2F19", +"k c #3F3019", +"l c #49382D", +"m c #554840", +"n c #65574F", +"o c #827870", +"p c #837972", +"q c #5E524E", +"r c #4F433F", +"s c #247377", +"t c #01B0B6", +"u c #02898C", +"v c #37615A", +"w c #425017", +"x c #2D6B11", +"y c #20730E", +"z c #187C0B", +"A c #14810A", +"B c #167D0A", +"C c #1E640A", +"D c #2B590E", +"E c #373D15", +"F c #3F2918", +"G c #3F291A", +"H c #3F2A1D", +"I c #3F2B22", +"J c #3F2A1F", +"K c #B4B2B0", +"L c #F9FAFA", +"M c #FAFBFB", +"N c #FBFCFB", +"O c #FBFCFC", +"P c #DBE5F8", +"Q c #D6E1F5", +"R c #629CA6", +"S c #01B1B7", +"T c #366159", +"U c #3A6C14", +"V c #088E07", +"W c #088D07", +"X c #017901", +"Y c #007500", +"Z c #2B580F", +"` c #3E2818", +" . c #403E67", +".. c #425299", +"+. c #42559D", +"@. c #4357A1", +"#. c #435CA9", +"$. c #4259A4", +"%. c #364C92", +"&. c #37498D", +"*. c #3D2E35", +"=. c #BFBDBC", +"-. c #FEFFFF", +";. c #F8FBFE", +">. c #EEF4FE", +",. c #F5F9FE", +"'. c #DFE9FC", +"). c #DBE7FB", +"!. c #7FB7C5", +"~. c #3E6E14", +"{. c #2A590E", +"]. c #3D2817", +"^. c #415299", +"/. c #456CD1", +"(. c #446BD0", +"_. c #2E60C3", +":. c #2D5EC0", +"<. c #374172", +"[. c #BFBEBC", +"}. c #F2F7FE", +"|. c #DDE8FC", +"1. c #EDF3FD", +"2. c #A1C2D2", +"3. c #34625A", +"4. c #426E15", +"5. c #099B08", +"6. c #09A408", +"7. c #089507", +"8. c #2D5A16", +"9. c #5D514A", +"0. c #7F766F", +"a. c #605652", +"b. c #3E2A1D", +"c. c #3C2717", +"d. c #40529A", +"e. c #466DD1", +"f. c #466ED2", +"g. c #446CD1", +"h. c #2D5FC2", +"i. c #384B8E", +"j. c #C6C3C2", +"k. c #F4F8FE", +"l. c #DEE8FC", +"m. c #A2C3D3", +"n. c #2E655D", +"o. c #416E15", +"p. c #09A008", +"q. c #0AB009", +"r. c #6E8362", +"s. c #F6F7F7", +"t. c #E0E8F5", +"u. c #6A6363", +"v. c #3B2616", +"w. c #507DD8", +"x. c #598BDE", +"y. c #4871D3", +"z. c #384B8F", +"A. c #C6C4C2", +"B. c #F6F9FE", +"C. c #DEE9FC", +"D. c #2D655D", +"E. c #099E08", +"F. c #7A8C6F", +"G. c #FDFFFF", +"H. c #E4ECFA", +"I. c #736D6F", +"J. c #3A2516", +"K. c #507ED8", +"L. c #5A8CDF", +"M. c #4A75D4", +"N. c #374B8F", +"O. c #798C6F", +"P. c #726D6F", +"Q. c #392415", +"R. c #3F529A", +"S. c #2C655D", +"T. c #406E14", +"U. c #099C08", +"V. c #736E70", +"W. c #372415", +"X. c #364A8F", +"Y. c #C6C3C1", +"Z. c #F7FAFE", +"`. c #436F15", +" + c #788C6F", +".+ c #E5EDFB", +"++ c #898A92", +"@+ c #362314", +"#+ c #3E519A", +"$+ c #4B75D4", +"%+ c #354A8F", +"&+ c #C5C3C1", +"*+ c #F9FBFE", +"=+ c #31675E", +"-+ c #4A7017", +";+ c #788B6E", +">+ c #8A8B93", +",+ c #352214", +"'+ c #5A8DDF", +")+ c #4C78D5", +"!+ c #386A60", +"~+ c #9B7348", +"{+ c #8A8A93", +"]+ c #342113", +"^+ c #3D519A", +"/+ c #4D79D6", +"(+ c #344A8F", +"_+ c #EAF1FD", +":+ c #332012", +"<+ c #30488F", +"[+ c #BEBDBC", +"}+ c #FAFDFF", +"|+ c #E9F0FD", +"1+ c #028C8F", +"2+ c #497017", +"3+ c #778B6E", +"4+ c #898A93", +"5+ c #321F12", +"6+ c #3C519A", +"7+ c #BDBDBC", +"8+ c #FDFEFF", +"9+ c #028D90", +"0+ c #39766A", +"a+ c #9C744A", +"b+ c #497016", +"c+ c #311E11", +"d+ c #4E7AD6", +"e+ c #2F478E", +"f+ c #E0EAFC", +"g+ c #407B6D", +"h+ c #4A7016", +"i+ c #0AAE09", +"j+ c #099F08", +"k+ c #778A6E", +"l+ c #301E10", +"m+ c #4F7BD7", +"n+ c #5686DC", +"o+ c #FCFEFF", +"p+ c #547319", +"q+ c #088F07", +"r+ c #089007", +"s+ c #898992", +"t+ c #2F1D10", +"u+ c #3B509A", +"v+ c #456DD1", +"w+ c #2E478E", +"x+ c #557319", +"y+ c #768A6D", +"z+ c #888992", +"A+ c #2E1C0F", +"B+ c #BDBCBC", +"C+ c #02888B", +"D+ c #4E7A6A", +"E+ c #758A6D", +"F+ c #2D1B0F", +"G+ c #3A509A", +"H+ c #2D478E", +"I+ c #02878A", +"J+ c #597968", +"K+ c #9D744A", +"L+ c #878992", +"M+ c #2B1A0E", +"N+ c #2C478E", +"O+ c #75896D", +"P+ c #878892", +"Q+ c #2A190E", +"R+ c #39509A", +"S+ c #2C468E", +"T+ c #5A7968", +"U+ c #75896C", +"V+ c #868891", +"W+ c #29190D", +"X+ c #395099", +"Y+ c #2B468E", +"Z+ c #6F7965", +"`+ c #74896C", +" @ c #28180D", +".@ c #2E5FC1", +"+@ c #2C478D", +"@@ c #BCBBBB", +"#@ c #FDFEFD", +"$@ c #FDFDFD", +"%@ c #FCFDFC", +"&@ c #DDE6F9", +"*@ c #A2C1CF", +"=@ c #169098", +"-@ c #209098", +";@ c #208788", +">@ c #217D76", +",@ c #757863", +"'@ c #59731D", +")@ c #238D0F", +"!@ c #238C0F", +"~@ c #20790A", +"{@ c #26750D", +"]@ c #778565", +"^@ c #EDE8E4", +"/@ c #F0EBE7", +"(@ c #D8D7DB", +"_@ c #8A807D", +":@ c #513822", +"<@ c #5C4127", +"[@ c #62462B", +"}@ c #63472B", +"|@ c #735333", +"1@ c #765535", +"2@ c #79647A", +"3@ c #7C70A0", +"4@ c #776A96", +"5@ c #7A6B8D", +"6@ c #7C6366", +"7@ c #A7907D", +"8@ c #C8B4A4", +"9@ c #C1AB97", +"0@ c #BBA188", +"a@ c #BAA087", +"b@ c #AB8E75", +"c@ c #A9896E", +"d@ c #9A8164", +"e@ c #8B7857", +"f@ c #9A764F", +"g@ c #9B754F", +"h@ c #9B754D", +"i@ c #9B744C", +"j@ c #875E35", +"k@ c #9B7347", +"l@ c #9B7548", +"m@ c #9B7447", +"n@ c #9B7448", +"o@ c #9D754A", +"p@ c #A27B55", +"q@ c #A07952", +"r@ c #9D744B", +"s@ c #9C7348", +"t@ c #8B6239", +"u@ c #8B633A", +"v@ c #8C633A", +"w@ c #936940", +"x@ c #946A40", +"y@ c #966C42", +"z@ c #986E44", +"A@ c #996F44", +"B@ c #8F653C", +"C@ c #764D25", +"D@ c #774E27", +"E@ c #825931", +"F@ c #6E4823", +"G@ c #6E4723", +"H@ c #6B4622", +"I@ c #694421", +"J@ c #684421", +"K@ c #644121", +"L@ c #7A5530", +"M@ c #452D1B", +"N@ c #442D1A", +"O@ c #432C1A", +"P@ c #422C1A", +"Q@ c #452C1B", +"R@ c #4E2C1C", +"S@ c #512C1C", +"T@ c #4C2B1A", +"U@ c #432B1A", +"V@ c #7B5937", +"W@ c #412B1A", +"X@ c #402F19", +"Y@ c #3E3818", +"Z@ c #335215", +"`@ c #306313", +" # c #2E6B12", +".# c #2E6A12", +"+# c #314F13", +"@# c #3B3717", +"## c #402E19", +"$# c #422B1A", +"%# c #832E25", +"&# c #B23230", +"*# c #CF3537", +"=# c #D83639", +"-# c #D73538", +";# c #BE2223", +"># c #9D251F", +",# c #805837", +"'# c #3F3226", +")# c #37433B", +"!# c #344943", +"~# c #3E3326", +"{# c #443021", +"]# c #54473F", +"^# c #5A4D44", +"/# c #73675F", +"(# c #827971", +"_# c #7E746D", +":# c #5D514C", +"<# c #50433F", +"[# c #463328", +"}# c #2F6612", +"|# c #0E8B08", +"1# c #0A8D07", +"2# c #037B02", +"3# c #057301", +"4# c #2E5610", +"5# c #453124", +"6# c #4E3E36", +"7# c #402A1A", +"8# c #442A1A", +"9# c #B33231", +"0# c #DC363A", +"a# c #DB3539", +"b# c #CA2124", +"c# c #C62023", +"d# c #8E5838", +"e# c #5F3D1F", +"f# c #3E3025", +"g# c #12858B", +"h# c #059098", +"i# c #04939B", +"j# c #0E7A76", +"k# c #3E3022", +"l# c #A09C99", +"m# c #F8F9F9", +"n# c #FAFAFA", +"o# c #E3EBF9", +"p# c #D8E3F6", +"q# c #999BA6", +"r# c #027C02", +"s# c #3C612C", +"t# c #CAC8C7", +"u# c #DDE0E6", +"v# c #82828A", +"w# c #452919", +"x# c #B93332", +"y# c #C72023", +"z# c #955738", +"A# c #5E3D1F", +"B# c #3D2E18", +"C# c #344B14", +"D# c #2D6412", +"E# c #2D6212", +"F# c #344327", +"G# c #078F97", +"H# c #01A2A9", +"I# c #01A8AF", +"J# c #087D78", +"K# c #3D2F23", +"L# c #E6EFFD", +"M# c #A7ACBA", +"N# c #2C6B11", +"O# c #099708", +"P# c #099D08", +"Q# c #027D02", +"R# c #47693C", +"S# c #442819", +"T# c #B83232", +"U# c #965738", +"V# c #5E3D1E", +"W# c #2C6911", +"X# c #0B8C07", +"Y# c #04761F", +"Z# c #019097", +"`# c #01A3AA", +" $ c #01A9AF", +".$ c #3C2F22", +"+$ c #AFADBC", +"@$ c #B2436E", +"#$ c #B84572", +"$$ c #B64370", +"%$ c #AE3B62", +"&$ c #8F344E", +"*$ c #2F6B13", +"=$ c #027E02", +"-$ c #A7AFC4", +";$ c #415298", +">$ c #41539A", +",$ c #3D4F96", +"'$ c #403B65", +")$ c #C82023", +"!$ c #A35739", +"~$ c #2A6A10", +"{$ c #0AA609", +"]$ c #00771F", +"^$ c #3A2E22", +"/$ c #E7B3D2", +"($ c #F5589B", +"_$ c #F35698", +":$ c #E64986", +"<$ c #E04782", +"[$ c #416B20", +"}$ c #0AAF09", +"|$ c #46683C", +"1$ c #A8B8E7", +"2$ c #4972D3", +"3$ c #3D67CC", +"4$ c #394F98", +"5$ c #B83335", +"6$ c #DC373B", +"7$ c #A45739", +"8$ c #5D3C1E", +"9$ c #0AAB09", +"0$ c #392E21", +"a$ c #E9B3D3", +"b$ c #E24783", +"c$ c #426B20", +"d$ c #A8B8E8", +"e$ c #3E69CC", +"f$ c #38529D", +"g$ c #B83336", +"h$ c #E13E43", +"i$ c #E6454B", +"j$ c #296A0F", +"k$ c #382D21", +"l$ c #45683C", +"m$ c #4E7AD7", +"n$ c #3754A5", +"o$ c #B83439", +"p$ c #E23E44", +"q$ c #E7454B", +"r$ c #5D3C1D", +"s$ c #286A0F", +"t$ c #077D78", +"u$ c #372C21", +"v$ c #E24782", +"w$ c #3657AC", +"x$ c #B7343B", +"y$ c #E03D42", +"z$ c #276A0F", +"A$ c #362C20", +"B$ c #F65CA0", +"C$ c #F663A7", +"D$ c #F666AB", +"E$ c #F45FA2", +"F$ c #406B20", +"G$ c #C92023", +"H$ c #B25739", +"I$ c #5C3B1D", +"J$ c #266A0E", +"K$ c #0AA808", +"L$ c #352B20", +"M$ c #F872B8", +"N$ c #F873B9", +"O$ c #F567AB", +"P$ c #E74986", +"Q$ c #406A1F", +"R$ c #44683C", +"S$ c #B7333B", +"T$ c #B5573A", +"U$ c #09A708", +"V$ c #067D78", +"W$ c #332C21", +"X$ c #F661A5", +"Y$ c #0AAD09", +"Z$ c #4C77D5", +"`$ c #C92123", +" % c #B2593B", +".% c #25690E", +"+% c #057D79", +"@% c #2E3329", +"#% c #F660A3", +"$% c #3F6A1F", +"%% c #099A08", +"&% c #099608", +"*% c #089107", +"=% c #4B76D5", +"-% c #355AB5", +";% c #B7343E", +">% c #E03C42", +",% c #AF5B3D", +"'% c #5B3B1C", +")% c #25690D", +"!% c #2D3329", +"~% c #F569AD", +"{% c #43683B", +"]% c #355DBE", +"^% c #B73441", +"/% c #DE383D", +"(% c #DE3A3E", +"_% c #5B3A1C", +":% c #24690D", +"<% c #01AAB0", +"[% c #2C3329", +"}% c #F56AAE", +"|% c #E74987", +"1% c #43673B", +"2% c #B63441", +"3% c #23690D", +"4% c #09A608", +"5% c #01ACB3", +"6% c #047D79", +"7% c #2B3229", +"8% c #F65EA2", +"9% c #3E6A1F", +"0% c #C82224", +"a% c #AC5F3F", +"b% c #22690C", +"c% c #01ADB3", +"d% c #2A3228", +"e% c #F65DA0", +"f% c #3E6A1E", +"g% c #42673B", +"h% c #C82324", +"i% c #AA6140", +"j% c #5A3A1C", +"k% c #21690C", +"l% c #293128", +"m% c #F872B7", +"n% c #3D6A1E", +"o% c #345DBE", +"p% c #B63340", +"q% c #5C3B1C", +"r% c #01ABB2", +"s% c #283027", +"t% c #F5599C", +"u% c #F55B9E", +"v% c #F35799", +"w% c #4B75D5", +"x% c #588ADE", +"y% c #315DBE", +"z% c #AD323F", +"A% c #5E3C1D", +"B% c #01929B", +"C% c #01929A", +"D% c #047C78", +"E% c #273027", +"F% c #41673B", +"G% c #3D67CB", +"H% c #305DBE", +"I% c #AA313E", +"J% c #C82525", +"K% c #A56844", +"L% c #20690B", +"M% c #019099", +"N% c #262F27", +"O% c #3C6A1E", +"P% c #A56944", +"Q% c #1F690B", +"R% c #252F27", +"S% c #E8B8D8", +"T% c #3C691E", +"U% c #AA303E", +"V% c #1E690B", +"W% c #242E26", +"X% c #E6BCDB", +"Y% c #F55A9C", +"Z% c #3B691E", +"`% c #40673B", +" & c #1E690A", +".& c #232E26", +"+& c #2F5DBE", +"@& c #C72825", +"#& c #A07248", +"$& c #77512D", +"%& c #756E34", +"&& c #738234", +"*& c #738134", +"=& c #737638", +"-& c #738378", +";& c #73847A", +">& c #738379", +",& c #737864", +"'& c #75593A", +")& c #AE9D91", +"!& c #D5C9C1", +"~& c #C7BEC0", +"{& c #C1BABF", +"]& c #C79DA7", +"^& c #CF687B", +"/& c #D0677B", +"(& c #CE6679", +"_& c #C7616D", +":& c #C4616B", +"<& c #796F38", +"[& c #737833", +"}& c #737533", +"|& c #7A6E42", +"1& c #D2C6BE", +"2& c #CBC2C0", +"3& c #A39BB0", +"4& c #7A6E9C", +"5& c #776993", +"6& c #A45A44", +"7& c #C05B42", +"8& c #B6573A", +"9& c #B4583A", +"0& c #9F7348", +"a& c #825A32", +"b& c #8A6138", +"c& c #865D34", +" . + ", +" . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . @ # $ ", +" % & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & * = $ $ ", +" - $ $ $ $ $ $ $ ; ; ; ; ; ; > > > > > > > > > > > > , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , ; ' ) $ $ ", +" - ; ! ~ ~ ~ { ] ^ ^ ^ ^ ^ / ( ( ( ( ( _ : : : : : : < [ [ [ [ [ [ [ [ [ [ [ [ [ [ [ [ [ [ [ [ [ [ [ } | 1 1 1 2 3 4 5 6 $ $ ", +" - > 7 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 9 0 a a b b c d e f 6 $ $ ", +" - > g h i j k j i h h h h h h h h h h h h h h h h h h h h h h h h h h h h h h h h h l m n o p o q r s a b t t u d v f 6 $ $ ", +" - > w x y z A B C D E F F F F F F F F F F F F F F F F F F F F F F F F G H I J G F F K L M N O M P Q R a b S S u d T f 6 $ $ ", +" - > U V V V V W X Y Z ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ...+.@.#.$.%.&.*.=.-.-.;.>.,.'.).!.a b S S u d T f 6 $ $ ", +" - > ~.V V V V W X Y {.].].].].].].].].].].].].].].].].].].].].].].^././././.(._.:.<.[.-.-.}.|.1.'.|.2.a b S S u d 3.f 6 $ $ ", +" - > 4.V V 5.6.7.X Y 8.9.0.a.b.c.c.c.c.c.c.c.c.c.c.c.c.c.c.c.c.c.c.d././.e.f.g._.h.i.j.-.-.k.l.1.'.|.m.a b S S u d n.f 6 $ $ ", +" - > o.V V p.q.5.X Y r.s.M t.u.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.d././.w.x.y._.h.z.A.-.-.B.C.1.'.|.m.a b S S u d D.f 6 $ $ ", +" - > o.V V p.q.E.X Y F.N G.H.I.J.J.J.J.J.J.J.J.J.J.J.J.J.J.J.J.J.J.d././.K.L.M._.h.N.A.-.-.B.C.1.'.|.m.a b S S u d D.f 6 $ $ ", +" - > o.V V p.q.p.X Y O.N G.H.P.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.R././.K.L.M._.h.N.j.-.-.B.C.1.'.|.m.a b S S u d S.f 6 $ $ ", +" - > T.V V U.q.p.X Y O.N G.H.V.W.W.W.W.W.W.W.W.W.W.W.W.W.W.W.W.W.W.R././.K.L.M._.h.X.Y.-.-.Z.C.1.'.|.m.a b S S u d S.f 6 $ $ ", +" - > `.V V U.q.p.X Y +N G..+++@+@+@+@+@+@+@+@+@+@+@+@+@+@+@+@+@+@+#+/./.K.L.$+_.h.%+&+-.-.*+C.1.'.|.m.a b S S u d =+f 6 $ $ ", +" - ; -+V V U.q.p.X Y ;+N G..+>+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+#+/./.K.'+)+_.h.%+&+-.-.*+C.1.C.|.m.a b S S u d !+~+6 $ $ ", +" - ; -+V V U.q.p.X Y ;+N G..+{+]+]+]+]+]+]+]+]+]+]+]+]+]+]+]+]+]+]+^+/./.K.'+/+_.h.(+&+-.-.*+C._+C.|.m.a b S S u d !+~+6 $ $ ", +" - ; -+V V U.q.p.X Y ;+N G..+{+:+:+:+:+:+:+:+:+:+:+:+:+:+:+:+:+:+:+^+/./.K.'+/+_.h.<+[+-.-.}+C.|+C.|.m.a b S S 1+d !+~+6 $ $ ", +" - ; 2+V V U.q.p.X Y 3+N G..+4+5+5+5+5+5+5+5+5+5+5+5+5+5+5+5+5+5+5+6+/./.K.'+/+_.h.<+7+-.-.8+'.|+C.|.m.a b S S 9+d 0+a+6 $ $ ", +" - ; b+V V U.q.p.X Y 3+N G..+++c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+6+/./.K.'+d+_.h.e+7+-.-.8+f+_+C.|.m.a b S S 9+d g+a+6 $ $ ", +" - ; h+V V U.i+j+X Y k+N G..+++l+l+l+l+l+l+l+l+l+l+l+l+l+l+l+l+l+l+6+/./.m+n+/+_.h.e+7+-.-.-.8+o+C.|.m.a b S S 9+d g+a+6 $ $ ", +" - $ p+V V q+r+V X Y k+N G..+s+t+t+t+t+t+t+t+t+t+t+t+t+t+t+t+t+t+t+u+/./.v+e.g._.h.w+7+-.-.-.-.8+'.|.m.a b t t 9+d g+a+6 $ $ ", +" - $ x+V V V V W X Y y+N G..+z+A+A+A+A+A+A+A+A+A+A+A+A+A+A+A+A+A+A+u+/./././.(._.h.w+B+-.-.-.-.8+'.|.m.a a b b C+d D+a+6 $ $ ", +" - $ x+V V V V W X Y E+N G..+z+F+F+F+F+F+F+F+F+F+F+F+F+F+F+F+F+F+F+G+/./././.(._.h.H+B+-.-.-.-.8+'.|.m.a a a a I+d J+K+6 $ $ ", +" - $ x+V V V V W X Y E+N G..+L+M+M+M+M+M+M+M+M+M+M+M+M+M+M+M+M+M+M+G+/./././.(._.h.N+B+-.-.-.-.8+'.|.m.a a a a I+d J+K+6 $ $ ", +" - $ x+V V V V W X Y O+N G..+P+Q+Q+Q+Q+Q+Q+Q+Q+Q+Q+Q+Q+Q+Q+Q+Q+Q+Q+R+/./././.(._.h.S+B+-.-.-.-.8+'.|.m.a a a a I+d T+K+6 $ $ ", +" - $ x+V V V V W X Y U+N G..+V+W+W+W+W+W+W+W+W+W+W+W+W+W+W+W+W+W+W+X+/./././.(._.h.Y+B+-.-.-.-.8+'.|.m.a a a a I+d Z+ 6 $ $ ", +" - $ x+V V V V W X Y `+N G..+V+ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @X+/./././.(._..@+@@@#@$@%@%@O &@P *@=@-@-@-@;@>@,@ 6 $ $ ", +" - $ '@)@)@)@)@!@~@{@]@^@/@(@_@:@:@<@[@[@}@|@1@1@1@1@1@1@1@1@1@1@1@2@3@3@3@3@3@4@5@6@7@8@9@0@0@a@b@c@d@e@f@g@g@h@i@a+ 6 $ $ ", +" % j@k@l@l@l@l@l@m@n@o@p@p@q@r@s@s@. . . . 6 $ $ ", +" ) t@u@u@u@u@u@u@u@u@u@u@u@u@u@u@u@u@u@u@u@v@) 6 6 6 6 6 6 6 w@x@x@x@x@x@x@x@y@z@z@z@z@z@z@z@A@s@. . . . . . . . . . . B@$ $ ", +" - $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ C@C@C@C@C@C@C@C@C@& & & & & & & & & & & & & & & & & & D@E@j@$ $ ", +" - $ ; > > , , , , , , , , , , , , , , , , , , , , , , , F@G@G@G@H@I@I@I@J@K@K@K@K@! ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ L@. 6 $ $ ", +" - $ ! : g M@[ [ [ [ [ [ [ [ [ [ [ [ [ [ [ [ [ [ [ [ [ [ N@N@N@N@N@O@O@O@O@O@O@O@O@P@P@P@P@P@P@P@P@P@Q@R@S@S@S@T@U@V@ 6 $ $ ", +" - $ { W@W@W@W@W@W@W@W@W@W@W@W@W@W@W@W@W@W@W@W@W@W@W@W@W@W@X@Y@Z@`@ #.#+#@###W@W@W@W@W@W@W@W@W@W@$#%#&#*#=#=#-#;#>#,# 6 $ $ ", +" - $ { h h h h h '#)#!#~#h {#]#^#/#(#_#:#<#[#h h h h h h h }#|#1#V V W 2#3#4#5#]#6#7#h h h h h h 8#9#0#0#0#0#a#b#c#d# 6 $ $ ", +" - $ e#F F F F f#g#h#i#j#k#l#m#n#M O M o#p#q#F F F F F F F x V V V V V r#Y s#t#m#u#v#F F F F F F w#x#0#0#0#0#a#b#y#z# 6 $ $ ", +" - $ A#B#C#D#E#F#G#H#I#J#K#=.-.-.-.-.G.L#|.M#` ` ` ` ` ` ` N#V V O#U.P#Q#Y R#n#-.>.M#` ` ` ` ` ` S#T#0#0#0#0#a#b#y#U# 6 $ $ ", +" - $ V#W#X#q+W Y#Z#`# $J#.$=.-.-.-.-.G.L#|.+$@$#$#$#$$$%$&$*$V r+i+q.i+=$Y R#n#-.>.-$;$>$>$>$,$X.'$T#0#0#0#0#a#b#)$!$ 6 $ $ ", +" - $ V#~$q+{$E.]$Z#`# $J#^$[+-.-.-.-.G.L#|./$($($($($_$:$<$[$V r+}$q.i+=$Y |$n#-.>.1$/./.v+2$3$h.4$5$0#0#0#6$a#b#)$7$ 6 $ $ ", +" - $ 8$~$q+9$j+]$Z#`# $J#0$[+-.-.-.-.G.L#|.a$($($($($_$:$b$c$V r+}$q.i+=$Y |$L -.>.d$/././+x.e$h.f$g$0#0#h$i$0#b#)$7$ 6 $ $ ", +" - $ 8$j$q+9$j+]$Z#`# $J#k$[+-.-.-.-.G.L#|.a$($($($($_$:$b$[$V r+}$q.i+=$Y l$L -.>.d$/./.m$x.e$h.n$o$0#0#p$q$0#b#)$!$ 6 $ $ ", +" - $ r$s$q+9$j+]$Z#`# $t$u$[+-.-.-.-.G.L#|.a$($($($($_$:$v$[$V r+}$q.i+=$Y l$L -.>.d$/./.m$x.e$h.w$x$0#0#y$i$0#b#)$7$ 6 $ $ ", +" - $ r$z$q+9$j+]$Z#`# $t$A$[+-.-.-.-.G.L#|.a$($B$C$D$E$:$v$F$V r+}$q.i+=$Y l$L -.>.d$/./.m$x.e$h.w$x$0#0#y$i$0#b#G$H$ 6 $ $ ", +" - $ I$J$q+K$j+]$Z#`# $t$L$[+-.-.-.-.G.L#|.a$($C$M$N$O$P$v$Q$V r+}$q.i+=$Y R$L -.>.d$/./.m$x.e$h.w$S$0#0#y$i$0#b#G$T$ 6 $ $ ", +" - $ I$J$q+U$j+]$Z#`# $V$W$[+-.-.-.-.G.L#|.a$($X$N$N$O$P$v$Q$V r+i+}$Y$=$Y R$L -.>.d$/./.Z$x.e$h.w$S$0#0#y$i$0#b#`$ % 6 $ $ ", +" - $ I$.%q+U$j+]$Z#`# $+%@%[+-.-.-.-.G.L#|.a$($#%M$N$O$P$v$$%V q+%%&%*%r#Y R$L -.>.d$/./.=%x.e$h.-%;%0#0#>%i$0#b#`$,% 6 $ $ ", +" - $ '%)%q+U$j+]$Z#`# $+%!%[+-.-.-.-.G.L#|.a$($#%M$N$~%P$v$$%V V V V V r#Y {%L -.>.d$/./.=%x.e$h.]%^%0#0#/%(%a#b#`$,% 6 $ $ ", +" - $ _%:%q+U$j+]$Z#`#<%+%[%7+-.-.-.-.G.L#|.a$($#%M$N$}%|%v$$%V V V V V r#Y 1%L -.>.d$/./.=%x.e$h.]%2%0#0#0#0#a#b#`$,% 6 $ $ ", +" - $ _%3%q+4%j+]$Z#`#5%6%7%7+-.-.-.-.G.L#|.a$($8%M$N$}%|%v$9%V V V V V r#Y 1%L -.>.d$/./.=%x.e$h.]%2%0#0#0#0#a#b#0%a% 6 $ $ ", +" - $ _%b%V q+V ]$Z#`#c%6%d%7+-.-.-.-.G.L#|.a$($e%M$N$}%|%v$f%V V V V V r#Y g%L -.>.d$/./.=%x.e$h.]%2%0#0#0#0#a#b#h%i% 6 $ $ ", +" - $ j%k%V V W ]$Z#`#c%6%l%7+-.-.-.-.G.L#|.a$($B$m%M$~%P$v$n%V V V V V r#Y g%L -.>.d$/./.=%x.e$h.o%p%0#0#0#0#a#b#h%i% 6 $ $ ", +" - $ q%k%V V W ]$Z#H#r%6%s%B+-.-.-.-.G.L#|.a$($t%8%u%v%:$v$n%V V V V V r#Y g%L -.>.d$/./.w%x%e$h.y%z%0#0#0#0#a#b#h%i% 6 $ $ ", +" - $ A%k%V V W ]$Z#B%C%D%E%B+-.-.-.-.G.L#|.a$($($($($_$:$v$n%V V V V V r#Y F%L -.>.d$/././.f.G%h.H%I%0#0#0#0#a#b#J%K% 6 $ $ ", +" - $ A%L%V V W ]$Z#a M%D%N%B+-.-.-.-.G.L#|.a$($($($($_$:$v$O%V V V V V r#Y F%L -.>.d$/./././.G%h.H%I%0#0#0#0#a#b#J%P% 6 $ $ ", +" - $ A%Q%V V W ]$Z#a M%D%R%B+-.-.-.-.G.L#|.S%t%($($($_$:$v$T%V V V V V r#Y F%L -.>.d$/./././.G%h.H%U%0#0#0#0#a#b#J%P% 6 $ $ ", +" - $ r$V%V V W ]$Z#a M%D%W%B+-.-.-.-.G.L#|.X%Y%($($($_$:$v$Z%V V V V V r#Y `%L -.>.d$/./././.G%h.H%U%0#0#0#0#a#b#J%P% 6 $ $ ", +" - $ r$ &V V W ]$Z#a M%D%.&B+-.-.-.-.G.L#|.X%Y%($($($_$:$v$Z%V V V V V r#Y `%L -.>.d$/./././.G%h.+&U%0#0#0#0#a#b#@&#& 6 $ $ ", +" - $ $&%&&&&&*&=&-&;&>&,&'&)&!&!&!&!&!&~&{&]&^&/&/&/&(&_&:&<&&&&&&&&&&&[&}&|&1&!&2&3&3@3@3@3@4&4@5&6&7&7&7&7&7&8&9&0& 6 $ $ ", +" - a&@ 6 $ $ ", +" . = b&u@u@u@u@u@u@u@u@u@u@u@u@u@u@u@u@u@u@u@u@u@u@u@u@u@u@u@u@u@u@u@u@u@u@u@u@u@u@u@u@u@u@u@u@u@u@u@u@u@u@u@u@u@u@u@u@u@+ $ $ ", +". c&C@$ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ ", +"+ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ "}; diff --git a/assets/cobblestone.xpm b/assets/cobblestone.xpm new file mode 100644 index 0000000..b81c546 --- /dev/null +++ b/assets/cobblestone.xpm @@ -0,0 +1,124 @@ +/* XPM */ +static char * cobblestone_xpm[] = { +"64 64 57 1", +" c #636363", +". c #5F5F5F", +"+ c #575757", +"@ c #5B5B5B", +"# c #727272", +"$ c #7A7A7A", +"% c #787878", +"& c #6A6A6A", +"* c #626262", +"= c #5E5E5E", +"- c #686868", +"; c #6D6D6D", +"> c #767676", +", c #6F6F6F", +"' c #6B6B6B", +") c #5C5C5C", +"! c #565656", +"~ c #545454", +"{ c #747474", +"] c #818181", +"^ c #848484", +"/ c #7B7B7B", +"( c #797979", +"_ c #707070", +": c #5A5A5A", +"< c #525252", +"[ c #676767", +"} c #585858", +"| c #656565", +"1 c #606060", +"2 c #555555", +"3 c #7E7E7E", +"4 c #646464", +"5 c #717171", +"6 c #6C6C6C", +"7 c #595959", +"8 c #515151", +"9 c #777777", +"0 c #757575", +"a c #7D7D7D", +"b c #666666", +"c c #808080", +"d c #838383", +"e c #535353", +"f c #7F7F7F", +"g c #6E6E6E", +"h c #4E4E4E", +"i c #828282", +"j c #7C7C7C", +"k c #505050", +"l c #696969", +"m c #4C4C4C", +"n c #737373", +"o c #5D5D5D", +"p c #4D4D4D", +"q c #4F4F4F", +"r c #616161", +" .+@#$$$$%& *=@@-;>,'*)+!~{]^/$$$$$$$$$$$(--(_:!!<,>_[ ", +" .!}#$$$(--&;>_;| 1@+!!!2*3^3$$$$$$$$$$$${4;(;}!=(5; ", +" *}+5$$$$((#64 .7!!!!!!!89^]$$$$$$$$$$$$$;40('7>0_- ", +" :!-$$aa$$& =}!!!!!!!!!8bc^/$$$$$$$$$$$$%4'$$((_,4 ", +" :!|(/]^d/(- 17!!!!!!!!!!!~e/^3$$$$$$$$$$$$(-4($${_& ", +" :+b(ad^f3a$g )!!!!!!!!!!!!!h6i]$$$$$$$$$$$(' '$$$5_& ", +" :}'$f^ij$$9$, @!!!!!!!!!!!!!k)3^/$$$$$$$$$0-4_(%%$>_6 ", +":}5$]^c$$$$(004@!!!!!!!!!!!!!8h>df$$$$$$$(g4l{{-::0$5,4 ", +"@#aida$$$$$(_(4)!!!!!!!!!!!!!2mbfi$$$$$$n[b5#[)!!2@(9_l :", +"9ad]/$$$$$$([('o!!!!!!!!!!!!!!p2(dj$$$9'b_5[.+!!!!8*(ng :*", +"cd3$$$$$$$$(b9,o!!!!!!!!!!!!!!hhn3f$(,-_#-*:!!!!!!!q,%_[ *@6(", +"ia$$$$$$$$$(l_9=!!!!!!!!!!!!2($$9l 1+!!!!!!!!!!!!00{5_%5 *+!!!!!!!!!!!!!!p*$$($/cj$$", +"5,,,;l|4||44bg$$$$$$(900#_g&lb44 b%[ :!!!!!!!!!!!!!!8q($$$a$(%0", +",,,,,,,_n9(((($$$$05__;&b4 rl{4r+!!!!!!!!!!!!!h+($$$#____", +",,,,,,g6'll[|4|-($5_;4 o5g .!!!!!!!!!!!!|444", +"@++!!!!!!!!!!!!!~>%_6 )b%-*}!!!!!!!!!q!%(54|%(- =", +"!!!!!!!!!!!!!!!!e1(n,4 r}#>|1+!!!!!!!eq_$n[ b({4 }", +"!!!!!!!!!!!!!!!!!k5%_l *+|${4=!!!!!!2h'${' 1g$6 o", +"!!!!!!!!!!!!!!!!!8@({g *:+6$${4:!!!!!q1(>,4 on%b ", +"o!!!!!!!!!!!!!!!!2hg%_b 17:5//>${ }!!!<)(9_- *r({4", +"*+!!!!!!!!!!!!!!!!k}({' o+*9fa$0n$nr+!~@%(56 ol(6", +"4o!!!!!!!!!!!!!!!!ep6(_| 17:,a]j$$${n${.!o9$n,b *:n$", +"{ }!!!!!!!!!!!!!!!!p2%>& *)}|(]]/$$$$$,{$0&(${_& ..(", +"$;=!!!!!!!!!!!!!!!!kp'$#4 .71#3df$$$$$$$('{$$$9_,4 :l", +"5(l7!!!!!!!!!!!!!!!r!!!!!!!!!!!!!!!2mp;$01 ,(3^da$$$$$$$$$$$>b0$0_6 @", +"!-$n:!!!!!!!!!!!!!eqmm4$$(($]^dj$$$$$$$$$$$$${[9$n_[ *", +"@}n$&+!!!!!!!~<8qhq< -9$$$$f^^j$$$$$$$$$$$$$$$,l((5g4 ", +"*+1(( 2eee8qq+ b-5%($$$$$($/i^a$$$$$$$$$$$$$$$(&&(9_' ", +" )+,$(>{{9(((($$/aff3$$${b;9jddj$$$$$$$$$$$$$$$%['(>_[ ", +" *+&$$$$$jffciddcfa/$#$9|**4#/ii/$$$$$$$$$$$$$$${45$n,| ", +" r+#/fcd^dd]fa/$$$$$n0(l*7+7=&%]]$$$$$$$$$$$$$$$$_4{(#;4 ", +" oo(]^^cf/$$$$$$$$$9;(; :!!!!}1{]]$$$$$$$$$$$$$$$(&40%5& ", +" :;3^c/$$$$$$$$$$$('9{4)!!!!!!!7'f]$$$$$$$$$$$$$$$04-(9_- ", +"*@(d]$$$$$$$$$$$$$5g(b1!!!!!!!!!!1a]$$$$$$$$$$$$(#& 4,$9_'4 ", +"=6fi$$$$$$$$$$$$$0[(6*+!!!!!!!!!!2)$c$$$$$$$(0_'|-g_9$j(9n;| ", +"=(dj$$$$$$$$$$$$(ln{ :!!!!!!!!!!!!87(3$$(n_,__#%$3f]ca$$#5>_[ ", +"gfa$$$$$$$$$$$$$;&%[=!!!!!!!!!!!!!qh;$(0((((($$]di3/$$$$${'9064 ", +"$c$$$$$$$$$$$$${|>g1+!!!!!!!!!!!!qhl($$(0{,&|_$d3$$$$$$$$${[{(ng", +"j$$$$$$$$$$$$$>|_0 7!!!!!!!!!!!2qqg$a%(ng[ b$d/$$$$$$$$$${|{$$", +"0,_59(($$$$$$(ll(&@!!!!!!!!!!!ep7nac/_(n& o(d/$$$$$$$$$$$#4{$", +"(({;||b;,5>((&40n1!!!!!!!!!!!8h1$]f$$_{0& =0ia$$$$$$$$$$${45$", +"4bg5%n,[4 444 _(|+!!!!!!!!!2qkg3da$$$,,0& o'cf$$$$$$$$$$$,4(6", +"oo. 4&5%9_gb4&(_:!!!!!!!!!ep)>]ij$$$$,,0& =&ff$$$$$$$$$$(-g{4", +"!!!+7o146{((($(r!!!!!!!!2kq[jd]/$$$$$5l>& 1 /]$$$$$$$$$$9|>l=", +"!!!!!!!+@.[#(${!~~22!!!')!", +"!!!!!!!!!!!!@({##{{{>%%((f^i$$$$$$$$$>|%& 1*%5|6(aif/$$$${g9*+!", +"!!!!!!!!!!!!49_,&&&lll&n$f^f$$$$$$$$$>40g 1 %&:!!}'(fia$$$g%,:!!", +"!!!!!!!!!!!2b{_l *o%j^3$$$$$$$$$>4##r|%&:!!!!e!;$f]j(#(4!!!", +"!!!!!!!!!!!<65,4 @l$df$$$$$$$$$>4_0_(&=!!!!!!2k@5/3%(%@!!!", +"!!!!!!!!!!!<9_' =7%ff$$$$$$$$9& 5$(&1+!!!!!!!!+!!!", +"!!!!!!!!!!22{_l *+&j]$$$$$$9g4|,($# }!!!!!!!!!!8q>$$$572!", +"2!!!!!!!!!<|0_| })(]$$$(06|l5($$$# }!!!!!!!!!!k+($%($%.<", +"k(,", +"0oq; r", +"*:7g({1hmk%%_4 .@+}*_($a^f$$$$$$$$$$$0|n{1!!!!!8&%_[ ", +" )+*%$#r-$96 *o}!1'9/fj%$^c$$$$$$$$$$$$,40#)!!!2+%n; "}; diff --git a/assets/cobblestone_01.xpm b/assets/cobblestone_01.xpm new file mode 100644 index 0000000..fbf458e --- /dev/null +++ b/assets/cobblestone_01.xpm @@ -0,0 +1,124 @@ +/* XPM */ +static char * cobblestone_01_xpm[] = { +"64 64 57 1", +" c #636363", +". c #5F5F5F", +"+ c #575757", +"@ c #5B5B5B", +"# c #727272", +"$ c #7A7A7A", +"% c #787878", +"& c #6A6A6A", +"* c #626262", +"= c #5E5E5E", +"- c #686868", +"; c #6D6D6D", +"> c #767676", +", c #6F6F6F", +"' c #6B6B6B", +") c #5C5C5C", +"! c #565656", +"~ c #545454", +"{ c #747474", +"] c #818181", +"^ c #848484", +"/ c #7B7B7B", +"( c #797979", +"_ c #707070", +": c #5A5A5A", +"< c #525252", +"[ c #676767", +"} c #585858", +"| c #656565", +"1 c #606060", +"2 c #555555", +"3 c #7E7E7E", +"4 c #646464", +"5 c #717171", +"6 c #6C6C6C", +"7 c #595959", +"8 c #515151", +"9 c #777777", +"0 c #757575", +"a c #7D7D7D", +"b c #666666", +"c c #808080", +"d c #838383", +"e c #535353", +"f c #7F7F7F", +"g c #6E6E6E", +"h c #4E4E4E", +"i c #828282", +"j c #7C7C7C", +"k c #505050", +"l c #696969", +"m c #4C4C4C", +"n c #737373", +"o c #5D5D5D", +"p c #4D4D4D", +"q c #616161", +"r c #4F4F4F", +" .+@#$$$$%& *=@@-;>,'*)+!~{]^/$$$$$$$$$$$(--(_:!!<,>_[ ", +" .!}#$$$(--&;>_;| 1@+!!!2*3^3$$$$$$$$$$$${4;(;}!=(5; ", +" *}+5$$$$((#64 .7!!!!!!!89^]$$$$$$$$$$$$$;40('7>0_- ", +" :!-$$aa$$& =}!!!!!!!!!8bc^/$$$$$$$$$$$$%4'$$((_,4 ", +" :!|(/]^d/(- 17!!!!!!!!!!!~e/^3$$$$$$$$$$$$(-4($${_& ", +" :+b(ad^f3a$g )!!!!!!!!!!!!!h6i]$$$$$$$$$$$(' '$$$5_& ", +" :}'$f^ij$$9$, @!!!!!!!!!!!!!k)3^/$$$$$$$$$0-4_($($>_6 ", +":}5$]^c$$$$(004@!!!!!!!!!!!!!8h>df$$$$$$$(g4l0a3/59$5,4 ", +"@#aida$$$$$(_(4)!!!!!!!!!!!!!2mbfi$$$$$$n[b#a]3$$%'(9_l :", +"9ad]/$$$$$$([('o!!!!!!!!!!!!!!p2(dj$$$9'b5ai]/$$$$_;$ng :*", +"cd3$$$$$$$$(b9,o!!!!!!!!!!!!!!hhn3f$(,-5jida$$$$$$([{%_[ *@6(", +"ia$$$$$$$$$(l_9=!!!!!!!!!!!!2($$/i^]/$$$$$$$$$$$$549(g|_(/]3$", +"$$$$$((((9#,44((l[bbbb-;>((/3ff3j$(3^d/$$$$$$$$$$$$$(|;$$($/cj$$", +"5,,,;l|4||44bg$$$$$$/3fcidiffj$$$$#$i^a$$$$$$$$$$$$$$g4($$$a$(%0", +",,,,,,,_n9(((($$$$cd^d]fj$$$$$$$$$9,a^d/$$$$$$$$$$$$(--($$$#____", +",,,,,,g6'll[|4|-($^^]/$$$$$$$$$$$$$,{f^]$$$$$$$$$$$$#4{$$$$$((%0", +" *1oo):+++!!!!!'$c^f$$$$$$$$$$$$$$%-(]^a$$$$$$$$$$%|6$(,{$>|444", +"@++!!!!!!!!!!!!!~>j^]$$$$$$$$$$$$$$$;;$idj$$$$$$$$$'[((54|%(- =", +"!!!!!!!!!!!!!!!!e1$]^/$$$$$$$$$$$$$$>|0jdi$$$$$$$$n|0$n[ b({4 }", +"!!!!!!!!!!!!!!!!!k5a^f$$$$$$$$$$$$$$(46$a^c$$$$$$9b#${' 1g$6 o", +"!!!!!!!!!!!!!!!!!8@(]i$$$$$$$$$$$$$(&45$$ada$$$$(&6$>,4 on%b ", +"o!!!!!!!!!!!!!!!!2hgjda$$$$$$$$$$$0-|{//>$ad/$$$_&(9_- *q({4", +"*+!!!!!!!!!!!!!!!!k}(c]$$$$$$$$$(,4&%fa$0n$a]$$0'((56 ol(6", +"4o!!!!!!!!!!!!!!!!ep6/d/$$$$$$$0l|na]j$$${n$af(g%$n,b *:n$", +"{ }!!!!!!!!!!!!!!!!p2%3f$$$$$(g|6$]]/$$$$$,{$j>(${_& ..(", +"$;=!!!!!!!!!!!!!!!!kp'$]/$$${-l0fdf$$$$$$$('{$$$9_,4 :l", +"5(l7!!!!!!!!!!!!!!!q!!!!!!!!!!!!!!!2mp;$/#6#(3^da$$$$$$$$$$$>b0$0_6 @", +"!-$n:!!!!!!!!!!!!!ermm4$$($$]^dj$$$$$$$$$$$$${[9$n_[ *", +"@}n$&+!!!!!!!~<8rhr< -9$$$$f^^j$$$$$$$$$$$$$$$,l((5g4 ", +"*+1(( 2eee8rr+ b-5%($$$$$$$/i^a$$$$$$$$$$$$$$$(&&(9_' ", +" )+,$(>{{9(((($$/aff3$$$adc/jddj$$$$$$$$$$$$$$$%['(>_[ ", +" *+&$$$$$jffciddcfa/$#$jdddd3jii/$$$$$$$$$$$$$$${45$n,| ", +" q+#/fcd^dd]fa/$$$$$n0$idj$jc]j]]$$$$$$$$$$$$$$$$_4{(#;4 ", +" oo(]^^cf/$$$$$$$$$9;$c^a$$$$/fa]]$$$$$$$$$$$$$$$(&40%5& ", +" :;3^c/$$$$$$$$$$$('9a^f$$$$$$$//c]$$$$$$$$$$$$$$$04-(9_- ", +"*@(d]$$$$$$$$$$$$$5g/d]$$$$$$$$$$#a]$$$$$$$$$$$$(#& 4,$9_'4 ", +"=6fi$$$$$$$$$$$$$0[(]d/$$$$$$$$$$%'/c$$$$$$$(0_'|-g_9$j(9n;| ", +"=(dj$$$$$$$$$$$$(lnada$$$$$$$$$$$$,l$3$$(n_,__#%$3f]ca$$#5>_[ ", +"gfa$$$$$$$$$$$$$;&$dc$$$$$$$$$$$$('4n$(0(($$$$$]di3/$$$$${'9064 ", +"$c$$$$$$$$$$$$${|9ci$$$$$$$$$$$$(&45$$$/fc]3${$d3$$$$$$$$${[{(ng", +"j$$$$$$$$$$$$$>|_jdj$$$$$$$$$$$9l4{$a%$ida$$(g$d/$$$$$$$$$${|{$$", +"0,_59(($$$$$$(ll$]3$$$$$$$$$$${|l>ac/_(]f$$$$6$d/$$$$$$$$$$$#4{$", +"(({;||b;,5>((&403]$$$$$$$$$$(g|6/]f$$_{cf$$$$_9ia$$$$$$$$$$${45$", +"4bg5%n,[4 444 _$i/$$$$$$$$$9&|{3da$$$,,ff$$$$,_cf$$$$$$$$$$$,4(6", +"oo. 4&5%9_gb4&(3a$$$$$$$$$n|&%]ij$$$$,,ff$$$$5,ff$$$$$$$$$$(-g{4", +"!!!+7o146{((($$f$$$$$$$$('|_jd]/$$$$$5l3f$$$${6/]$$$$$$$$$$9|>l=", +"!!!!!!!+@.[#($({{0>9(((#b-0c^]$$$$$$$n|/f$$$$;;$i3$$$$$$$$$,;{*+", +"!!!!!!!!!!+:|($9__6b||||6(]^]$$$$$$$${|$f$$${'($/c]j$$$$$$(->')!", +"!!!!!!!!!!!!@({##{009((($f^i$$$$$$$$$>|(f$${'%5|6(aif/$$$${g9*+!", +"!!!!!!!!!!!!49_,&&&lll&n$f^f$$$$$$$$$>4>3$06%&:!!}'(fia$$$g%,:!!", +"!!!!!!!!!!!2b{_l *o%j^3$$$$$$$$$>4#j0g%&:!!!!e!;$f]j(#(4!!!", +"!!!!!!!!!!!<65,4 @l$df$$$$$$$$$>4_/0(&=!!!!!!2k@5/3%(%@!!!", +"!!!!!!!!!!!<9_' =7%ff$$$$$$$$9& 5$(&1+!!!!!!!!+!!!", +"!!!!!!!!!!22{_l *+&j]$$$$$$9g4|,($# }!!!!!!!!!!8r>$$$572!", +"2!!!!!!!!!<|0_| })(]$$$(06|l5($$$# }!!!!!!!!!!k+($%($%.<", +"k(,", +"0or; q", +"*:7g({1hmk%%_4 .@+}*_($a^f$$$$$$$$$$$0|n{1!!!!!8&%_[ ", +" )+*%$#q-$96 *o}!1'9/fj%$^c$$$$$$$$$$$$,40#)!!!2+%n; "}; diff --git a/assets/cobblestone_02.xpm b/assets/cobblestone_02.xpm new file mode 100644 index 0000000..8eb1891 --- /dev/null +++ b/assets/cobblestone_02.xpm @@ -0,0 +1,124 @@ +/* XPM */ +static char * cobblestone_02_xpm[] = { +"64 64 57 1", +" c #636363", +". c #5F5F5F", +"+ c #575757", +"@ c #5B5B5B", +"# c #727272", +"$ c #7A7A7A", +"% c #787878", +"& c #6A6A6A", +"* c #626262", +"= c #5E5E5E", +"- c #686868", +"; c #6D6D6D", +"> c #767676", +", c #6F6F6F", +"' c #6B6B6B", +") c #5C5C5C", +"! c #565656", +"~ c #545454", +"{ c #747474", +"] c #818181", +"^ c #848484", +"/ c #7B7B7B", +"( c #797979", +"_ c #707070", +": c #5A5A5A", +"< c #525252", +"[ c #676767", +"} c #585858", +"| c #656565", +"1 c #606060", +"2 c #555555", +"3 c #7E7E7E", +"4 c #646464", +"5 c #717171", +"6 c #6C6C6C", +"7 c #595959", +"8 c #515151", +"9 c #777777", +"0 c #757575", +"a c #7D7D7D", +"b c #666666", +"c c #808080", +"d c #838383", +"e c #535353", +"f c #7F7F7F", +"g c #6E6E6E", +"h c #4E4E4E", +"i c #828282", +"j c #7C7C7C", +"k c #505050", +"l c #696969", +"m c #4C4C4C", +"n c #737373", +"o c #5D5D5D", +"p c #4D4D4D", +"q c #616161", +"r c #4F4F4F", +" .+@#$$$$%& *=@@-;>,'*)+!~{]^/$$$$$$$$$$$(--(_:!!<,>_[ ", +" .!}#$$$(--&;>_;| 1@+!!!2*3^3$$$$$$$$$$$${4;(;}!=(5; ", +" *}+5$$$$((#64 .7!!!!!!!89^]$$$$$$$$$$$$$;40('7>0_- ", +" :!-$$aa$$& =}!!!!!!!!!8bc^/$$$$$$$$$$$$%4'$$((_,4 ", +" :!|(/]^d/(- 17!!!!!!!!!!!~e/^3$$$$$$$$$$$$(-4($${_& ", +" :+b(ad^f3a$g )!!!!!!!!!!!!!h6i]$$$$$$$$$$$(' '$$$5_& ", +" :}'$f^ij$$9$, @!!!!!!!!!!!!!k)3^/$$$$$$$$$0-4_((%$>_6 ", +":}5$]^c$$$$(004@!!!!!!!!!!!!!8h>df$$$$$$$(g4l09_b >$5,4 ", +"@#aida$$$$$(_(4)!!!!!!!!!!!!!2mbfi$$$$$$n[b5>5- **(9_l :", +"9ad]/$$$$$$([('o!!!!!!!!!!!!!!p2(dj$$$9'b_0#64 o[(ng :*", +"cd3$$$$$$$$(b9,o!!!!!!!!!!!!!!hhn3f$(,-5>#,[ *75%_[ *@6(", +"ia$$$$$$$$$(l_9=!!!!!!!!!!!!2($$(#_;4 =}>(g|_(/]3$", +"$$$$$((((9#,44((l[bbbb-;0%%9>00{5_%>_,4 *+[$$($/cj$$", +"5,,,;l|4||44bg$$$$$$(900#_g&lb44 b%#_[ )}($$$a$(%0", +",,,,,,,_n9(((($$$$05__;&b4 ql9_g4 7=($$$#____", +",,,,,,g6'll[|4|-($5_;4 o50_6 =+5$$$$$((%0", +" *1oo):+++!!!!!'${_& *o%n_[ *+4((,{$>|444", +"@++!!!!!!!!!!!!!~>%_6 )b(#,| :o%(54|%(- =", +"!!!!!!!!!!!!!!!!e1(n,4 q}#%5;4 .}#$n[ b({4 }", +"!!!!!!!!!!!!!!!!!k5%_l *+|$9_' q}g${' 1g$6 o", +"!!!!!!!!!!!!!!!!!8@({g *:+6$$9_[ :|(>,4 on%b ", +"o!!!!!!!!!!!!!!!!2hg%_b 1}:5%_#$9,| o*(9_- *q({4", +"*+!!!!!!!!!!!!!!!!k}({' o+*>{- qg$9;4 1*%(56 ol(6", +"4o!!!!!!!!!!!!!!!!ep6(_| 17:g>gb 1g$9'* 9$n,b *:n$", +"{ }!!!!!!!!!!!!!!!!p2%>& *)}|0#64 =_$%g(${_& ..(", +"$;=!!!!!!!!!!!!!!!!kp'$#4 .7150_l )5$$$9_,4 :l", +"5(l7!!!!!!!!!!!!!!!q!!!!!!!!!!!!!!!2mp;$01 ,(9_,b q:#$0_6 @", +"!-$n:!!!!!!!!!!!!!ermm4$$((${_gb .)>$n_[ *", +"@}n$&+!!!!!!!~<8rhr< -9$$$$>__b o1%(5g4 ", +"*+1(( 2eee8rr+ b-5%($$$$$$$(#_[ :*(9_' ", +" )+,$(>{{9(((($$/aff3$$$95{(%5,| *}4(>_[ ", +" *+&$$$$$jffciddcfa/$#$%5,,_>%#;4 1+6(n,| ", +" q+#/fcd^dd]fa/$$$$$n0$n,b4b'#%n;4 o}5(#;4 ", +" oo(]^^cf/$$$$$$$$$9;${_[ 4'>n64 :}n%5& ", +" :;3^c/$$$$$$$$$$$('99_l |_n;4 1!=%9_- ", +"*@(d]$$$$$$$$$$$$$5g(56 b0;4 *=7!+&$9_'4 ", +"=6fi$$$$$$$$$$$$$0[({,4 **{g4 *1o@7=l'0$j(9n;| ", +"=(dj$$$$$$$$$$$$(ln9_[ o19_4 41. &&g9$af]ca$$#5>_[ ", +"gfa$$$$$$$$$$$$$;&(5' :+_$#_9(%(($$]di3/$$$$${'9064 ", +"$c$$$$$$$$$$$$${|>{;4 *:};$$$(0{,&|_$d3$$$$$$$$${[{(ng", +"j$$$$$$$$$$$$$>|_%_b q775$a%(ng[ b$d/$$$$$$$$$${|{$$", +"0,_59(($$$$$$(ll(#- .+1{ac/_(n& o(d/$$$$$$$$$$$#4{$", +"(({;||b;,5>((&4096 )}|$]f$$_{0& =0ia$$$$$$$$$$${45$", +"4bg5%n,[4 444 _(_4 q:753da$$$,,0& o'cf$$$$$$$$$$$,4(6", +"oo. 4&5%9_gb4&(0[ .+*9]ij$$$$,,0& =&ff$$$$$$$$$$(-g{4", +"!!!+7o146{((($$6 *@}'jd]/$$$$$5l>& 1 /]$$$$$$$$$$9|>l=", +"!!!!!!!+@.[#($>q11qq***=}=nc^]$$$$$$$n|9& @b$i3$$$$$$$$$,;{*+", +"!!!!!!!!!!+:|($>'& @}}}}|(]^]$$$$$$$${|(& .*%$/c]j$$$$$$(->')!", +"!!!!!!!!!!!!@({##{0{>%%($f^i$$$$$$$$$>|%& 1*%5|6(aif/$$$${g9*+!", +"!!!!!!!!!!!!49_,&&&lll&n$f^f$$$$$$$$$>40g 1 %&:!!}'(fia$$$g%,:!!", +"!!!!!!!!!!!2b{_l *o%j^3$$$$$$$$$>4##q|%&:!!!!e!;$f]j(#(4!!!", +"!!!!!!!!!!!<65,4 @l$df$$$$$$$$$>4_0_(&=!!!!!!2k@5/3%(%@!!!", +"!!!!!!!!!!!<9_' =7%ff$$$$$$$$9& 5$(&1+!!!!!!!!+!!!", +"!!!!!!!!!!22{_l *+&j]$$$$$$9g4|,($# }!!!!!!!!!!8r>$$$572!", +"2!!!!!!!!!<|0_| })(]$$$(06|l5($$$# }!!!!!!!!!!k+($%($%.<", +"k(,", +"0or; q", +"*:7g({1hmk%%_4 .@+}*_($a^f$$$$$$$$$$$0|n{1!!!!!8&%_[ ", +" )+*%$#q-$96 *o}!1'9/fj%$^c$$$$$$$$$$$$,40#)!!!2+%n; "}; diff --git a/assets/cyan_concrete.xpm b/assets/cyan_concrete.xpm new file mode 100644 index 0000000..668c559 --- /dev/null +++ b/assets/cyan_concrete.xpm @@ -0,0 +1,79 @@ +/* XPM */ +static char * cyan_concrete_xpm[] = { +"64 64 12 1", +" c #17A1B0", +". c #129FAE", +"+ c #109EAD", +"@ c #16A1B0", +"# c #139FAE", +"$ c #15A0AF", +"% c #119EAD", +"& c #14A0AF", +"* c #119FAE", +"= c #13A0AF", +"- c #16A0AF", +"; c #149FAE", +" .++++@ #+$ @%. ", +" &++*%+. @++$ .+@ ", +" $+.@ $+= $+++# $+$ ", +" -%& -.$ .--#+%$ $+. ", +" .$ @*$ &$ @=+.- *+& ", +" .& -%$ $. @#%#@ .++# ", +" ## $%$ -%$ $*+& &++++$ ", +" &. &+$ @*% #++#+*$#++$ ", +" $%@ .+=-*+& $+++$ $%+$ ", +" $%$ @+++++@ ;+& #+$ ", +" $+# $+++. %* $%# ", +" @%% +++& $+$ -..- ", +" @*+$ @+++& .. #%& ", +"$ .+. &+++% $+$ $+.", +"+#@ @.++$ %++++. *# ;+", +";%+.;%++% #++++++. &+- #.", +" &*++++% $++.$@#++. @+# @. ", +" $%+++$ @%+# $++.@ #+- #$ ", +" ;+++$ .+& $%+*$ $+# @# ", +" $%++$ .+& @*++$ @%+- #@ ", +" #+++$ &+# @*++.%+. -# ", +" @%&&#%# &+. @%++++$ #@ ", +" &$ @#.- &+. &+++% $# ", +" @# $%#@ #++@ &+++*@ .@ ", +" ;@ -.+#;.++$ .+++++& $# ", +" @$ .+++++ @++.%+++%&@ %- ", +" $ .++++# &+. @&#+++#$ ;# ", +" -- $++**+%$ *+$ $#++%&@ $+$ ", +" $ &+%@ $#+*$ -+. &*++%%+$ ", +" $@ %+$ $.+*$ #+$ $+++++.& ", +" $# &+. $.+%& @+. %.;*++++.&@", +"+%+& @++@ &+++#- .+& @%@ @&.++++", +"*++# .+# @#++++++ &# #+;&", +" $%+$ &++ $.+++# .- %$ ", +" #+$ $++& &++; -. $. ", +" $%$ @*++ -.+$ #$ #- ", +" -.& .++# .+.@ @% -# ", +" ..@ .+++; .+++$ &# #@ ", +" .%;.++.+% $.+++++.- %- @# ", +" .+++$ .+$ &+++#-$.++; &% #- ", +" @++$ @+# $.++.- $.+%& -+; -. ", +" +# &+@ #++*$ $++%++.- .; ", +" &. +# $%++& @.++++++++++% ", +" @%- #+@ $.++.@ %+++.#&&&#+& ", +" .$ @+# -#++%$ $+.@ $%- ", +" $. #+$ @#+++.@ $%+- $. ", +" @*@ &+*&#++++$ -%+$ $# ", +" .& $+++%%++; @*+# && ", +" &. $%+#$ $+. @*+% #$ ", +" $%$ &%%#@ $%. @.+++$ #$", +"$ $+# $#++.@ -*& .+;@#%= .", +"+&&++@ $=%++++$ @.$ .%$ @..- ", +"++++.$&#%#&@ #+; @%$ @..@ $*$ ", +"++++++.& &% $%$ @*. #.@ ", +"+++%&@ #& $%$ -.= $.$ ", +"+*$ . #+& $%$ #.@ $", +"$ $& @++#%$ $%& @.+", +" #@ #+++$ @..$ &+%-", +" -# $.+#+# .+++%- ", +" #$ $.%& $%@ ++%- ", +" $. &*+#@ .# $++$ ", +" +.-#++#@ $+$ %+$ ", +" $++++.$ #% #+$ ", +" *+++& @+# $+# "}; diff --git a/assets/e.xpm b/assets/e.xpm new file mode 100644 index 0000000..2485cf0 --- /dev/null +++ b/assets/e.xpm @@ -0,0 +1,37 @@ +static char *east[] = { +"32 32 2 1", +". c #FFFFFF", +"# c #00FF00", +"................................", +"................................", +"................................", +"................................", +"....########################....", +"....########################....", +"..........................##....", +"..........................##....", +"..........................##....", +"..........................##....", +"..........................##....", +"..........................##....", +"..........................##....", +"..........................##....", +"..........##################....", +"..........##################....", +"..........................##....", +"..........................##....", +"..........................##....", +"..........................##....", +"..........................##....", +"..........................##....", +"..........................##....", +"..........................##....", +"....########################....", +"....########################....", +"................................", +"................................", +"................................", +"................................", +"................................", +"................................" +}; \ No newline at end of file diff --git a/assets/mossy_cobblestone1.xpm b/assets/mossy_cobblestone1.xpm new file mode 100644 index 0000000..90c85f7 --- /dev/null +++ b/assets/mossy_cobblestone1.xpm @@ -0,0 +1,1097 @@ +/* XPM */ +static char * mossy_cobblestone1_xpm[] = { +"64 64 1030 2", +" c #636363", +". c #5F5F5F", +"+ c #575757", +"@ c #5B5B5B", +"# c #727272", +"$ c #7A7A7A", +"% c #787878", +"& c #6A6A6A", +"* c #626262", +"= c #5E5E5E", +"- c #686868", +"; c #6D6D6D", +"> c #767676", +", c #6F6F6F", +"' c #6B6B6B", +") c #5C5C5C", +"! c #565656", +"~ c #545454", +"{ c #747474", +"] c #818181", +"^ c #848484", +"/ c #7B7B7B", +"( c #797979", +"_ c #707070", +": c #5A5A5A", +"< c #525252", +"[ c #676767", +"} c #585858", +"| c #656565", +"1 c #606060", +"2 c #555555", +"3 c #7E7E7E", +"4 c #646464", +"5 c #707170", +"6 c #6B6C6B", +"7 c #626362", +"8 c #717171", +"9 c #6C6C6C", +"0 c #595959", +"a c #515151", +"b c #777777", +"c c #757575", +"d c #747574", +"e c #5F645E", +"f c #415041", +"g c #555F54", +"h c #616361", +"i c #7D7D7D", +"j c #666666", +"k c #808080", +"l c #777877", +"m c #6D6F6D", +"n c #364636", +"o c #194318", +"p c #2E512C", +"q c #425A41", +"r c #40593F", +"s c #4A5C49", +"t c #5E625E", +"u c #838383", +"v c #687068", +"w c #60655F", +"x c #545654", +"y c #525652", +"z c #555655", +"A c #535353", +"B c #747673", +"C c #5B6A5A", +"D c #586658", +"E c #566354", +"F c #626A61", +"G c #1E351F", +"H c #1A4918", +"I c #1C5118", +"J c #1D5119", +"K c #1E511A", +"L c #3B5839", +"M c #5C625C", +"N c #7F7F7F", +"O c #777A77", +"P c #30572D", +"Q c #3E5A3C", +"R c #5D625D", +"S c #3A4D39", +"T c #2F462E", +"U c #374937", +"V c #485447", +"W c #4E4E4E", +"X c #828282", +"Y c #596858", +"Z c #1F511B", +"` c #1F461D", +" . c #20421F", +".. c #374D36", +"+. c #183219", +"@. c #153217", +"#. c #1A4A18", +"$. c #1C5119", +"%. c #32562F", +"&. c #545F53", +"*. c #7C7C7C", +"=. c #797A79", +"-. c #6B726A", +";. c #22521F", +">. c #275324", +",. c #505D4F", +"'. c #555954", +"). c #4E544E", +"!. c #505550", +"~. c #3E4F3D", +"{. c #1A3A19", +"]. c #163118", +"^. c #244623", +"/. c #435342", +"(. c #505050", +"_. c #556653", +":. c #1B4819", +"<. c #153117", +"[. c #153017", +"}. c #194217", +"|. c #1C4B19", +"1. c #3E583C", +"2. c #5E625D", +"3. c #5D645D", +"4. c #3D593B", +"5. c #214D1F", +"6. c #1B341C", +"7. c #1A321B", +"8. c #203821", +"9. c #475346", +"0. c #4E554E", +"a. c #1E3E1D", +"b. c #183C18", +"c. c #204D1D", +"d. c #375436", +"e. c #515651", +"f. c #6E6E6E", +"g. c #696969", +"h. c #7C7D7C", +"i. c #536652", +"j. c #163717", +"k. c #173817", +"l. c #274327", +"m. c #696F69", +"n. c #1F3820", +"o. c #1B4E18", +"p. c #1A4618", +"q. c #184218", +"r. c #163317", +"s. c #224420", +"t. c #455444", +"u. c #515550", +"v. c #1F4B1D", +"w. c #1C5018", +"x. c #275024", +"y. c #505450", +"z. c #4C4C4C", +"A. c #737373", +"B. c #646F63", +"C. c #235320", +"D. c #1A4718", +"E. c #173718", +"F. c #173518", +"G. c #183319", +"H. c #465A44", +"I. c #616360", +"J. c #767876", +"K. c #707570", +"L. c #455945", +"M. c #19351B", +"N. c #173618", +"O. c #1E431C", +"P. c #3D503C", +"Q. c #535653", +"R. c #214D1E", +"S. c #1C4E19", +"T. c #1B4A18", +"U. c #1C461A", +"V. c #20441E", +"W. c #415340", +"X. c #4B4D4B", +"Y. c #7B7C7B", +"Z. c #727572", +"`. c #6B736A", +" + c #6D736D", +".+ c #686A68", +"++ c #787978", +"@+ c #425F40", +"#+ c #1A4518", +"$+ c #1C411A", +"%+ c #1A3E1A", +"&+ c #20431F", +"*+ c #284527", +"=+ c #445A42", +"-+ c #606360", +";+ c #777977", +">+ c #616D61", +",+ c #3A5C38", +"'+ c #5E6D5D", +")+ c #6A7369", +"!+ c #4B604B", +"~+ c #18321A", +"{+ c #20471D", +"]+ c #385136", +"^+ c #525651", +"/+ c #4C554B", +"(+ c #415140", +"_+ c #204C1E", +":+ c #1B4F18", +"<+ c #1E501B", +"[+ c #3E543C", +"}+ c #4B4E4B", +"|+ c #434C42", +"1+ c #6A7069", +"2+ c #7B7D7B", +"3+ c #304231", +"4+ c #1B361C", +"5+ c #2A5427", +"6+ c #4D614C", +"7+ c #757975", +"8+ c #405E3E", +"9+ c #1A4818", +"0+ c #194118", +"a+ c #193A18", +"b+ c #163517", +"c+ c #193919", +"d+ c #2A4E28", +"e+ c #224620", +"f+ c #3B5739", +"g+ c #5A615A", +"h+ c #6D736C", +"i+ c #687168", +"j+ c #5A6A59", +"k+ c #22531F", +"l+ c #1D5019", +"m+ c #335331", +"n+ c #4F614E", +"o+ c #465B45", +"p+ c #1A4418", +"q+ c #2A4D28", +"r+ c #4B554A", +"s+ c #1E3D1D", +"t+ c #30512E", +"u+ c #3D4D3C", +"v+ c #1F431E", +"w+ c #395437", +"x+ c #626E61", +"y+ c #435143", +"z+ c #295626", +"A+ c #566C54", +"B+ c #687467", +"C+ c #6E746D", +"D+ c #364836", +"E+ c #163218", +"F+ c #345432", +"G+ c #596658", +"H+ c #565F55", +"I+ c #616161", +"J+ c #757775", +"K+ c #4A6249", +"L+ c #21521E", +"M+ c #1F521B", +"N+ c #1B4519", +"O+ c #1B401A", +"P+ c #224C1F", +"Q+ c #1C431A", +"R+ c #163417", +"S+ c #1F4D1C", +"T+ c #3A5339", +"U+ c #535652", +"V+ c #50534F", +"W+ c #1F3F1E", +"X+ c #1C4F19", +"Y+ c #1E4C1B", +"Z+ c #1B3F19", +"`+ c #1B341D", +" @ c #1C4C18", +".@ c #1E521A", +"+@ c #20521D", +"@@ c #31582E", +"#@ c #626F61", +"$@ c #5C665C", +"%@ c #1F3720", +"&@ c #254924", +"*@ c #566755", +"=@ c #767875", +"-@ c #727271", +";@ c #656665", +">@ c #455346", +",@ c #224A21", +"'@ c #1B4C18", +")@ c #1C4D18", +"!@ c #284E26", +"~@ c #4A5449", +"{@ c #525352", +"]@ c #4F4F4F", +"^@ c #4D4D4D", +"/@ c #4C4E4C", +"(@ c #2D4B2B", +"_@ c #163217", +":@ c #1C4A19", +"<@ c #1B4D18", +"[@ c #1B4919", +"}@ c #275224", +"|@ c #5B6C5A", +"1@ c #767976", +"2@ c #616D60", +"3@ c #354A35", +"4@ c #2D492C", +"5@ c #5A6259", +"6@ c #737673", +"7@ c #203521", +"8@ c #173B17", +"9@ c #173D17", +"0@ c #1C4919", +"a@ c #2F4F2D", +"b@ c #5D645C", +"c@ c #6C6D6C", +"d@ c #6C716C", +"e@ c #2A5527", +"f@ c #1B4B18", +"g@ c #1D4D1A", +"h@ c #1D431C", +"i@ c #193A19", +"j@ c #184018", +"k@ c #1A3E19", +"l@ c #264B25", +"m@ c #5C6C5B", +"n@ c #636C63", +"o@ c #324E31", +"p@ c #5A625A", +"q@ c #696C69", +"r@ c #273C27", +"s@ c #183718", +"t@ c #365534", +"u@ c #6E756E", +"v@ c #7D7E7D", +"w@ c #6B716A", +"x@ c #465746", +"y@ c #1C491A", +"z@ c #2D572B", +"A@ c #50674F", +"B@ c #485E46", +"C@ c #415A3F", +"D@ c #2F452F", +"E@ c #1D401D", +"F@ c #486346", +"G@ c #6D756D", +"H@ c #747774", +"I@ c #3D4E3D", +"J@ c #18331A", +"K@ c #3F5B3E", +"L@ c #646A64", +"M@ c #6A6D6A", +"N@ c #354836", +"O@ c #173A17", +"P@ c #193E19", +"Q@ c #163318", +"R@ c #22501E", +"S@ c #4A6348", +"T@ c #737773", +"U@ c #787C78", +"V@ c #687268", +"W@ c #6A7469", +"X@ c #334F32", +"Y@ c #1D521A", +"Z@ c #436141", +"`@ c #70766F", +" # c #757875", +".# c #717571", +"+# c #5D675D", +"@# c #2E472D", +"## c #1B4419", +"$# c #1A371A", +"%# c #395138", +"&# c #5A6759", +"*# c #606D5E", +"=# c #656765", +"-# c #1C341E", +";# c #163117", +"># c #183419", +",# c #173319", +"'# c #1A3B1A", +")# c #1B3F1A", +"!# c #183918", +"~# c #234A21", +"{# c #2C5229", +"]# c #3A5737", +"^# c #6B736B", +"/# c #838483", +"(# c #636B63", +"_# c #1C351E", +":# c #1C341D", +"<# c #183818", +"[# c #163617", +"}# c #194518", +"|# c #1C4F18", +"1# c #2E582B", +"2# c #5F6E5E", +"3# c #6C6E6C", +"4# c #425541", +"5# c #1C401B", +"6# c #183F18", +"7# c #1B381C", +"8# c #445A43", +"9# c #677166", +"0# c #6F706F", +"a# c #424D42", +"b# c #244723", +"c# c #3C543A", +"d# c #40553F", +"e# c #21451F", +"f# c #2E4B2D", +"g# c #4D554D", +"h# c #4F554F", +"i# c #757A74", +"j# c #243A25", +"k# c #385C36", +"l# c #2C462C", +"m# c #183B18", +"n# c #1D411B", +"o# c #476145", +"p# c #5A5B5A", +"q# c #3B473A", +"r# c #1C391C", +"s# c #2A4A29", +"t# c #41543F", +"u# c #515551", +"v# c #555654", +"w# c #384E36", +"x# c #30502E", +"y# c #233E23", +"z# c #3E533D", +"A# c #545653", +"B# c #7E7F7D", +"C# c #566355", +"D# c #1B441A", +"E# c #1C4719", +"F# c #355B33", +"G# c #6E756D", +"H# c #666A66", +"I# c #194218", +"J# c #193C19", +"K# c #244A22", +"L# c #546953", +"M# c #445443", +"N# c #565655", +"O# c #50564F", +"P# c #40543F", +"Q# c #4F554E", +"R# c #767A76", +"S# c #546453", +"T# c #1E4E1B", +"U# c #1E411E", +"V# c #294B27", +"W# c #1F451D", +"X# c #265422", +"Y# c #3D5E3A", +"Z# c #6F756F", +"`# c #606760", +" $ c #203921", +".$ c #234123", +"+$ c #335332", +"@$ c #31512F", +"#$ c #173418", +"$$ c #3E5E3C", +"%$ c #6D746C", +"&$ c #576157", +"*$ c #1C411B", +"=$ c #173917", +"-$ c #325131", +";$ c #546752", +">$ c #5D6D5C", +",$ c #657164", +"'$ c #555F55", +")$ c #596558", +"!$ c #6A736A", +"~$ c #546053", +"{$ c #1A3D1A", +"]$ c #4C644B", +"^$ c #5D5D5D", +"/$ c #3D503D", +"($ c #1B4818", +"_$ c #425E41", +":$ c #717671", +"<$ c #636463", +"[$ c #4B5D4A", +"}$ c #1C3C1B", +"|$ c #3C543B", +"1$ c #717670", +"2$ c #535D52", +"3$ c #1B371B", +"4$ c #1C3E1B", +"5$ c #214320", +"6$ c #586A56", +"7$ c #787977", +"8$ c #757675", +"9$ c #2B442B", +"0$ c #2A4829", +"a$ c #475F46", +"b$ c #495249", +"c$ c #1C361D", +"d$ c #526851", +"e$ c #516550", +"f$ c #3E583D", +"g$ c #405D3E", +"h$ c #687267", +"i$ c #575D57", +"j$ c #314531", +"k$ c #515351", +"l$ c #464D46", +"m$ c #3E533E", +"n$ c #223D22", +"o$ c #727871", +"p$ c #657064", +"q$ c #777876", +"r$ c #6A6C6A", +"s$ c #233924", +"t$ c #4C584C", +"u$ c #616D5F", +"v$ c #596458", +"w$ c #6A6C69", +"x$ c #4E544D", +"y$ c #3F533D", +"z$ c #255022", +"A$ c #2D532B", +"B$ c #1B431A", +"C$ c #2D522B", +"D$ c #255322", +"E$ c #2C5629", +"F$ c #606E5F", +"G$ c #535B53", +"H$ c #364736", +"I$ c #1A4319", +"J$ c #1F4F1C", +"K$ c #1D431B", +"L$ c #4F5F4F", +"M$ c #717570", +"N$ c #6B706B", +"O$ c #6B6E6B", +"P$ c #696A69", +"Q$ c #4B524B", +"R$ c #1D341E", +"S$ c #1A4219", +"T$ c #204B1E", +"U$ c #486047", +"V$ c #6C736B", +"W$ c #314F30", +"X$ c #1C4C19", +"Y$ c #1F471D", +"Z$ c #243E24", +"`$ c #354C35", +" % c #455A44", +".% c #5C615C", +"+% c #445043", +"@% c #294728", +"#% c #304B2F", +"$% c #203D20", +"%% c #193B18", +"&% c #3D5C3B", +"*% c #6C726B", +"=% c #676867", +"-% c #6F756E", +";% c #355933", +">% c #173C17", +",% c #194418", +"'% c #375636", +")% c #5F625F", +"!% c #4B514B", +"~% c #2C4E2A", +"{% c #194018", +"]% c #345233", +"^% c #404E40", +"/% c #5C675B", +"(% c #777B77", +"_% c #546952", +":% c #1E451D", +"<% c #1B4718", +"[% c #1F521C", +"}% c #4C5D4B", +"|% c #5D615D", +"1% c #3A463A", +"2% c #184117", +"3% c #183E17", +"4% c #355134", +"5% c #717B71", +"6% c #828382", +"7% c #3F5B3D", +"8% c #1F3D1F", +"9% c #245221", +"0% c #4C5C4B", +"a% c #626361", +"b% c #494F49", +"c% c #1A331C", +"d% c #173218", +"e% c #1C4E18", +"f% c #173818", +"g% c #466244", +"h% c #797E79", +"i% c #6B746B", +"j% c #566955", +"k% c #415C3F", +"l% c #325530", +"m% c #5E615D", +"n% c #515251", +"o% c #434A43", +"p% c #334633", +"q% c #3D553B", +"r% c #325430", +"s% c #1A351B", +"t% c #1C371D", +"u% c #2F4D2E", +"v% c #466144", +"w% c #2F4A2E", +"x% c #1A3C19", +"y% c #1A3D19", +"z% c #496547", +"A% c #7A7F7A", +"B% c #3F5A3E", +"C% c #173318", +"D% c #435542", +"E% c #616260", +"F% c #5D6C5C", +"G% c #6C756B", +"H% c #787C77", +"I% c #2D4C2C", +"J% c #245021", +"K% c #667465", +"L% c #818281", +"M% c #284A26", +"N% c #1A4218", +"O% c #335031", +"P% c #7E7F7E", +"Q% c #324E30", +"R% c #264824", +"S% c #1C421A", +"T% c #1C451A", +"U% c #1D4B1A", +"V% c #7F807F", +"W% c #696E69", +"X% c #515D50", +"Y% c #6A7269", +"Z% c #5F6D5E", +"`% c #173119", +" & c #5E615E", +".& c #727372", +"+& c #686F68", +"@& c #254524", +"#& c #32522F", +"$& c #234023", +"%& c #183819", +"&& c #1A4119", +"*& c #243B24", +"=& c #253A26", +"-& c #2C412C", +";& c #405C3F", +">& c #5E695E", +",& c #465F45", +"'& c #19351A", +")& c #3A473A", +"!& c #606260", +"~& c #7A7D7A", +"{& c #334E32", +"]& c #274A25", +"^& c #496048", +"/& c #445743", +"(& c #1D511A", +"_& c #2A4D29", +":& c #545B53", +"<& c #7C7E7C", +"[& c #466044", +"}& c #1D3D1C", +"|& c #233D24", +"1& c #163017", +"2& c #1B351D", +"3& c #384D38", +"4& c #6A726A", +"5& c #636F62", +"6& c #203B21", +"7& c #2C532A", +"8& c #475B46", +"9& c #60655E", +"0& c #1D3E1D", +"a& c #2E4C2D", +"b& c #3C573B", +"c& c #7A7A79", +"d& c #51664F", +"e& c #335631", +"f& c #1D441C", +"g& c #5D6C5B", +"h& c #717471", +"i& c #70706F", +"j& c #5F6C5F", +"k& c #275424", +"l& c #1E441C", +"m& c #415D3F", +"n& c #667065", +"o& c #70756F", +"p& c #6A6B6A", +"q& c #626461", +"r& c #566255", +"s& c #325230", +"t& c #697168", +"u& c #6C736C", +"v& c #3A5B38", +"w& c #616E5F", +"x& c #245321", +"y& c #183E18", +"z& c #5C685B", +"A& c #787B78", +"B& c #4D644B", +"C& c #284827", +"D& c #556754", +"E& c #606D5F", +"F& c #1E521B", +"G& c #375B35", +"H& c #596259", +"I& c #4E594D", +"J& c #4E5A4D", +"K& c #566756", +"L& c #193B19", +"M& c #18341A", +"N& c #273E27", +"O& c #707270", +"P& c #7C7F7C", +"Q& c #4C634A", +"R& c #1E381F", +"S& c #546353", +"T& c #747874", +"U& c #1F4C1D", +"V& c #183519", +"W& c #224222", +"X& c #596559", +"Y& c #19371A", +"Z& c #284D26", +"`& c #254822", +" * c #4D634B", +".* c #374737", +"+* c #4A524A", +"@* c #7A7B7B", +"#* c #596959", +"$* c #4A564B", +"%* c #20491E", +"&* c #214520", +"** c #4B6149", +"=* c #646564", +"-* c #606A60", +";* c #354C34", +">* c #4D5F4C", +",* c #525E51", +"'* c #586957", +")* c #727671", +"!* c #646764", +"~* c #253826", +"{* c #7C7D7D", +"]* c #384938", +"^* c #2B5029", +"/* c #556254", +"(* c #686968", +"_* c #274725", +":* c #1C4619", +"<* c #254724", +"[* c #4C5E4B", +"}* c #666866", +"|* c #7A7C7A", +"1* c #686D68", +"2* c #576056", +"3* c #3A4E39", +"4* c #213C21", +"5* c #365633", +"6* c #5B625A", +"7* c #22511E", +"8* c #2C482B", +"9* c #626961", +"0* c #5B685A", +"a* c #1C4B1A", +"b* c #576457", +"c* c #737372", +"d* c #676C66", +"e* c #3C4E3C", +"f* c #184118", +"g* c #243F23", +"h* c #596758", +"i* c #6B716B", +"j* c #1E3D1E", +"k* c #395438", +"l* c #747973", +"m* c #50644E", +"n* c #425D40", +"o* c #717870", +"p* c #6F746E", +"q* c #727672", +"r* c #505E50", +"s* c #1F421E", +"t* c #184017", +"u* c #375236", +"v* c #647163", +"w* c #727772", +"x* c #797A78", +"y* c #686E68", +"z* c #1C3F1B", +"A* c #395537", +"B* c #394E38", +"C* c #233F23", +"D* c #546A52", +"E* c #646C63", +"F* c #365934", +"G* c #21521D", +"H* c #304C2F", +"I* c #1E3520", +"J* c #435842", +"K* c #5B5D5B", +"L* c #455843", +"M* c #1D4A1A", +"N* c #1E361F", +"O* c #5C6B5C", +"P* c #5B695B", +"Q* c #3F563F", +"R* c #324D31", +"S* c #1D391D", +"T* c #5D675C", +"U* c #6A746A", +"V* c #677566", +"W* c #727971", +"X* c #515B51", +"Y* c #1E441D", +"Z* c #194618", +"`* c #3F5D3D", +" = c #535553", +".= c #365035", +"+= c #676D67", +"@= c #737672", +"#= c #265423", +"$= c #355A33", +"%= c #4D5E4C", +"&= c #243C25", +"*= c #203721", +"== c #566954", +"-= c #7B7E7A", +";= c #60685F", +">= c #1F3F1F", +",= c #163817", +"'= c #2E4F2D", +")= c #2E4A2E", +"!= c #345133", +"~= c #284128", +"{= c #233824", +"]= c #2F3F30", +"^= c #485248", +"/= c #255222", +"(= c #245220", +"_= c #193F18", +":= c #466243", +"<= c #5D695D", +"[= c #314730", +"}= c #2C502A", +"|= c #576756", +"1= c #818180", +"2= c #4F654E", +"3= c #797978", +"4= c #3D4B3C", +"5= c #163518", +"6= c #2A4C29", +"7= c #546553", +"8= c #666D66", +"9= c #6C706C", +"0= c #696C6A", +"a= c #515751", +"b= c #3F593D", +"c= c #6E746E", +"d= c #3C4F3B", +"e= c #1C4819", +"f= c #1D451B", +"g= c #656964", +"h= c #536752", +"i= c #20521C", +"j= c #4E654B", +"k= c #5C645B", +"l= c #4F5A4F", +"m= c #6D716D", +"n= c #6D6E6D", +"o= c #3B4C3B", +"p= c #275124", +"q= c #50634F", +"r= c #696D69", +"s= c #626562", +"t= c #283E29", +"u= c #446141", +"v= c #354F34", +"w= c #254E22", +"x= c #536352", +"y= c #767776", +"z= c #676967", +"A= c #486147", +"B= c #274826", +"C= c #5F675D", +"D= c #2C402D", +"E= c #344734", +"F= c #1A381B", +"G= c #173219", +"H= c #183D18", +"I= c #375735", +"J= c #1D4F19", +"K= c #395A37", +"L= c #515451", +"M= c #314131", +"N= c #1F511C", +"O= c #5A6858", +"P= c #374537", +"Q= c #345831", +"R= c #636362", +"S= c #5B605B", +"T= c #4F5D4E", +"U= c #3D553C", +"V= c #2C452C", +"W= c #516150", +"X= c #545D54", +"Y= c #5C665B", +"Z= c #676F66", +"`= c #4B5A4A", +" - c #1C471A", +".- c #385736", +"+- c #60665F", +"@- c #5D5E5D", +"#- c #484F48", +"$- c #1A341B", +"%- c #194417", +"&- c #6C726C", +"*- c #525551", +"=- c #324631", +"-- c #183D17", +";- c #3A4F38", +">- c #183619", +",- c #1D3B1E", +"'- c #274227", +")- c #4B574B", +"!- c #3F563E", +"~- c #2C5429", +"{- c #31522F", +"]- c #575E56", +"^- c #565756", +"/- c #424E41", +"(- c #274127", +"_- c #1E451C", +":- c #4E654C", +"<- c #525552", +"[- c #2A4728", +"}- c #1D421B", +"|- c #475C45", +"1- c #5F625E", +"2- c #2B492A", +"3- c #1B4719", +"4- c #355333", +"5- c #5B655B", +"6- c #626462", +"7- c #435A42", +"8- c #555854", +"9- c #294129", +"0- c #545554", +"a- c #334B32", +"b- c #1D401C", +"c- c #2E502B", +"d- c #3E573C", +"e- c #30542E", +"f- c #415A40", +"g- c #556054", +"h- c #425E40", +"i- c #334932", +"j- c #1B3D1A", +"k- c #4F644D", +"l- c #6E736D", +"m- c #5B5E5B", +"n- c #526450", +"o- c #2F542D", +"p- c #2B5228", +"q- c #173717", +"r- c #254624", +"s- c #526351", +"t- c #6C6F6B", +"u- c #616961", +"v- c #344E32", +"w- c #19331A", +"x- c #1D351E", +"y- c #2F442F", +"z- c #526151", +"A- c #656A64", +"B- c #485048", +"C- c #233A24", +"D- c #193819", +"E- c #415740", +"F- c #575C56", +"G- c #395B37", +"H- c #234622", +"I- c #254325", +"J- c #4D654B", +"K- c #767A75", +"L- c #235120", +"M- c #223E22", +"N- c #4B544B", +"O- c #3E503D", +"P- c #314E30", +"Q- c #586057", +"R- c #575857", +"S- c #667265", +"T- c #787E78", +"U- c #465546", +"V- c #345332", +"W- c #285026", +"X- c #20401F", +"Y- c #2B482A", +"Z- c #41573F", +"`- c #555B55", +" ; c #4E4F4E", +".; c #255122", +"+; c #2E552C", +"@; c #3B523A", +"#; c #40563F", +"$; c #596059", +"%; c #4B534B", +"&; c #2E4F2C", +"*; c #4B4D4A", +"=; c #295026", +"-; c #285525", +";; c #556854", +">; c #325630", +",; c #254225", +"'; c #4F5D4D", +"); c #5B615B", +"!; c #575F56", +"~; c #5A6059", +" . + @ # $ $ $ $ % & * = @ @ - ; > , ' * ) + ! ~ { ] ^ / $ $ $ $ $ $ $ $ $ $ $ ( - - ( _ : ! ! < , > _ [ ", +" . ! } # $ $ $ ( - - & ; > _ ; | 1 @ + ! ! ! 2 * 3 ^ 3 $ $ $ $ $ $ $ $ $ $ $ $ { 4 ; ( ; } ! = ( 5 6 7 ", +" * } + 8 $ $ $ $ ( ( # 9 4 . 0 ! ! ! ! ! ! ! a b ^ ] $ $ $ $ $ $ $ $ $ $ $ $ $ ; 4 c ( ' 0 > d e f g h h 7 ", +" : ! - $ $ i i $ ( & = } ! ! ! ! ! ! ! ! ! a j k ^ / $ $ $ $ $ $ $ $ $ $ $ $ % 4 ' $ ( l l m n o p q r s t ", +" : ! | ( / ] ^ u / v w 7 1 0 ! ! ! ! ! x y x z ! ! ~ A / ^ 3 $ $ $ $ $ $ $ $ $ $ $ $ ( - 4 B C D E F G H I J K L M ", +" : + j ( i u ^ N 3 O P Q R ) ! ! ! ! ! z S T U V y ! ! W 9 X ] $ $ $ $ $ $ $ $ $ $ $ ( ' ' Y Z ` ...+.@.#.$.%.&.7 ", +" : } ' $ N ^ X *.$ =.-.;.>.,.'.).!.x ! ! z ~.{.].^./.y ! (.) 3 ^ / $ $ $ $ $ $ $ $ $ c - 4 _ ( _.I :.<.[.[.[.}.|.1.2. ", +": } 8 $ ] ^ k $ $ l 3.4.I I 5.6.7.8.9.z ! ! 0.a.@.b.c.d.e.a W > u N $ $ $ $ $ $ $ ( f.4 g.c i h.i.I #.j.<.[.[.@.k.l.&.7 ", +"@ # i X u i $ $ $ m.n.o.p.q.}.r.[.s.t.z ! ! u.v.w.w.I x.t.y.z.j N X $ $ $ $ $ $ A.[ j # i ] i B.C.I I w.D.E.F.[.[.G.H.I. : ", +"b i u ] / $ $ =.J.K.L.M.<.[.[.[.N.O.P.Q.! ! u.l.R.S.T.U.V.W.X.2 ( u Y.Z.F `. +.+j 8 i X ] / ++@+I I w.w.w.#+$+%+&+*+=+-+ : * ", +"k u 3 $ $ $ ;+>+,+'+)+!+~+[.[.N.$+{+]+^+! ! x /+(+_+:+w.<+[+}+|+1+2+K.3+4+;.5+6+7+] X i $ $ ;+8+9+0+a+b+k.c+d+e+f+g g+7 * @ 9 ( ", +"X i $ ;+h+i+j+k+l+m+n+o+~+[.@.p+U.q+r+z ! ! ! ! u.s+#.I J t+u+v+w+x+y+[.@.w.I z+A+B+C+;+$ $ J.D+<.[.[.[.E+F+j+G+H+h I+. # $ k ", +"/ $ J+K+C.L+M+w.N+O+P+Q+N.R+#.I S+T+U+! ! ! ! ! V+W+o I I X+Y+Z+F.`+].[.<. @I I .@+@@@#@++$ ( $@%@[.[.[.&@*@=@-@;@ I+| % $ ] ] ", +"$ l >@,@w.I I H @.@.'@w.)@#.I w.!@~@{@a a ]@^@^@/@(@w.I w.I I w.#.@.[.[._@:@I <@[@|.}@|@++$ $ 1@2@3@[.[.4@5@b ( f.| _ ( / ] 3 $ ", +"$ 6@7@<.8@:@I w.R+[.9@<@I I I 0@a@b@j j j j - c@d@e@I f@k.H I g@h@i@i@<.@.w.I j@<.k@l@m@++$ $ $ ++n@`+[.o@p@; $ $ ( $ / k *.$ $ ", +"8 q@r@[.[.s@'@w.b.[.[.r.f@I I :@t@u@$ $ / i v@w@x@y@:+#+0@w.I z@A@B@C@D@_@w.H <.[.E@F@G@=.$ $ $ $ H@I@J@K@L@4 ( $ $ $ i $ ( % c ", +", M@N@[.[.[.O@<@P@Q@[.}.I J I R@S@T@k u U@V@W@X@k@'@I I I I Y@Z@`@ #.#+#@###E.[.[.$#%#&#K.=.$ $ $ =.C+n+*#=#- ( $ $ $ # _ _ _ _ ", +", w -#[.;#>#,#'#)#!#[.O@~#t@{#]#^#$ ^ /#(#_#:#G.<#[#}#|#I I 1#2#++$ $ 3#4#5#_@[.[.<.6#7#8#9#;+$ $ $ =.J.0#4 { $ $ $ $ $ ( ( % c ", +"7 a#[.;#b#c#d#c#e#Z+<.;#f#g#g#h#& $ k ^ i#j#<.<.[.[.[.@.p.I k#u@$ $ $ l H+l#[.b+}.9+w.m#n#o#T@$ $ $ $ % | 9 $ ( , { $ > | 4 4 4 ", +"p#q#r#s#t#u#v#e.w#x#y#s+z#A#! ! ~ > *.^ B#C#D#j@[.[.[.r.E#I F#G#$ $ $ $ H#-#[.I#w.I |#J#K#L#J.$ $ $ $ ' [ ( ( 8 4 | % ( - = ", +"! ).M#/+Q.! ! N#^+O#9.P#Q#! ! ! A 1 $ ] R#S#T#<@r.[.U#V#W#X#Y#Z#$ $ $ $ `# $.$+$@$X+w.#$$$%$=.$ $ $ A.| c $ A.[ j ( { 4 } ", +"! ! z ! ! ! ! ! ! ! z x ! ! ! ! ! (.8 Y.&$*$I I '@=$-$'+;$>$,$J.$ $ $ $ 6@'$)$!$~${$T.>#]$ #$ $ $ b j # $ { ' 1 f.$ 9 ^$", +"! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! a @ H@/$o.'@($o b._$:$l ++=.$ $ $ $ ( & <$5 =.K.[$}$;#|$1$$ $ ( & 9 $ > , 4 ^$A.% j ", +"^$! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! 2 W 2$3$r.>#4$k@5$6$7$$ $ $ $ $ $ c - | { / / 8$6@9$0$a$1$$ $ _ & ( b _ - * I+( { 4 ", +"* + ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! (.b$c$h@d$e$f$g$h$=.$ $ $ $ ( , 4 & % N i $ c A.i$j$i#7$=.c ' ( ( 8 9 ^$g.( 9 ", +"4 ^$! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! k$l$m$n$o$G@p$)+q$$ $ $ $ c g.| A.i ] *.$ $ $ { r$s$t$u$v$w$% $ A., j * : A.$ ", +"{ } ! ! ! ! ! ! ! ! ! ! ! ! ! z x$y$z$A$B$C$D$E$F$++$ $ ( f.| 9 $ ] ] / $ $ $ $ J.G$H$I$J$K$L$M$N$O$P$ . . ( ", +"$ ; = ! ! ! ! ! ! ! ! ! ! z U+U+Q$R$S$I I I I |#T$U$:$$ { - g.c N u N $ $ $ $ $ $ V$W$#$o I X$Y$Z$G `$ %.% : g.", +"8 ( g.0 ! ! ! ! ! ! ! ! z +%@%#%$%[.@.H I I #.%%)#&%*%r$=%# / X ^ i $ $ $ $ $ $ $ -%A@;%X+H o >%[.[.,%I '%)% 1 + ", +"^$( > I+! ! ! ! ! ! ! ! !%~%0@|.{%[.[.<#)@I o [.E+]%^%y+/%(%u u i $ $ $ $ $ $ $ $ ( H@_%:%<.[.[.[.<.<%I [%}%|%7 @ ", +"! - $ A.: ! ! ! ! ! ! z 1%H I 9+@.[.[.[.}#I 2%[.[.].8@3%4%5%6%*.$ $ $ $ $ $ $ $ $ $ =.)+7%8%E+<.[._@:@I I K 9%0%a% * ", +"@ } A.$ & + ! ! ! ! ! b%c%#$|#O@[.[.d%[.8@e%f%[.[.<.p.l+g%h%*.$ $ $ $ $ $ $ $ $ $ $ $ ++i%j%k%5$[.O@w.I #.|.X+l%m% ", +"* + 1 ( ( 2 A A A n%o%p%q%r%s%t%u%v%P#w%x%y%[.<.o w.J z%A%i $ $ $ $ $ $ $ $ $ $ $ $ $ =.;+C+B%C%o I H @.N.K$D%E% ", +" ) + , $ ( > { { b ++l H@H@C+F%F%G%U@H%G%I%x%[.=$|#e%w.J%K%L%*.$ ++( $ $ $ $ $ $ $ $ $ $ $ ++2#M%b.N%<.[.E+O%g 7 ", +" * + & $ $ $ $ $ *.N N k X u L%P%P%i $ H@Q%R%].<.y%S%T%U%o+ #V%W%X%Y%++=.$ $ $ $ $ $ $ $ $ ++Z%V#$+F.[.[.`%t. & ", +" I++ # / N k u ^ u u ] N i / $ $ $ $ $ .&+&F%%@@&#&$&%&&&y%*&=&-&I$;&B.>&^#;+$ $ $ $ $ $ $ T@,&O.N.[.[.[.<.'&)&!& ", +" ^$^$( ] ^ ^ k N / $ $ $ $ $ $ $ $ $ b ; ( ~&Z%'+!$B.{&U%]&^&/&G.'@(&L+Z m+Z%K.++$ $ $ $ $ ;+>$_&[.r.}.o H :+4+:& ", +" : ; 3 ^ k / $ $ $ $ $ $ $ $ $ $ $ ( ' b i u <&++$ ;+[&w.Q+}&|&1&j.w.|#E#k@2&3&4&=.$ $ $ $ =.5&6&E+_@T.I I 7&8&9& ", +"* @ ( u ] $ $ $ $ $ $ $ $ $ $ $ $ $ 8 f./ u ] $ $ $ q$8+w.b.[.[.[.@.o.:@$+0&a&b&,$=.$ $ $ $ c&%$d&e&f&S%:@+@g&h&i&' 4 ", +"= 9 N X $ $ =.T@;+$ $ $ $ $ $ $ $ c [ ( ] u / $ $ ++j&k&I p.=$[.[.[.O@R+l&m&n&o&;+$ $ $ ( c _ p&q&r&s&c+T%9%t&% b A.; | ", +"= ( u *.$ $ u&v&w&;+=.++++=.$ $ ( g.A.i u i $ $ $ i+x&I I I w.y&<#<.[.[.)#z&++( ( A._ , _ _ # % $ A&B&,#C&D& #$ # 8 > _ [ ", +"f.N i $ $ $ E&F&G&x+H&I&J&!$=.$ ; & $ u k $ $ $ =.K&w.w.|.)@w.e%k@Z+L&M&0&N&O&c ( ( $ $ $ $ $ ] u P&Q&R&S&T&$ $ $ { ' b c 9 4 ", +"$ k $ $ $ l j+F&J U&V&[.W&g&++{ | b k X $ $ $ $ ++X&Y&@.r.@.@.#$Z&`&!@ *F%.*+*@*N k ] 3 $ { $ u 3 7$F$#*T@$ $ $ $ $ { [ { ( A.f.", +"*.$ $ $ l $*%*|#o }.@.[.&****%=*_ *.u *.$ $ $ ++-*;*k.<.[.[.E+a@>*,*'*)*Y.!*~*{*u i $ $ ( f.$ u / $ ++;+$ $ $ $ $ $ $ { | { $ $ ", +"c , _ 8 Z.]*y&k.[.[.[.N.S%^*/*(*$ ] 3 $ $ $ $ :$_*:*|#R+[.[.<*[*}*8$|*N / 3#8.1*N $ $ $ $ 9 $ u / $ $ $ $ $ $ $ $ $ $ $ # 4 { $ ", +"( ( { ; =*2*3*4*[.[.<.Z+%+5*6*c 3 ] $ $ $ $ $ m.7*I |.x%[.[.8*9*/ ] N $ =.0*a*b*v@$ $ $ $ _ b X i $ $ $ $ $ $ $ $ $ $ $ { 4 8 $ ", +"4 j f.8 % c*d*e*[.[.8@)@f*g*h*;+] / $ $ $ $ $ i*j*H w.Q+E+<.k*l*u i $ $ ++m*I n*o*p*C+q*++, _ k N $ $ $ $ $ $ $ $ $ $ $ , 4 ( 9 ", +"^$^$. 4 P$r*s*r.R+:+I t*<.u*v*G#w*x*$ $ $ =.y*_#z*:@A*B*C*D*P&*.$ $ J.E*F*I G*H*I*G J*Z#8 , N N $ $ $ $ $ $ $ $ $ $ ( - f.{ 4 ", +"! ! ! + 0 K*L*M*:.#.I |#R+[.E+`+N*P.p$;+$ ;+O*P*Q*R*S*T*U*V*W*$ $ $ =.X*Y*w.Z*}#3%[.C%`*Z#{ 9 / ] $ $ $ $ $ $ $ $ $ $ b | > g.= ", +"! ! ! ! =1%h@H w.#.o D.N.[.[.[.[.Q@.=+=% @=#=$=%=&=C%*===-=$ $ $ $ =.;=>=,=[.[.[.<.y%'=#@6 ; $ X 3 $ ;+=@=.$ $ $ $ $ , ; { * + ", +"! ! ! ! u#G [.<.r.<.[.o 8@[.Q@<*)=!=~={=]=^=/=$.(=_=[.,#:=V$;+$ $ $ $ q$<=[=[.[.[.x%S%}=|=P$( $ / k 1=F%2=G#=.=.3=( ( - > ' ) ! ", +"! ! ! ! v#4=+.[.[.[.@.o.|#5=6=7=8=9=.&0=a=R&S.w.D.8@[.F.O.b=c=$ $ $ $ =.c=d=[.[._@e=f=m&g=% 8 | 9 ( Y.h=i=j=V$k=l=v$m=n=b * + ! ", +"! ! ! ! ! u#o=t%[.[.N%I I p=q=r=& & & g.s=t=:+9@<.[.[.y%K$u=:$$ $ $ $ J.v=z*<.j.'@I w=x=y=& : ! ! } z=A=I [%B=+.[.o@C=l , : ! ! ", +"! ! ! ! ! ! y D=[.k.)@I I E$0*}* &E=F=G=[.[.<.&&H=R*5&J.=.=.$ ^#I=|.p.f@I J=K=h+& : ! ! ! L=M=N='@,%2%<._@d+O==@4 ! ! ! ", +"! ! ! ! ! ! z P==$|#I I I J Q=g 7 R=S=T=U=G=[.j.|#D.<.V=W=X=Y=Z=`=g@I I I I -.-+-@-! ! ! ! #-$-%-R+[.[.[.i@K$7%&-@ ! ! ! ", +"! ! ! ! ! N#*-=-I#w.H --{%|#(&b=t )%;->-<.}#I }#[.[.G=[.~+,-'-)-!-~-I I -{-]-^-! ! ! ! A#/-(-].[.[.Q@k@_-:-h&+ ! ! ! ", +"! ! ! ! ! <-[-}-O+5=<.[.N.Q+}@|-1- S=2-E#}#w.I 3-<.[.[.[.M&4-5-<$6-z&C.I J%7-8-! ! ! ! ! ! x ~@9-[.[.>%)@#$r G#5 0 0-! ", +"2 ! ! ! ! Q.a-c+<.[.[.[.b-c-d-g+7 t e-I I I I )@@.[.#$s#f-g-=%8 ( ;+j+@@h-g+} ! ! ! ! ! ! x i-j-<.8@w.w.@.s%k--.l-m-< ", +"(.< ! ! ! b%*=[.<.<.[.<.l@n-.%7 -+8&o-p-/=I w.q-[.r-s-t-l *.N 3 i J.u- +P$. ! ! ! ! ! ! Q.v-:@#+f@I f@<.[.w-x-y-z-A-", +"c ^$]@< ! B-C-d%o 9+=$>%D-E-t -+F-0.,.G-x&H-I-J-K-k X 3 / $ $ $ { ' % - ) ! ! ! ! ! h#L-I I I I e=<.[.[.[.[.M-Z%", +", % f.2 ]@k$N-O-P-(&w.w.y&8*Q- = ! R- +p$S-B+T-N *.$ $ $ $ $ $ $ f.' c | 0 ! ! ! ! x U-V-W-J I T.<.[.%&X-Y-Z-`-", +"} * c % j ]@ ;k$Q#.;J +;@;#;$; I+@ ! + * ( h.6%k / $ $ $ $ $ $ $ $ $ ( g.; { * + ! ! ! ! z y.%;8+(&'@<.E+&;}%2*1-1 ", +"* : 0 f.( { 1 W *;=;-;;;1*)%7 . @ + } * _ ( $ i ^ N $ $ $ $ $ $ $ $ $ $ $ c | A.{ 1 ! ! ! ! ! a & +^&>;,;O%';!& ", +" ) + * % $ # 1 [$L#l-6 * ^$} ! 1 ' b / N *.% $ ^ k $ $ $ $ $ $ $ $ $ $ $ $ , 4 c # ) ! ! ! 2 + % A.q@);!;~;I. "}; diff --git a/assets/n.xpm b/assets/n.xpm new file mode 100644 index 0000000..9b21736 --- /dev/null +++ b/assets/n.xpm @@ -0,0 +1,37 @@ +static char *north[] = { +"32 32 2 1", +". c #FFFFFF", +"# c #00ff95ff", +"................................", +"................................", +"................................", +"................................", +".....##..................##.....", +".....##.................###.....", +".....##................####.....", +".....##...............#####.....", +".....##..............######.....", +".....##.............####.##.....", +".....##............####..##.....", +".....##...........####...##.....", +".....##..........####....##.....", +".....##.........####.....##.....", +".....##........####......##.....", +".....##.......####.......##.....", +".....##......####........##.....", +".....##.....####.........##.....", +".....##....####..........##.....", +".....##...####...........##.....", +".....##..####............##.....", +".....##.####.............##.....", +".....######..............##.....", +".....#####...............##.....", +".....####................##.....", +".....###.................##.....", +".....##..................##.....", +"................................", +"................................", +"................................", +"................................", +"................................" +}; \ No newline at end of file diff --git a/assets/s.xpm b/assets/s.xpm new file mode 100644 index 0000000..4db5c9a --- /dev/null +++ b/assets/s.xpm @@ -0,0 +1,37 @@ +static char *south[] = { +"32 32 2 1", +". c #FFFFFF", +"# c #FF0000", +"................................", +"................................", +"................................", +"................................", +"........################........", +"......####################......", +"....##..................##......", +"..##....................##......", +"..##....................##......", +"........................##......", +"........................##......", +"......................##........", +"..................####..........", +"..................####..........", +"................####............", +"............######..............", +"..........######................", +"........######..................", +"........####....................", +"........##......................", +"......##........................", +"......##........................", +"......##....................##..", +"......##....................##..", +"......##..................##....", +"......####################......", +"..........##############........", +"................................", +"................................", +"................................", +"................................", +"................................" +}; \ No newline at end of file diff --git a/assets/test/east.xpm b/assets/test/east.xpm new file mode 100644 index 0000000..2485cf0 --- /dev/null +++ b/assets/test/east.xpm @@ -0,0 +1,37 @@ +static char *east[] = { +"32 32 2 1", +". c #FFFFFF", +"# c #00FF00", +"................................", +"................................", +"................................", +"................................", +"....########################....", +"....########################....", +"..........................##....", +"..........................##....", +"..........................##....", +"..........................##....", +"..........................##....", +"..........................##....", +"..........................##....", +"..........................##....", +"..........##################....", +"..........##################....", +"..........................##....", +"..........................##....", +"..........................##....", +"..........................##....", +"..........................##....", +"..........................##....", +"..........................##....", +"..........................##....", +"....########################....", +"....########################....", +"................................", +"................................", +"................................", +"................................", +"................................", +"................................" +}; \ No newline at end of file diff --git a/assets/test/north.xpm b/assets/test/north.xpm new file mode 100644 index 0000000..9b21736 --- /dev/null +++ b/assets/test/north.xpm @@ -0,0 +1,37 @@ +static char *north[] = { +"32 32 2 1", +". c #FFFFFF", +"# c #00ff95ff", +"................................", +"................................", +"................................", +"................................", +".....##..................##.....", +".....##.................###.....", +".....##................####.....", +".....##...............#####.....", +".....##..............######.....", +".....##.............####.##.....", +".....##............####..##.....", +".....##...........####...##.....", +".....##..........####....##.....", +".....##.........####.....##.....", +".....##........####......##.....", +".....##.......####.......##.....", +".....##......####........##.....", +".....##.....####.........##.....", +".....##....####..........##.....", +".....##...####...........##.....", +".....##..####............##.....", +".....##.####.............##.....", +".....######..............##.....", +".....#####...............##.....", +".....####................##.....", +".....###.................##.....", +".....##..................##.....", +"................................", +"................................", +"................................", +"................................", +"................................" +}; \ No newline at end of file diff --git a/assets/test/south.xpm b/assets/test/south.xpm new file mode 100644 index 0000000..4db5c9a --- /dev/null +++ b/assets/test/south.xpm @@ -0,0 +1,37 @@ +static char *south[] = { +"32 32 2 1", +". c #FFFFFF", +"# c #FF0000", +"................................", +"................................", +"................................", +"................................", +"........################........", +"......####################......", +"....##..................##......", +"..##....................##......", +"..##....................##......", +"........................##......", +"........................##......", +"......................##........", +"..................####..........", +"..................####..........", +"................####............", +"............######..............", +"..........######................", +"........######..................", +"........####....................", +"........##......................", +"......##........................", +"......##........................", +"......##....................##..", +"......##....................##..", +"......##..................##....", +"......####################......", +"..........##############........", +"................................", +"................................", +"................................", +"................................", +"................................" +}; \ No newline at end of file diff --git a/assets/test/west.xpm b/assets/test/west.xpm new file mode 100644 index 0000000..51c5a48 --- /dev/null +++ b/assets/test/west.xpm @@ -0,0 +1,37 @@ +static char *north[] = { +"32 32 2 1", +". c #FFFFFF", +"# c #0000FF", +"................................", +"................................", +"................................", +"................................", +"................................", +"................................", +"................................", +"................................", +"................................", +"................................", +"....##...................##.....", +"....##...................##.....", +"....##...................##.....", +"....##...................##.....", +"....##.........#.........##.....", +"....##........###........##.....", +"....##.......#####.......##.....", +"....##......#######......##.....", +"....##.....####.####.....##.....", +"....##....####...####....##.....", +"....##...####.....####...##.....", +"....##..####.......####..##.....", +"....##.####.........####.##.....", +"....######...........######.....", +"....#####.............#####.....", +"....####...............####.....", +"....###.................###.....", +"....##...................##.....", +"................................", +"................................", +"................................", +"................................" +}; diff --git a/assets/w.xpm b/assets/w.xpm new file mode 100644 index 0000000..51c5a48 --- /dev/null +++ b/assets/w.xpm @@ -0,0 +1,37 @@ +static char *north[] = { +"32 32 2 1", +". c #FFFFFF", +"# c #0000FF", +"................................", +"................................", +"................................", +"................................", +"................................", +"................................", +"................................", +"................................", +"................................", +"................................", +"....##...................##.....", +"....##...................##.....", +"....##...................##.....", +"....##...................##.....", +"....##.........#.........##.....", +"....##........###........##.....", +"....##.......#####.......##.....", +"....##......#######......##.....", +"....##.....####.####.....##.....", +"....##....####...####....##.....", +"....##...####.....####...##.....", +"....##..####.......####..##.....", +"....##.####.........####.##.....", +"....######...........######.....", +"....#####.............#####.....", +"....####...............####.....", +"....###.................###.....", +"....##...................##.....", +"................................", +"................................", +"................................", +"................................" +}; diff --git a/cub3d.h b/cub3d.h deleted file mode 100644 index b94baf8..0000000 --- a/cub3d.h +++ /dev/null @@ -1,68 +0,0 @@ -// cub3d.h -#ifndef CUB3D_H -# define CUB3D_H -# include -# include -# include -# include "mlx.h" - -# define WIN_W 1280 -# define WIN_H 720 - -typedef struct s_img { - void *ptr; - char *addr; - int bpp; - int line_len; - int endian; -} t_img; - -typedef struct s_tex { - t_img img; - int w, h; -} t_tex; - -typedef struct s_keys { - bool w, a, s, d, left, right; -} t_keys; - -typedef struct s_app { - void *mlx; - void *win; - t_img frame; - // map - char **map; // rectangle, accès map[y][x] - int map_w, map_h; - - // player - double px, py; // position - double dirx, diry; // direction - double planex, planey; // caméra (FOV ~66° => plane longueur ~0.66) - - // movement - double move_speed; - double rot_speed; - - // textures (N,E,S,W) supposées chargées via parsing - t_tex tex[4]; - - // zbuffer pour sprites/doors bonus - double *zbuf; - - t_keys keys; -} t_app; - -// utils -void put_pixel(t_img *img, int x, int y, int color); -int get_tex_color(t_tex *t, int tx, int ty); - -// hooks -int key_press(int keycode, t_app *a); -int key_release(int keycode, t_app *a); -int close_win(t_app *a); - -// loop -int update(t_app *a); -void render_frame(t_app *a); - -#endif diff --git a/gnl/Makefile b/gnl/Makefile new file mode 100644 index 0000000..c166fae --- /dev/null +++ b/gnl/Makefile @@ -0,0 +1,60 @@ +# **************************************************************************** # +# # +# ::: :::::::: # +# Makefile :+: :+: :+: # +# +:+ +:+ +:+ # +# By: lfirmin lfirmim@student.42.fr> +#+ +:+ +#+ # +# +#+#+#+#+#+ +#+ # +# Created: 2024/08/12 07:07:31 by lfirmin #+# #+# # +# Updated: 2024/08/12 09:15:05 by lfirmin ### ########.fr # +# # +# **************************************************************************** # + +NAME = gnl.a +SRCS_DIR = srcs/ +INCS_DIR = includes/ +OBJ_DIR = obj/ + +SRC = get_next_line.c get_next_line_utils.c +CC = cc +CFLAGS = -Wall -Wextra -Werror -fPIE +INCLUDE = -I $(INCS_DIR) +SRCS = $(addprefix $(SRCS_DIR), $(SRC)) +OBJ = $(addprefix $(OBJ_DIR), $(SRC:.c=.o)) + +# Colors +GREEN = \033[0;32m +YELLOW = \033[0;33m +RESET = \033[0m +WHITE = \033[0;97m + +# Loading animation +LOADING_CHARS = ⠋ ⠙ ⠹ ⠸ ⠼ ⠴ ⠦ ⠧ ⠇ ⠏ + +all: $(NAME) + +$(NAME): $(OBJ) + @printf "$(YELLOW)Compiling get_next_line, Please wait...$(RESET)" + @for char in $(LOADING_CHARS); do \ + printf "\r$(YELLOW)Compiling get_next_line, Please wait... $$char$(RESET)"; \ + sleep 0.1; \ + done + @ar rc $(NAME) $(OBJ) + @ranlib $(NAME) + @printf "\r$(GREEN)fine ! $(WHITE)get_next_line compiled successfully ! $(RESET)\n" + +$(OBJ_DIR)%.o: $(SRCS_DIR)%.c + @mkdir -p $(OBJ_DIR) + @$(CC) $(CFLAGS) $(INCLUDE) -c $< -o $@ + +clean: + @rm -rf $(OBJ_DIR) + @printf "$(WHITE)Clean process completed for $(GREEN)get_next_line.$(RESET)\n" + +fclean: clean + @rm -f $(NAME) + @printf "$(WHITE)Full clean process completed for $(GREEN)get_next_line.$(RESET)\n" + +re: fclean all + +.PHONY: all clean fclean re diff --git a/gnl/include/get_next_line.h b/gnl/include/get_next_line.h new file mode 100644 index 0000000..9ffb3e2 --- /dev/null +++ b/gnl/include/get_next_line.h @@ -0,0 +1,32 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* get_next_line.h :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: abelghou +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2024/07/21 19:32:47 by abelghou #+# #+# */ +/* Updated: 2024/07/23 20:47:15 by abelghou ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#ifndef GET_NEXT_LINE_H +# define GET_NEXT_LINE_H + +# ifndef BUFFER_SIZE +# define BUFFER_SIZE 1000 +# endif + +# include +# include +# include +# include + +char *ft_substr(char const *s, unsigned int start, size_t len); +int ft_strlen_g(const char *str); +char *ft_strchr_gnl(const char *s, int i); +char *ft_strdup_g(const char *s); +char *ft_strjoin(char const *s1, char const *s2); +char *get_next_line(int fd); + +#endif \ No newline at end of file diff --git a/gnl/readme.md b/gnl/readme.md new file mode 100644 index 0000000..8e0d256 --- /dev/null +++ b/gnl/readme.md @@ -0,0 +1,41 @@ +# get_next_line + +A function that reads a line from a file descriptor. + +## 💡 About +The get_next_line project is a programming function that reads a line ending with a newline character from a file descriptor. When calling the function in a loop, it will then allow you to read the text file pointed to by the file descriptor, one line at a time until the end of the file. + +## 🛠️ Function Prototype +```c +char *get_next_line(int fd); +``` +## 📋 Usage +```c +#include "get_next_line.h" +#include + +int main(void) +{ + int fd; + char *line; + + fd = open("test.txt", O_RDONLY); + while ((line = get_next_line(fd)) != NULL) + { + printf("%s", line); + free(line); + } + close(fd); + return (0); +} +``` + +## ⚠️ Return Value +* The line that was read when successful +* NULL if there is nothing else to read or if an error occurred + +## 📊 Expected Behavior +* Repeated calls to get_next_line() should let you read the text file pointed to by the file descriptor, one line at a time +* The function should return the line that was read +* If there is nothing else to read or if an error occurred, it should return NULL +* The returned line should include the terminating \n character, except if the end of file was reached and does not end with a \n character \ No newline at end of file diff --git a/gnl/srcs/get_next_line.c b/gnl/srcs/get_next_line.c new file mode 100644 index 0000000..936a614 --- /dev/null +++ b/gnl/srcs/get_next_line.c @@ -0,0 +1,109 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* get_next_line.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: abelghou +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2024/07/17 21:31:24 by abelghou #+# #+# */ +/* Updated: 2024/07/24 18:17:55 by abelghou ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "../include/get_next_line.h" + +static char *sort_and_store(int fd, char *buf, char *backup) +{ + int read_line; + char *char_temp; + + read_line = 1; + while (read_line != 0) + { + read_line = read(fd, buf, BUFFER_SIZE); + if (read_line == -1) + return (0); + else if (read_line == 0) + break ; + buf[read_line] = '\0'; + if (!backup) + backup = ft_strdup_g(""); + if (!backup) + return (NULL); + char_temp = backup; + backup = ft_strjoin(char_temp, buf); + free(char_temp); + char_temp = NULL; + if (ft_strchr_gnl (buf, '\n')) + break ; + } + return (backup); +} + +static char *extract(char *line) +{ + size_t count; + char *backup; + + count = 0; + while (line[count] != '\n' && line[count] != '\0') + count++; + if (line[count] == '\0' || line[1] == '\0') + return (0); + backup = ft_substr(line, count + 1, ft_strlen_g(line) - count); + if (!backup) + return (NULL); + if (*backup == '\0') + { + free (backup); + backup = NULL; + } + line[count + 1] = '\0'; + return (backup); +} + +char *get_next_line(int fd) +{ + char *line; + char *buf; + char *temp; + static char *backup; + + if (fd == -2) + { + if (backup) + free(backup); + backup = NULL; + return (NULL); + } + if (fd < 0 || BUFFER_SIZE <= 0) + return (free(backup), backup = NULL, NULL); + buf = (char *)malloc(sizeof(char) * (BUFFER_SIZE + 1)); + if (!buf) + return (free(backup), backup = NULL, NULL); + line = sort_and_store(fd, buf, backup); + free(buf); + buf = NULL; + if (!line) + return (free(backup), backup = NULL, NULL); + backup = extract(line); + temp = ft_strdup_g(line); + free(line); + if (!temp) + return (free(backup), backup = NULL, NULL); + return (temp); +} + +// int main() +// { +// int fd; +// char *line; +// fd = open("fd.txt", O_RDONLY); +// while((line = get_next_line(fd)) != NULL) +// { +// printf("%s", line); +// free(line); +// } +// line = get_next_line(fd); +// close(fd); +// } \ No newline at end of file diff --git a/gnl/srcs/get_next_line_utils.c b/gnl/srcs/get_next_line_utils.c new file mode 100644 index 0000000..5ba6d2d --- /dev/null +++ b/gnl/srcs/get_next_line_utils.c @@ -0,0 +1,106 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* get_next_line_utils.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: abelghou +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2024/07/21 19:34:18 by abelghou #+# #+# */ +/* Updated: 2024/07/23 20:06:41 by abelghou ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "../include/get_next_line.h" + +char *ft_substr(char const *s, unsigned int start, size_t len) +{ + size_t i; + size_t j; + char *str; + + str = (char *)malloc(sizeof(*s) * (len + 1)); + if (str == 0) + return (NULL); + i = 0; + j = 0; + while (s[i]) + { + if (i >= start && j < len) + { + str[j] = s[i]; + j++; + } + i++; + } + str[j] = '\0'; + return (str); +} + +int ft_strlen_g(const char *str) +{ + int i; + + i = 0; + while (str[i]) + i++; + return (i); +} + +char *ft_strchr_gnl(const char *s, int i) +{ + while (*s) + { + if (*s == i) + return ((char *)s); + s++; + } + if (i == '\0') + return ((char *)s); + return (0); +} + +char *ft_strdup_g(const char *s) +{ + int i; + int j; + char *str; + + i = 0; + j = ft_strlen_g(s); + str = (char *)malloc(sizeof(*str) * (j + 1)); + if (!str) + return (NULL); + while (i < j) + { + str[i] = s[i]; + i++; + } + str[i] = '\0'; + return (str); +} + +char *ft_strjoin(char const *s1, char const *s2) +{ + int i; + int j; + char *str; + + i = 0; + j = 0; + str = (char *)malloc(sizeof(char) * (ft_strlen_g(s1) \ + + ft_strlen_g(s2) + 1)); + if (str == NULL) + return (NULL); + while (s1[i] != '\0') + { + str[i] = s1[i]; + i++; + } + while (s2[j] != '\0') + { + str[i + j] = s2[j]; + j++; + } + str[i + j] = '\0'; + return (str); +} diff --git a/includes/cub.h b/includes/cub.h new file mode 100644 index 0000000..7b0dc00 --- /dev/null +++ b/includes/cub.h @@ -0,0 +1,64 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* cub.h :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: lfirmin +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2025/08/22 14:56:25 by lfirmin #+# #+# */ +/* Updated: 2025/10/07 12:14:42 by lfirmin ### ########.fr */ +/* */ +/* ************************************************************************** */ +#ifndef CUB_H + +# define CUB_H + +# include "parsing.h" +# include "../libft/include/libft.h" +# include "../gnl/include/get_next_line.h" +# include "exec.h" +# include "keys.h" + +# define ERROR_PREFIX "Error\n" +# define ERROR_EXT "Invalid file extension. Only .cub files are accepted." +# define ERROR_EMPT_PATH "Invalid map file path." +# define ERROR_INIT_DATA "Initialization of the data structure failed." +# define ERROR_INIT_TEX "Initialization of the textures structure failed." +# define ERROR_INIT_PARS "Initialization of the parsing structure failed." +# define ERROR_EMPTY "You have provided an empty file." +# define ERROR_COL "The RGB values provided are not valid or absent." +# define ERROR_NULL_P "Player not found or multiple players." +# define ERROR_BAD_CHAR "Invalid character in map." +# define ERROR_POS "Player position not found." +# define ERROR_ALLOC "Allocation failed." +# define ERROR_PLAYER "Player not found or multiple players." +# define ERROR_CHAR "Invalid character in map." +# define ERROR_DOUBLE "Multiple images/colors have been provided \ +for the same texture." +# define ERROR_NOT_CLOSE "Map is not closed by walls." +# define ERROR_NOT_XMP "The texture file is not an xpm image." +# define ERR_I_N "Texture file provided for north is absent or inaccessible" +# define ERR_I_S "Texture file provided for south is absent or inaccessible" +# define ERR_I_E "Texture file provided for east is absent or inaccessible" +# define ERR_I_W "Texture file provided for west is absent or inaccessible" + +typedef struct s_data +{ + char **map; + char *map_path; + t_textures *texture; + t_data_parsing parsing; +} t_data; + +//utils +void ft_error(char *message); +void free_char_array(char **array); +int ft_arrlen(char **arr); +void print_array(char **array); +int ft_strlen_2d(char **str); + +//init +int init_data(t_data *data, char *path); +void free_data(t_data *data); + +#endif diff --git a/includes/exec.h b/includes/exec.h new file mode 100644 index 0000000..f160cd2 --- /dev/null +++ b/includes/exec.h @@ -0,0 +1,157 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* cub3d.h :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: jle-neze +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2025/09/12 18:17:48 by jle-neze #+# #+# */ +/* Updated: 2025/09/12 18:17:51 by jle-neze ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#ifndef EXEC_H +# define EXEC_H + +# include +# include +# include +# include <../minilibx-linux/mlx.h> + +/* Image (framebuffer) */ +typedef struct s_img +{ + void *ptr; + char *addr; + int bpp; + int line_len; + int endian; + int w; + int h; +} t_img; + +/* Contexte MLX */ +typedef struct s_mlx +{ + void *mlx; + void *win; + int w; + int h; + t_img frame; +} t_mlx; + +/* Couleurs de base */ +typedef struct s_colors +{ + int floor; + int ceil; + int wall_nsew[4]; /* 0:N 1:S 2:E 3:W → couleurs simples pour l’instant */ +} t_colors; + +/* Entrées clavier (état des touches) */ +typedef struct s_input +{ + int w; + int a; + int s; + int d; + int left; + int right; +} t_input; + +/* Monde (map) */ +typedef struct s_world +{ + int w; + int h; + char **grid; /* '0' vide, '1' mur */ +} t_world; + +/* Caméra / joueur (Raycasting) */ +typedef struct s_cam +{ + double pos_x; + double pos_y; + double dir_x; + double dir_y; + double plane_x; + double plane_y; +} t_cam; + +typedef struct s_tex +{ + void *ptr; + char *addr; + int bpp; + int line_len; + int endian; + int w; + int h; +} t_tex; + +/* State principal */ +typedef struct s_data t_data; + +typedef struct s_game +{ + t_mlx gfx; + t_colors colors; + t_input in; + t_world world; + t_cam cam; + double move_speed; + double rot_speed; + + /* --- Textures --- */ + t_tex tex[4]; /* 0:N 1:S 2:E 3:W */ + int has_tex; /* 1 si chargées OK */ + + /* Pour le cleanup */ + t_data *data; /* pointeur vers data pour cleanup */ +} t_game; + +/* init.c */ +int init_window(t_game *g, int w, int h, char *title); +void cleanup_window(t_game *g); + +/* hooks.c */ +int on_destroy(t_game *g); +int on_keydown(int key, t_game *g); +int on_keyup(int key, t_game *g); +void setup_hooks(t_game *g); + +/* image.c */ +void img_put_pixel(t_img *img, int x, int y, int color); + +/* draw.c */ +void draw_background(t_game *g); +void draw_vline(t_game *g, int x, int y0, int y1, int color); + +/* world.c */ +int world_init_demo(t_world *w); +void world_free(t_world *w); + +/* player.c */ +void player_init(t_game *g, double px, double py, double dx, double dy); +void player_update(t_game *g); + +/* raycast.c */ +void raycast_frame(t_game *g); + +/* loop.c */ +int game_loop(t_game *g); + +/* textures.c */ +int textures_load(t_game *g, const char *no, const char *so, + const char *we, const char *ea); +void textures_free(t_game *g); +unsigned int tex_get_pixel(t_tex *t, int x, int y); + +/* draw.c */ +void draw_background(t_game *g); +void draw_vline(t_game *g, int x, int y0, int y1, int color); +void draw_tex_vline(t_game *g, int x, int y0, int y1, + t_tex *tex, int tex_x, double step, double tex_pos); + + +#endif diff --git a/includes/keys.h b/includes/keys.h new file mode 100644 index 0000000..b5d6e07 --- /dev/null +++ b/includes/keys.h @@ -0,0 +1,35 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* keys.h :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: jle-neze +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2025/09/12 18:18:03 by jle-neze #+# #+# */ +/* Updated: 2025/09/12 18:18:07 by jle-neze ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#ifndef KEYS_H +# define KEYS_H + +/* ESC */ +# ifdef __APPLE__ +# define KEY_ESC 53 +# define KEY_W 13 +# define KEY_A 0 +# define KEY_S 1 +# define KEY_D 2 +# define KEY_LEFT 123 +# define KEY_RIGHT 124 +# else +# define KEY_ESC 65307 +# define KEY_W 119 +# define KEY_A 100 // a inverse au d car cest la camera qui deplace +# define KEY_S 115 +# define KEY_D 97 // a inverse au d car cest la camera qui deplace +# define KEY_LEFT 65361 +# define KEY_RIGHT 65363 +# endif + +#endif diff --git a/includes/parsing.h b/includes/parsing.h new file mode 100644 index 0000000..8f96c8c --- /dev/null +++ b/includes/parsing.h @@ -0,0 +1,89 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* parsing.h :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: lfirmin +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2025/08/22 14:08:04 by lfirmin #+# #+# */ +/* Updated: 2025/10/07 12:16:07 by lfirmin ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#ifndef PARSING_H +# define PARSING_H + +# include +# include +# include +# include + +struct s_data; +typedef struct s_data t_data; + +typedef struct s_textures +{ + char *north; + char *south; + char *east; + char *west; + int floor[3]; + int ceiling[3]; +} t_textures; + +typedef struct s_data_parsing +{ + char **raw_map; + int fd_map; + int fd_map_dup; + int player[3]; +} t_data_parsing; +//player -> 0 = x, 1 = y, 2 = head + +//parsing +int parsing(t_data *data); + +//check_file +int check_extension(char *map_path); +int check_file(char *map_path, t_data_parsing *parsing); + +//get_map +int get_map(t_data *data); +int line_counter(int fd); +int put_map_on_array(t_data *data); +char *clean_line(char *raw_line); + +//init_parsing +int init_parsing(t_data_parsing *parsing); +int init_textures(t_textures *textures); +int free_textures(t_textures *textures); + +//line_detect +int is_config_line(char *line); +int is_empty_line(char *line); +int is_texture_line(char *line); +int is_color_line(char *line); +int check_extension_2(char *str); + +//get_textures +int get_texture_path(char *line, t_textures *texture, int *j); +int validate_and_convert_rgb(char **parts, int rgb[3]); +int get_rgb_values(char *line, int rgb[3]); +int is_valid_number(char *str); + +//check_colors +int check_colors(t_textures *texture); +int is_rgb(int color[3]); + +// check_map +int check_map_char(char **map); +void find_player_pos(char **map, int *player); +int flood_fill(char **map_cp, int x, int y); +int rep_ex_wall(char **map_cp, int x, int y); +int check_char_and_count(char c, int *p); + +//check_map_2 +int hasivalidchar(char **map); +int validate_map(char **map, int *player); + +#endif diff --git a/input.c b/input.c deleted file mode 100644 index e5d3adb..0000000 --- a/input.c +++ /dev/null @@ -1,46 +0,0 @@ -// input.c -#include "cub3d.h" -#ifdef __APPLE__ -# define KEY_ESC 53 -# define KEY_W 13 -# define KEY_A 0 -# define KEY_S 1 -# define KEY_D 2 -# define KEY_LEFT 123 -# define KEY_RIGHT 124 -#else -# define KEY_ESC 65307 -# define KEY_W 119 -# define KEY_A 97 -# define KEY_S 115 -# define KEY_D 100 -# define KEY_LEFT 65361 -# define KEY_RIGHT 65363 -#endif - -int key_press(int key, t_app *a){ - if (key == KEY_ESC) close_win(a); - if (key == KEY_W) a->keys.w = true; - if (key == KEY_S) a->keys.s = true; - if (key == KEY_A) a->keys.a = true; - if (key == KEY_D) a->keys.d = true; - if (key == KEY_LEFT) a->keys.left = true; - if (key == KEY_RIGHT) a->keys.right = true; - return 0; -} -int key_release(int key, t_app *a){ - if (key == KEY_W) a->keys.w = false; - if (key == KEY_S) a->keys.s = false; - if (key == KEY_A) a->keys.a = false; - if (key == KEY_D) a->keys.d = false; - if (key == KEY_LEFT) a->keys.left = false; - if (key == KEY_RIGHT) a->keys.right = false; - return 0; -} -int close_win(t_app *a){ - if (a->zbuf) free(a->zbuf); - if (a->frame.ptr) mlx_destroy_image(a->mlx, a->frame.ptr); - if (a->win) mlx_destroy_window(a->mlx, a->win); - exit(0); - return 0; -} diff --git a/libft/Makefile b/libft/Makefile new file mode 100644 index 0000000..87b9709 --- /dev/null +++ b/libft/Makefile @@ -0,0 +1,68 @@ +# **************************************************************************** # +# # +# ::: :::::::: # +# Makefile :+: :+: :+: # +# +:+ +:+ +:+ # +# By: lfirmin +#+ +:+ +#+ # +# +#+#+#+#+#+ +#+ # +# Created: 2024/05/19 12:59:31 by lfirmin #+# #+# # +# Updated: 2025/04/19 11:53:48 by lfirmin ### ########.fr # +# # +# **************************************************************************** # + +NAME = libft.a +HEADER = ./include +SRCS_DIR = ./srcs/ +SRC = ft_isalnum.c ft_isprint.c ft_memcmp.c ft_putchar_fd.c ft_split.c \ + ft_strlcat.c ft_strncmp.c ft_substr.c ft_atoi.c ft_isalpha.c \ + ft_itoa.c ft_memcpy.c ft_putendl_fd.c ft_strchr.c ft_strlcpy.c \ + ft_strnstr.c ft_tolower.c ft_bzero.c ft_isascii.c ft_strtrim.c \ + ft_memmove.c ft_putnbr_fd.c ft_strdup.c ft_strlen.c ft_strrchr.c \ + ft_toupper.c ft_calloc.c ft_isdigit.c ft_memchr.c ft_memset.c \ + ft_putstr_fd.c ft_strjoin.c ft_strmapi.c ft_striteri.c \ + ft_lstnew_bonus.c ft_lstadd_front_bonus.c ft_lstsize_bonus.c \ + ft_lstlast_bonus.c ft_lstadd_back_bonus.c ft_lstdelone_bonus.c \ + ft_lstclear_bonus.c ft_lstiter_bonus.c ft_lstmap_bonus.c ft_strcmp.c \ + ft_atoll.c ft_straddchar.c ft_strcpy.c ft_arrcpy.c + +SRCS = $(addprefix $(SRCS_DIR), $(SRC)) +CC = cc +CFLAGS = -Wall -Wextra -Werror -g3 +INCLUDE = -I $(HEADER) +OBJ_DIR = obj/ +OBJ = $(addprefix $(OBJ_DIR), $(SRC:.c=.o)) + +GREEN = \033[0;32m +YELLOW = \033[0;33m +RESET = \033[0m +WHITE = \033[0;97m + +LOADING_CHARS = ⠋ ⠙ ⠹ ⠸ ⠼ ⠴ ⠦ ⠧ ⠇ ⠏ + +all: $(NAME) + +$(NAME): $(OBJ) + @printf "$(YELLOW)Compiling libft, Please wait...$(RESET)" + @for char in $(LOADING_CHARS); do \ + printf "\r$(YELLOW)Compiling libft, Please wait... $$char$(RESET)"; \ + sleep 0.1; \ + done + @ar rc $(NAME) $(OBJ) + @ranlib $(NAME) + @printf "\r$(GREEN)Great news ! $(WHITE)Libft compiled successfully ! $(RESET)\n" + +$(OBJ_DIR)%.o: $(SRCS_DIR)%.c + @mkdir -p $(OBJ_DIR) + @$(CC) $(CFLAGS) $(INCLUDE) -c $< -o $@ + +clean: + @rm -rf $(OBJ_DIR) + @printf "$(WHITE)Clean process completed for $(GREEN)Libft.$(RESET)\n" + +fclean: clean + @rm -f $(NAME) + @printf "$(WHITE)Full clean process completed for $(GREEN)Libft.$(RESET)\n" + +re: fclean all + +.PHONY: all clean fclean re \ No newline at end of file diff --git a/libft/Readme.md b/libft/Readme.md new file mode 100644 index 0000000..ef5f375 --- /dev/null +++ b/libft/Readme.md @@ -0,0 +1,55 @@ +# Libft - 42 Project + +## Description +Libft is the first project at 42 school. The aim is to recreate various standard C library functions, as well as additional functions that will be useful throughout the cursus. This library will be used in most of the future 42 projects. + +## Functions + +### Libc Functions +`ft_isalpha` • `ft_isdigit` • `ft_isalnum` • `ft_isascii` • `ft_isprint` • `ft_strlen` • `ft_memset` • `ft_bzero` • `ft_memcpy` • `ft_memmove` • `ft_strlcpy` • `ft_strlcat` • `ft_toupper` • `ft_tolower` • `ft_strchr` • `ft_strrchr` • `ft_strncmp` • `ft_memchr` • `ft_memcmp` • `ft_strnstr` • `ft_atoi` • `ft_calloc` • `ft_strdup` + +### Additional Functions +`ft_substr` • `ft_strjoin` • `ft_strtrim` • `ft_split` • `ft_itoa` • `ft_strmapi` • `ft_striteri` • `ft_putchar_fd` • `ft_putstr_fd` • `ft_putendl_fd` • `ft_putnbr_fd` + +### Bonus Functions +`ft_lstnew` • `ft_lstadd_front` • `ft_lstsize` • `ft_lstlast` • `ft_lstadd_back` • `ft_lstdelone` • `ft_lstclear` • `ft_lstiter` • `ft_lstmap` + +## Getting Started + +### Prerequisites +- GCC compiler +- Make + +### Usage +1. Include the header in your source file: +```c +#include "libft.h" +``` + +### Compilation +1. Compilation: +```bash +make +``` + +## Cleaning +- Remove object files: +```bash +make clean +``` + +- Remove object files and library: +```bash +make fclean +``` + +- Recompile everything: +```bash +make re +``` + +## Testing +This project doesn't come with unit tests, but you can use external testers: +- [libft-unit-test](https://github.com/alelievr/libft-unit-test) +- [libft-war-machine](https://github.com/ska42/libft-war-machine) +- [Tripouille/libfTester](https://github.com/Tripouille/libftTester) diff --git a/libft/include/libft.h b/libft/include/libft.h new file mode 100644 index 0000000..b2d0d5a --- /dev/null +++ b/libft/include/libft.h @@ -0,0 +1,93 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* libft.h :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: lfirmin +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2024/05/21 11:19:08 by lfirmin #+# #+# */ +/* Updated: 2025/04/19 11:56:03 by lfirmin ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#ifndef LIBFT_H +# define LIBFT_H + +# include +# include +# include +# include +# include +# include + +typedef struct v +{ + char **array; + int i; + int j; + int start; + int end; +} t_split_struct; + +typedef struct s_list +{ + void *content; + struct s_list *next; +} t_list; + +int ft_isalnum(int c); +int ft_isalpha(int c); +int ft_isascii(int c); +int ft_isdigit(int c); +int ft_isprint(int c); +int ft_atoi(const char *str); +int ft_memcmp(const void *ptr1, const void *ptr2, size_t num); +int ft_strncmp(const char *s1, const char *s2, unsigned int n); +int ft_toupper(int c); +int ft_tolower(int c); +int ft_lstsize(t_list *lst); +int ft_strcmp(char *s1, char *s2); +long long ft_atoll(const char *str); + +size_t ft_strlen(const char *s); +size_t ft_strlcat(char *dst, const char *src, size_t size); +size_t ft_strlcpy(char *dst, const char *src, size_t dsts); + +void *ft_bzero(void *s, size_t n); +void *ft_calloc(size_t count, size_t n); +void *ft_memchr(const void *s, int c, size_t n); +void *ft_memcpy(void *dest, const void *src, size_t len); +void *ft_memset(void *b, int c, size_t len); +void *ft_memmove(void *s1, const void *s2, size_t len); +void *ft_memset(void *str, int c, size_t n); +void ft_putchar_fd(char c, int fd); +void ft_putstr_fd(char *s, int fd); +void ft_putendl_fd(char *s, int fd); +void ft_putnbr_fd(int n, int fd); +void ft_striteri(char *s, void (*f)(unsigned int, char*)); +void ft_lstadd_front(t_list **lst, t_list *new); +void ft_lstadd_back(t_list **lst, t_list *new); +void ft_lstdelone(t_list *lst, void (*del)(void*)); +void ft_lstclear(t_list **lst, void (*del)(void*)); +void ft_lstiter(t_list *lst, void (*f)(void *)); + +char *ft_strchr(char const *str, int c); +char *ft_strdup(const char *src); +char *ft_strjoin(const char *s1, const char *s2); +char *ft_strnstr(const char *hay, const char *need, size_t len); +char *ft_strrchr(const char *str, int c); +char *ft_strtrim(char const *s1, char const *set); +char *ft_substr(char const *s, unsigned int start, size_t len); +char **ft_split(char const *s, char c); +char *ft_strmapi(char const *s, char (*f)(unsigned int, char)); +char *ft_itoa(int n); +char *ft_straddchar(char *str, char c); +char *ft_strcpy(char *dest, char *src); +char **ft_arrcpy(char **array); + +t_list *ft_lstnew(void *content); +t_list *ft_lstlast(t_list *lst); +t_list *ft_lstmap(t_list *lst, void *(*f)(void *), \ + void (*del)(void *)); + +#endif \ No newline at end of file diff --git a/libft/srcs/ft_arrcpy.c b/libft/srcs/ft_arrcpy.c new file mode 100644 index 0000000..057b006 --- /dev/null +++ b/libft/srcs/ft_arrcpy.c @@ -0,0 +1,41 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* ft_arrcpy.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: lfirmin +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2024/05/21 02:18:17 by lfirmin #+# #+# */ +/* Updated: 2025/10/06 14:06:37 by lfirmin ### ########.fr */ +/* */ +/* ************************************************************************** */ +#include "libft.h" + +char **ft_arrcpy(char **array) +{ + char **copy; + int i; + int len; + + len = 0; + while (array[len]) + len++; + copy = malloc(sizeof(char *) * (len + 1)); + if (!copy) + return (NULL); + i = 0; + while (i < len) + { + copy[i] = ft_strdup(array[i]); + if (!copy[i]) + { + while (i > 0) + free(copy[--i]); + free(copy); + return (NULL); + } + i++; + } + copy[i] = NULL; + return (copy); +} diff --git a/libft/srcs/ft_atoi.c b/libft/srcs/ft_atoi.c new file mode 100644 index 0000000..a05a597 --- /dev/null +++ b/libft/srcs/ft_atoi.c @@ -0,0 +1,40 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* ft_atoi.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: lfirmin +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2024/05/21 10:09:46 by lfirmin #+# #+# */ +/* Updated: 2024/06/03 21:02:02 by lfirmin ### ########.fr */ +/* */ +/* ************************************************************************** */ +#include "libft.h" + +int ft_atoi(const char *str) +{ + int i; + int s; + int m; + + i = 0; + s = 0; + m = 0; + while ((str[i] <= 13 && str[i] >= 9) || str[i] == 32) + i++; + while (str[i] == '-' || str[i] == '+') + { + s++; + if (s >= 2) + return (0); + if (str[i] == '-') + m++; + i++; + } + s = 0; + while (str[i] >= 48 && str[i] <= 57) + s = s * 10 + (str[i++] - 48); + if (m % 2 == 1) + s = s * -1; + return (s); +} diff --git a/libft/srcs/ft_atoll.c b/libft/srcs/ft_atoll.c new file mode 100644 index 0000000..34fd5a5 --- /dev/null +++ b/libft/srcs/ft_atoll.c @@ -0,0 +1,38 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* ft_atoll.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: lfirmin +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2024/11/03 17:25:06 by lfirmin #+# #+# */ +/* Updated: 2024/11/03 17:25:33 by lfirmin ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "libft.h" + +long long ft_atoll(const char *str) +{ + long long result; + int sign; + + result = 0; + sign = 1; + while (*str == ' ' || (*str >= 9 && *str <= 13)) + str++; + if (*str == '-' || *str == '+') + { + if (*str == '-') + sign = -1; + str++; + } + while (*str >= '0' && *str <= '9') + { + if (result > INT_MAX || result < INT_MIN) + return (2147483648); + result = result * 10 + (*str - '0'); + str++; + } + return (result * sign); +} diff --git a/libft/srcs/ft_bzero.c b/libft/srcs/ft_bzero.c new file mode 100644 index 0000000..507f22d --- /dev/null +++ b/libft/srcs/ft_bzero.c @@ -0,0 +1,24 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* ft_bzero.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: lfirmin +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2024/05/21 00:20:00 by lfirmin #+# #+# */ +/* Updated: 2024/05/30 19:49:23 by lfirmin ### ########.fr */ +/* */ +/* ************************************************************************** */ +#include "libft.h" + +void *ft_bzero(void *b, size_t len) +{ + size_t i; + unsigned char *r; + + r = (unsigned char *)b; + i = 0; + while (i < len) + r[i++] = '\0'; + return (b); +} diff --git a/libft/srcs/ft_calloc.c b/libft/srcs/ft_calloc.c new file mode 100644 index 0000000..b42206a --- /dev/null +++ b/libft/srcs/ft_calloc.c @@ -0,0 +1,31 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* ft_calloc.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: lfirmin +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2024/05/21 11:14:02 by lfirmin #+# #+# */ +/* Updated: 2024/06/03 18:15:05 by lfirmin ### ########.fr */ +/* */ +/* ************************************************************************** */ +#include "libft.h" + +void *ft_calloc(size_t c, size_t s) +{ + void *ptr; + long long int tmp1; + long long int tmp2; + + tmp1 = (long long int)c; + tmp2 = (long long int)s; + if ((c > 4294967295 || s > 4294967295) && (tmp1 < 0 && tmp2 < 0)) + return (NULL); + if (tmp1 * tmp2 < 0) + return (NULL); + ptr = malloc(c * s); + if (!ptr) + return (NULL); + ft_bzero(ptr, c * s); + return (ptr); +} diff --git a/libft/srcs/ft_isalnum.c b/libft/srcs/ft_isalnum.c new file mode 100644 index 0000000..5ba1caa --- /dev/null +++ b/libft/srcs/ft_isalnum.c @@ -0,0 +1,19 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* ft_isalnum.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: lfirmin +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2024/05/20 02:29:49 by lfirmin #+# #+# */ +/* Updated: 2024/05/22 09:59:44 by lfirmin ### ########.fr */ +/* */ +/* ************************************************************************** */ +#include "libft.h" + +int ft_isalnum(int c) +{ + if ((c >= 97 && c <= 122) || (c >= 48 && c <= 57) || (c >= 65 && c <= 90)) + return (1); + return (0); +} diff --git a/libft/srcs/ft_isalpha.c b/libft/srcs/ft_isalpha.c new file mode 100644 index 0000000..968359a --- /dev/null +++ b/libft/srcs/ft_isalpha.c @@ -0,0 +1,19 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* ft_isalpha.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: lfirmin +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2024/05/20 01:55:52 by lfirmin #+# #+# */ +/* Updated: 2024/05/22 09:59:44 by lfirmin ### ########.fr */ +/* */ +/* ************************************************************************** */ +#include "libft.h" + +int ft_isalpha(int c) +{ + if ((c >= 97 && c <= 122) || (c >= 65 && c <= 90)) + return (1); + return (0); +} diff --git a/libft/srcs/ft_isascii.c b/libft/srcs/ft_isascii.c new file mode 100644 index 0000000..b45506c --- /dev/null +++ b/libft/srcs/ft_isascii.c @@ -0,0 +1,19 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* ft_isascii.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: lfirmin +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2024/05/20 02:36:17 by lfirmin #+# #+# */ +/* Updated: 2024/05/22 09:59:44 by lfirmin ### ########.fr */ +/* */ +/* ************************************************************************** */ +#include "libft.h" + +int ft_isascii(int c) +{ + if (c >= 0 && c <= 127) + return (1); + return (0); +} diff --git a/libft/srcs/ft_isdigit.c b/libft/srcs/ft_isdigit.c new file mode 100644 index 0000000..91b948d --- /dev/null +++ b/libft/srcs/ft_isdigit.c @@ -0,0 +1,19 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* ft_isdigit.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: lfirmin +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2024/05/20 02:31:51 by lfirmin #+# #+# */ +/* Updated: 2024/05/22 09:59:44 by lfirmin ### ########.fr */ +/* */ +/* ************************************************************************** */ +#include "libft.h" + +int ft_isdigit(int c) +{ + if (c >= 48 && c <= 57) + return (1); + return (0); +} diff --git a/libft/srcs/ft_isprint.c b/libft/srcs/ft_isprint.c new file mode 100644 index 0000000..ecdff95 --- /dev/null +++ b/libft/srcs/ft_isprint.c @@ -0,0 +1,19 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* ft_isprint.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: lfirmin +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2024/05/20 02:38:24 by lfirmin #+# #+# */ +/* Updated: 2024/05/23 06:21:54 by lfirmin ### ########.fr */ +/* */ +/* ************************************************************************** */ +#include "libft.h" + +int ft_isprint(int c) +{ + if (((c >= 0 && c <= 31) || c >= 127 || c == EOF)) + return (0); + return (1); +} diff --git a/libft/srcs/ft_itoa.c b/libft/srcs/ft_itoa.c new file mode 100644 index 0000000..eade559 --- /dev/null +++ b/libft/srcs/ft_itoa.c @@ -0,0 +1,51 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* ft_itoa.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: lfirmin +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2024/05/24 12:59:00 by lfirmin #+# #+# */ +/* Updated: 2024/05/29 10:31:36 by lfirmin ### ########.fr */ +/* */ +/* ************************************************************************** */ +#include "libft.h" + +static size_t ft_count(long int n) +{ + size_t c; + + c = 0; + if (n <= 0) + c = 1; + while (n != 0) + { + n = n / 10; + c++; + } + return (c); +} + +char *ft_itoa(int n) +{ + char *str; + size_t size; + long int num; + + num = n; + size = ft_count(num); + str = (char *)malloc(size + 1); + if (!str) + return (NULL); + str[size] = '\0'; + if (num < 0) + num = -num; + while (size--) + { + str[size] = num % 10 + '0'; + num = num / 10; + if (n < 0 && size == 0) + str[size] = '-'; + } + return (str); +} diff --git a/libft/srcs/ft_lstadd_back_bonus.c b/libft/srcs/ft_lstadd_back_bonus.c new file mode 100644 index 0000000..2bfdfc7 --- /dev/null +++ b/libft/srcs/ft_lstadd_back_bonus.c @@ -0,0 +1,27 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* ft_lstadd_back.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: lfirmin +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2024/06/01 02:01:18 by lfirmin #+# #+# */ +/* Updated: 2024/06/03 15:59:33 by lfirmin ### ########.fr */ +/* */ +/* ************************************************************************** */ +#include "libft.h" + +void ft_lstadd_back(t_list **lst, t_list *new) +{ + t_list *last; + + if (!new) + return ; + if (!lst || !*lst) + { + *lst = new; + return ; + } + last = ft_lstlast(*lst); + last->next = new; +} diff --git a/libft/srcs/ft_lstadd_front_bonus.c b/libft/srcs/ft_lstadd_front_bonus.c new file mode 100644 index 0000000..b784622 --- /dev/null +++ b/libft/srcs/ft_lstadd_front_bonus.c @@ -0,0 +1,21 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* ft_lstadd_front.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: lfirmin +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2024/05/31 20:34:57 by lfirmin #+# #+# */ +/* Updated: 2024/05/31 20:41:34 by lfirmin ### ########.fr */ +/* */ +/* ************************************************************************** */ +#include "libft.h" + +void ft_lstadd_front(t_list **lst, t_list *new) +{ + if (lst && new) + { + new->next = *lst; + *lst = new; + } +} diff --git a/libft/srcs/ft_lstclear_bonus.c b/libft/srcs/ft_lstclear_bonus.c new file mode 100644 index 0000000..54479d1 --- /dev/null +++ b/libft/srcs/ft_lstclear_bonus.c @@ -0,0 +1,28 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* ft_lstclear.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: lfirmin +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2024/06/01 20:46:07 by lfirmin #+# #+# */ +/* Updated: 2024/06/01 20:51:07 by lfirmin ### ########.fr */ +/* */ +/* ************************************************************************** */ +#include "libft.h" + +void ft_lstclear(t_list **lst, void (*del)(void*)) +{ + t_list *t; + + if (lst) + { + while (*lst) + { + t = (*lst)->next; + ft_lstdelone(*lst, del); + (*lst) = t; + } + (*lst) = NULL; + } +} diff --git a/libft/srcs/ft_lstdelone_bonus.c b/libft/srcs/ft_lstdelone_bonus.c new file mode 100644 index 0000000..94ae5ab --- /dev/null +++ b/libft/srcs/ft_lstdelone_bonus.c @@ -0,0 +1,20 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* ft_lstdelone.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: lfirmin +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2024/06/01 20:32:56 by lfirmin #+# #+# */ +/* Updated: 2024/06/01 20:32:56 by lfirmin ### ########.fr */ +/* */ +/* ************************************************************************** */ +#include "libft.h" + +void ft_lstdelone(t_list *lst, void (*del)(void*)) +{ + if (!lst || !del) + return ; + del(lst->content); + free(lst); +} diff --git a/libft/srcs/ft_lstiter_bonus.c b/libft/srcs/ft_lstiter_bonus.c new file mode 100644 index 0000000..8870692 --- /dev/null +++ b/libft/srcs/ft_lstiter_bonus.c @@ -0,0 +1,23 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* ft_lstiter.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: lfirmin +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2024/06/01 21:05:12 by lfirmin #+# #+# */ +/* Updated: 2024/06/01 21:05:12 by lfirmin ### ########.fr */ +/* */ +/* ************************************************************************** */ +#include "libft.h" + +void ft_lstiter(t_list *lst, void (*f)(void *)) +{ + if (!lst || !f) + return ; + while (lst) + { + f(lst->content); + lst = lst->next; + } +} diff --git a/libft/srcs/ft_lstlast_bonus.c b/libft/srcs/ft_lstlast_bonus.c new file mode 100644 index 0000000..c00582b --- /dev/null +++ b/libft/srcs/ft_lstlast_bonus.c @@ -0,0 +1,23 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* ft_lstlast.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: lfirmin +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2024/06/01 01:52:09 by lfirmin #+# #+# */ +/* Updated: 2024/06/01 01:57:22 by lfirmin ### ########.fr */ +/* */ +/* ************************************************************************** */ +#include "libft.h" + +t_list *ft_lstlast(t_list *lst) +{ + while (lst) + { + if (!lst->next) + return (lst); + lst = lst->next; + } + return (lst); +} diff --git a/libft/srcs/ft_lstmap_bonus.c b/libft/srcs/ft_lstmap_bonus.c new file mode 100644 index 0000000..7efc366 --- /dev/null +++ b/libft/srcs/ft_lstmap_bonus.c @@ -0,0 +1,41 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* ft_lstmap.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: lfirmin +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2024/06/02 18:21:09 by lfirmin #+# #+# */ +/* Updated: 2024/06/03 15:53:13 by lfirmin ### ########.fr */ +/* */ +/* ************************************************************************** */ +#include "libft.h" + +t_list *ft_lstmap(t_list *lst, void *(*f)(void *), void (*del)(void *)) +{ + t_list *new; + t_list *save; + + if (!lst || !del || !f) + return (NULL); + new = ft_lstnew(lst->content); + if (!new) + return (NULL); + new->content = f(new->content); + save = new; + lst = lst->next; + while (lst) + { + new->next = ft_lstnew(lst->content); + if (!new->next) + { + ft_lstclear(&save, del); + return (NULL); + } + new->next->content = f(new->next->content); + new = new->next; + lst = lst->next; + } + new->next = NULL; + return (save); +} diff --git a/libft/srcs/ft_lstnew_bonus.c b/libft/srcs/ft_lstnew_bonus.c new file mode 100644 index 0000000..d9a9ba7 --- /dev/null +++ b/libft/srcs/ft_lstnew_bonus.c @@ -0,0 +1,24 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* ft_lstnew.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: lfirmin +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2024/05/31 18:41:23 by lfirmin #+# #+# */ +/* Updated: 2024/05/31 20:33:26 by lfirmin ### ########.fr */ +/* */ +/* ************************************************************************** */ +#include "libft.h" + +t_list *ft_lstnew(void *content) +{ + t_list *new; + + new = (t_list *)malloc(sizeof(*new)); + if (!new) + return (NULL); + new->content = content; + new->next = NULL; + return (new); +} diff --git a/libft/srcs/ft_lstsize_bonus.c b/libft/srcs/ft_lstsize_bonus.c new file mode 100644 index 0000000..d68e15d --- /dev/null +++ b/libft/srcs/ft_lstsize_bonus.c @@ -0,0 +1,27 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* ft_lstsize.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: lfirmin +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2024/05/31 22:00:49 by lfirmin #+# #+# */ +/* Updated: 2024/05/31 22:12:17 by lfirmin ### ########.fr */ +/* */ +/* ************************************************************************** */ +#include "libft.h" + +int ft_lstsize(t_list *lst) +{ + int i; + t_list *count; + + count = lst; + i = 0; + while (count) + { + count = count->next; + i++; + } + return (i); +} diff --git a/libft/srcs/ft_memchr.c b/libft/srcs/ft_memchr.c new file mode 100644 index 0000000..4272249 --- /dev/null +++ b/libft/srcs/ft_memchr.c @@ -0,0 +1,26 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* ft_memchr.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: lfirmin +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2024/05/21 07:40:39 by lfirmin #+# #+# */ +/* Updated: 2024/05/22 09:59:44 by lfirmin ### ########.fr */ +/* */ +/* ************************************************************************** */ +#include "libft.h" + +void *ft_memchr(const void *s, int c, size_t n) +{ + unsigned char *str; + + str = (unsigned char *)s; + while (n--) + { + if (*str == (unsigned char)c) + return (str); + str++; + } + return (NULL); +} diff --git a/libft/srcs/ft_memcmp.c b/libft/srcs/ft_memcmp.c new file mode 100644 index 0000000..fc9d739 --- /dev/null +++ b/libft/srcs/ft_memcmp.c @@ -0,0 +1,30 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* ft_memcmp.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: lfirmin +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2024/05/21 07:57:58 by lfirmin #+# #+# */ +/* Updated: 2024/05/22 11:34:35 by lfirmin ### ########.fr */ +/* */ +/* ************************************************************************** */ +#include "libft.h" + +int ft_memcmp(const void *ptr1, const void *ptr2, size_t num) +{ + unsigned char *pt1; + unsigned char *pt2; + size_t i; + + pt1 = (unsigned char *)ptr1; + pt2 = (unsigned char *)ptr2; + i = 0; + while (i < num) + { + if (pt1[i] != pt2[i]) + return (pt1[i] - pt2[i]); + i++; + } + return (0); +} diff --git a/libft/srcs/ft_memcpy.c b/libft/srcs/ft_memcpy.c new file mode 100644 index 0000000..7f3d5a2 --- /dev/null +++ b/libft/srcs/ft_memcpy.c @@ -0,0 +1,32 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* ft_memcpy.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: tordner +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2024/05/21 01:08:31 by lfirmin #+# #+# */ +/* Updated: 2025/06/02 00:40:39 by tordner ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "libft.h" + +void *ft_memcpy(void *dest, const void *src, size_t len) +{ + size_t i; + unsigned char *r; + unsigned char *s; + + i = 0; + r = (unsigned char *)dest; + s = (unsigned char *)src; + if (dest == (void *)0 && src == (void *)0) + return (dest); + while (i < len) + { + r[i] = s[i]; + i++; + } + return (dest); +} diff --git a/libft/srcs/ft_memmove.c b/libft/srcs/ft_memmove.c new file mode 100644 index 0000000..8920c37 --- /dev/null +++ b/libft/srcs/ft_memmove.c @@ -0,0 +1,39 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* ft_memmov.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: lfirmin +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2024/05/21 01:26:13 by lfirmin #+# #+# */ +/* Updated: 2024/05/22 09:59:44 by lfirmin ### ########.fr */ +/* */ +/* ************************************************************************** */ +#include "libft.h" + +void *ft_memmove(void *s1, const void *s2, size_t len) +{ + unsigned char *dest; + unsigned char *src; + unsigned int i; + + dest = (unsigned char *)s1; + src = (unsigned char *)s2; + i = 0; + if (dest == NULL && src == NULL) + return (NULL); + if (dest < src) + { + while (i < len) + { + dest[i] = src[i]; + i++; + } + } + else + { + while (0 < len--) + dest[len] = src[len]; + } + return (dest); +} diff --git a/libft/srcs/ft_memset.c b/libft/srcs/ft_memset.c new file mode 100644 index 0000000..14d59a2 --- /dev/null +++ b/libft/srcs/ft_memset.c @@ -0,0 +1,24 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* ft_memset.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: lfirmin +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2024/05/20 02:42:40 by lfirmin #+# #+# */ +/* Updated: 2024/05/22 09:59:44 by lfirmin ### ########.fr */ +/* */ +/* ************************************************************************** */ +#include "libft.h" + +void *ft_memset(void *b, int c, size_t len) +{ + size_t i; + unsigned char *r; + + i = 0; + r = (unsigned char *)b; + while (i < len) + r[i++] = (unsigned char)c; + return (b); +} diff --git a/libft/srcs/ft_putchar_fd.c b/libft/srcs/ft_putchar_fd.c new file mode 100644 index 0000000..8a930f9 --- /dev/null +++ b/libft/srcs/ft_putchar_fd.c @@ -0,0 +1,17 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* ft_putchar_fd.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: lfirmin +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2024/05/29 11:17:45 by lfirmin #+# #+# */ +/* Updated: 2024/05/29 11:20:42 by lfirmin ### ########.fr */ +/* */ +/* ************************************************************************** */ +#include "libft.h" + +void ft_putchar_fd(char c, int fd) +{ + write(fd, &c, 1); +} diff --git a/libft/srcs/ft_putendl_fd.c b/libft/srcs/ft_putendl_fd.c new file mode 100644 index 0000000..c2e3e97 --- /dev/null +++ b/libft/srcs/ft_putendl_fd.c @@ -0,0 +1,18 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* ft_putendl_fd.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: lfirmin +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2024/05/29 11:35:44 by lfirmin #+# #+# */ +/* Updated: 2024/05/29 11:38:36 by lfirmin ### ########.fr */ +/* */ +/* ************************************************************************** */ +#include "libft.h" + +void ft_putendl_fd(char *s, int fd) +{ + ft_putstr_fd(s, fd); + ft_putchar_fd('\n', fd); +} diff --git a/libft/srcs/ft_putnbr_fd.c b/libft/srcs/ft_putnbr_fd.c new file mode 100644 index 0000000..0b02ab1 --- /dev/null +++ b/libft/srcs/ft_putnbr_fd.c @@ -0,0 +1,31 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* ft_putnbr_fd.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: lfirmin +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2024/05/29 11:42:38 by lfirmin #+# #+# */ +/* Updated: 2024/05/29 11:56:04 by lfirmin ### ########.fr */ +/* */ +/* ************************************************************************** */ +#include "libft.h" + +void ft_putnbr_fd(int n, int fd) +{ + long int nb; + + nb = n; + if (nb < 0) + { + nb = -nb; + ft_putchar_fd('-', fd); + } + if (nb >= 10) + { + ft_putnbr_fd(nb / 10, fd); + ft_putnbr_fd(nb % 10, fd); + } + else + ft_putchar_fd(nb + '0', fd); +} diff --git a/libft/srcs/ft_putstr_fd.c b/libft/srcs/ft_putstr_fd.c new file mode 100644 index 0000000..ecdc0ef --- /dev/null +++ b/libft/srcs/ft_putstr_fd.c @@ -0,0 +1,24 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* ft_putstr_fd.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: lfirmin +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2024/05/29 11:27:05 by lfirmin #+# #+# */ +/* Updated: 2024/05/29 11:33:18 by lfirmin ### ########.fr */ +/* */ +/* ************************************************************************** */ +#include "libft.h" + +void ft_putstr_fd(char *s, int fd) +{ + int i; + + i = 0; + while (s[i]) + { + ft_putchar_fd(s[i], fd); + i++; + } +} diff --git a/libft/srcs/ft_split.c b/libft/srcs/ft_split.c new file mode 100644 index 0000000..9650577 --- /dev/null +++ b/libft/srcs/ft_split.c @@ -0,0 +1,95 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* ft_split.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: lfirmin +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2024/05/22 05:56:37 by lfirmin #+# #+# */ +/* Updated: 2024/06/04 12:08:51 by lfirmin ### ########.fr */ +/* */ +/* ************************************************************************** */ +#include "libft.h" + +static int ft_c(char const *s, char c) +{ + int i; + int count; + + count = 0; + i = 0; + while (s[i]) + { + if (s[i] != c && (i == 0 || s[i - 1] == c)) + count++; + i++; + } + return (count); +} + +void init_split_struct(t_split_struct *v, char const *s, char c) +{ + if (!s) + return ; + v->array = (char **)malloc((ft_c(s, c) + 1) * sizeof(char *)); + if (!s || !v->array) + return ; + v->i = 0; + v->j = 0; +} + +static char *ft_strncpy(char *dest, const char *src, unsigned int n) +{ + unsigned int i; + + i = 0; + while (src[i] != '\0' && i < n) + { + dest[i] = src[i]; + ++i; + } + while (i < n) + { + dest[i] = '\0'; + i++; + } + return (dest); +} + +char **free_split(char **array, size_t j) +{ + while (j > 0) + { + free(array[--j]); + } + free(array); + return (NULL); +} + +char **ft_split(char const *s, char c) +{ + t_split_struct v; + + init_split_struct(&v, s, c); + if (!s || !v.array) + return (NULL); + while (s[v.i]) + { + while (s[v.i] == c && s[v.i]) + v.i++; + v.start = v.i; + while (s[v.i] != c && s[v.i]) + v.i++; + if (v.i > v.start) + { + v.array[v.j] = (char *)malloc(v.i - v.start + 1); + if (!v.array[v.j]) + return (free_split(v.array, v.j)); + ft_strncpy(v.array[v.j], &s[v.start], v.i - v.start); + v.array[v.j][v.i - v.start] = '\0'; + v.j++; + } + } + v.array[v.j] = NULL; + return (v.array); +} diff --git a/libft/srcs/ft_straddchar.c b/libft/srcs/ft_straddchar.c new file mode 100644 index 0000000..bf83573 --- /dev/null +++ b/libft/srcs/ft_straddchar.c @@ -0,0 +1,37 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* ft_straddchar.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: lfirmin +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2024/11/08 06:02:17 by lfirmin #+# #+# */ +/* Updated: 2024/11/08 06:02:17 by lfirmin ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "libft.h" + +char *ft_straddchar(char *str, char c) +{ + int i; + char *res; + + if (!str) + return (NULL); + i = 0; + while (str[i]) + i++; + res = (char *)malloc(sizeof(char) * (i + 2)); + if (!res) + return (NULL); + i = 0; + while (str[i]) + { + res[i] = str[i]; + i++; + } + res[i] = c; + res[i + 1] = '\0'; + return (res); +} diff --git a/libft/srcs/ft_strchr.c b/libft/srcs/ft_strchr.c new file mode 100644 index 0000000..11f57be --- /dev/null +++ b/libft/srcs/ft_strchr.c @@ -0,0 +1,26 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* ft_strchr.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: lfirmin +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2024/05/21 06:46:40 by lfirmin #+# #+# */ +/* Updated: 2024/05/24 08:51:25 by lfirmin ### ########.fr */ +/* */ +/* ************************************************************************** */ +#include "libft.h" + +char *ft_strchr(char const *str, int c) +{ + while (*str) + { + if (*str == (char)c) + return ((char *)str); + str++; + } + if (*str == (char)c) + return ((char *)str); + else + return (NULL); +} diff --git a/libft/srcs/ft_strcmp.c b/libft/srcs/ft_strcmp.c new file mode 100644 index 0000000..e3d21ba --- /dev/null +++ b/libft/srcs/ft_strcmp.c @@ -0,0 +1,22 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* ft_strcmp.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: lfirmin +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2024/10/19 21:01:26 by lfirmin #+# #+# */ +/* Updated: 2024/10/19 21:01:26 by lfirmin ### ########.fr */ +/* */ +/* ************************************************************************** */ +#include "libft.h" + +int ft_strcmp(char *s1, char *s2) +{ + int i; + + i = 0; + while (s1[i] == s2[i] && s1[i] != '\0' && s2[i] != '\0') + i++; + return (s1[i] - s2[i]); +} diff --git a/libft/srcs/ft_strcpy.c b/libft/srcs/ft_strcpy.c new file mode 100644 index 0000000..c72313d --- /dev/null +++ b/libft/srcs/ft_strcpy.c @@ -0,0 +1,27 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* ft_strcpy.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: lfirmin +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2025/04/19 11:53:24 by lfirmin #+# #+# */ +/* Updated: 2025/04/19 11:58:04 by lfirmin ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "libft.h" + +char *ft_strcpy(char *dest, char *src) +{ + size_t i; + + i = 0; + while (src[i] != '\0') + { + dest[i] = src[i]; + i++; + } + dest[i] = '\0'; + return (dest); +} diff --git a/libft/srcs/ft_strdup.c b/libft/srcs/ft_strdup.c new file mode 100644 index 0000000..7df78c5 --- /dev/null +++ b/libft/srcs/ft_strdup.c @@ -0,0 +1,34 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* ft_strdup.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: lfirmin +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2024/05/15 05:28:24 by lfirmin #+# #+# */ +/* Updated: 2024/05/22 09:59:44 by lfirmin ### ########.fr */ +/* */ +/* ************************************************************************** */ +#include "libft.h" + +char *ft_strdup(const char *src) +{ + char *dest; + int i; + int size; + + size = 0; + while (src[size] != '\0') + size++; + dest = malloc(sizeof(char) * (size + 1)); + if (dest == NULL) + return (NULL); + i = 0; + while (i != size) + { + dest[i] = src[i]; + i++; + } + dest[i] = '\0'; + return (dest); +} diff --git a/libft/srcs/ft_striteri.c b/libft/srcs/ft_striteri.c new file mode 100644 index 0000000..bd32dda --- /dev/null +++ b/libft/srcs/ft_striteri.c @@ -0,0 +1,27 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* ft_striteri.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: lfirmin +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2024/05/29 10:54:40 by lfirmin #+# #+# */ +/* Updated: 2024/05/29 11:12:05 by lfirmin ### ########.fr */ +/* */ +/* ************************************************************************** */ +#include "libft.h" + +void ft_striteri(char *s, void (*f)(unsigned int, char*)) +{ + int i; + + i = 0; + if (s) + { + while (s[i]) + { + f(i, &s[i]); + ++i; + } + } +} diff --git a/libft/srcs/ft_strjoin.c b/libft/srcs/ft_strjoin.c new file mode 100644 index 0000000..aed8eb4 --- /dev/null +++ b/libft/srcs/ft_strjoin.c @@ -0,0 +1,34 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* ft_strjoin.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: lfirmin +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2024/05/22 01:00:14 by lfirmin #+# #+# */ +/* Updated: 2024/05/24 08:49:06 by lfirmin ### ########.fr */ +/* */ +/* ************************************************************************** */ +#include "libft.h" + +char *ft_strjoin(const char *s1, const char *s2) +{ + char *res; + int i; + int j; + + i = 0; + j = 0; + if (s1 == NULL && s2 == NULL) + return (NULL); + res = (char *) malloc((ft_strlen(s1) + ft_strlen(s2) + 1) * sizeof(char)); + if (!res) + return (NULL); + while (s1[i]) + res[j++] = s1[i++]; + i = 0; + while (s2[i]) + res[j++] = s2[i++]; + res[j] = 0; + return (res); +} diff --git a/libft/srcs/ft_strlcat.c b/libft/srcs/ft_strlcat.c new file mode 100644 index 0000000..b691378 --- /dev/null +++ b/libft/srcs/ft_strlcat.c @@ -0,0 +1,32 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* ft_strlcat.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: lfirmin +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2024/05/21 03:55:25 by lfirmin #+# #+# */ +/* Updated: 2024/05/22 09:59:44 by lfirmin ### ########.fr */ +/* */ +/* ************************************************************************** */ +#include "libft.h" + +size_t ft_strlcat(char *dst, const char *src, size_t size) +{ + size_t i; + size_t r; + size_t s; + + i = 0; + r = ft_strlen(dst); + s = ft_strlen(src); + if (size <= r) + return (s + size); + while (r + i < size - 1 && src[i] != '\0') + { + dst[r + i] = src[i]; + i++; + } + dst[r + i] = '\0'; + return (r + s); +} diff --git a/libft/srcs/ft_strlcpy.c b/libft/srcs/ft_strlcpy.c new file mode 100644 index 0000000..9721995 --- /dev/null +++ b/libft/srcs/ft_strlcpy.c @@ -0,0 +1,34 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* ft_strlcpy.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: lfirmin +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2024/05/21 02:18:17 by lfirmin #+# #+# */ +/* Updated: 2024/05/30 18:36:18 by lfirmin ### ########.fr */ +/* */ +/* ************************************************************************** */ +#include "libft.h" + +size_t ft_strlcpy(char *dst, const char *src, size_t dsts) +{ + size_t srcs; + size_t i; + + ft_strlen(src); + if (!src || !dst) + return (0); + srcs = ft_strlen(src); + i = 0; + if (dsts != 0) + { + while (src[i] != '\0' && i < (dsts - 1)) + { + dst[i] = src[i]; + i++; + } + dst[i] = '\0'; + } + return (srcs); +} diff --git a/libft/srcs/ft_strlen.c b/libft/srcs/ft_strlen.c new file mode 100644 index 0000000..c8a5c83 --- /dev/null +++ b/libft/srcs/ft_strlen.c @@ -0,0 +1,22 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* ft_strlen.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: lfirmin +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2024/05/19 23:16:45 by lfirmin #+# #+# */ +/* Updated: 2024/05/23 07:36:59 by lfirmin ### ########.fr */ +/* */ +/* ************************************************************************** */ +#include "libft.h" + +size_t ft_strlen(const char *s) +{ + int i; + + i = 0; + while (s[i]) + i++; + return ((size_t)i); +} diff --git a/libft/srcs/ft_strmapi.c b/libft/srcs/ft_strmapi.c new file mode 100644 index 0000000..9197596 --- /dev/null +++ b/libft/srcs/ft_strmapi.c @@ -0,0 +1,32 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* ft_strmapi.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: lfirmin +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2024/05/28 15:10:42 by lfirmin #+# #+# */ +/* Updated: 2024/05/28 17:00:27 by lfirmin ### ########.fr */ +/* */ +/* ************************************************************************** */ +#include "libft.h" + +char *ft_strmapi(char const *s, char (*f)(unsigned int, char)) +{ + char *str; + int i; + + if (!s) + return (NULL); + str = (char *)malloc(ft_strlen(s) + 1); + if (!str) + return (NULL); + i = 0; + while (s[i]) + { + str[i] = f(i, s[i]); + ++i; + } + str[i] = '\0'; + return (str); +} diff --git a/libft/srcs/ft_strncmp.c b/libft/srcs/ft_strncmp.c new file mode 100644 index 0000000..7fcfec4 --- /dev/null +++ b/libft/srcs/ft_strncmp.c @@ -0,0 +1,32 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* ft_strncmp.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: lfirmin +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2024/05/21 06:55:09 by lfirmin #+# #+# */ +/* Updated: 2024/05/24 08:47:59 by lfirmin ### ########.fr */ +/* */ +/* ************************************************************************** */ +#include "libft.h" + +int ft_strncmp(const char *s1, const char *s2, unsigned int n) +{ + unsigned int i; + unsigned char c1; + unsigned char c2; + + i = 0; + if (n == 0) + return (0); + while (i < n) + { + c1 = (unsigned char)s1[i]; + c2 = (unsigned char)s2[i]; + if (c1 != c2 || c1 == '\0' || c2 == '\0') + return (c1 - c2); + i++; + } + return (0); +} diff --git a/libft/srcs/ft_strnstr.c b/libft/srcs/ft_strnstr.c new file mode 100644 index 0000000..4f5acca --- /dev/null +++ b/libft/srcs/ft_strnstr.c @@ -0,0 +1,36 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* ft_strnstr.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: lfirmin +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2024/05/21 08:22:59 by lfirmin #+# #+# */ +/* Updated: 2024/05/22 09:59:44 by lfirmin ### ########.fr */ +/* */ +/* ************************************************************************** */ +#include "libft.h" + +char *ft_strnstr(const char *hay, const char *need, size_t len) +{ + size_t i; + size_t n; + + i = 0; + if (need[0] == '\0') + return ((char *)hay); + while (hay[i] != '\0') + { + n = 0; + while (hay[i + n] == need[n] && (i + n) < len) + { + if (hay[i + n] == '\0' && need[n] == '\0') + return ((char *)&hay[i]); + n++; + } + if (need[n] == '\0') + return ((char *)hay + i); + i++; + } + return (0); +} diff --git a/libft/srcs/ft_strrchr.c b/libft/srcs/ft_strrchr.c new file mode 100644 index 0000000..c7fc977 --- /dev/null +++ b/libft/srcs/ft_strrchr.c @@ -0,0 +1,35 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* ft_strrchr.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: lfirmin +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2024/05/21 06:42:38 by lfirmin #+# #+# */ +/* Updated: 2024/05/30 18:30:00 by lfirmin ### ########.fr */ +/* */ +/* ************************************************************************** */ +#include "libft.h" + +char *ft_strrchr(const char *str, int c) +{ + int i; + int last_occurrence; + + ft_strlen(str); + i = 0; + last_occurrence = -1; + if (str == NULL) + return (NULL); + while (str[i]) + { + if (str[i] == (char)c) + last_occurrence = i; + i++; + } + if ((char)c == '\0') + return ((char *)&str[i]); + if (last_occurrence != -1) + return ((char *)&str[last_occurrence]); + return (NULL); +} diff --git a/libft/srcs/ft_strtrim.c b/libft/srcs/ft_strtrim.c new file mode 100644 index 0000000..abbf77f --- /dev/null +++ b/libft/srcs/ft_strtrim.c @@ -0,0 +1,68 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* ft_strtrim.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: lfirmin +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2024/05/23 21:32:01 by lfirmin #+# #+# */ +/* Updated: 2024/05/31 02:04:11 by lfirmin ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "libft.h" + +static int is_in_set(char c, const char *set) +{ + while (*set) + { + if (c == *set) + { + return (1); + } + set++; + } + return (0); +} + +static char *ft_strncpy(char *dest, const char *src, unsigned int n) +{ + unsigned int i; + + i = 0; + while (src[i] != '\0' && i < n) + { + dest[i] = src[i]; + ++i; + } + while (i < n) + { + dest[i] = '\0'; + i++; + } + return (dest); +} + +char *ft_strtrim(const char *s1, const char *set) +{ + size_t s; + size_t e; + size_t len; + char *str; + + if (!s1 || !set) + return (NULL); + s = 0; + while (s1[s] && is_in_set(s1[s], set)) + s++; + e = ft_strlen(s1); + while (e > s && is_in_set(s1[e - 1], set)) + e--; + len = e - s; + str = (char *)malloc(sizeof(char) * (len + 1)); + if (!str) + return (NULL); + ft_strncpy(str, s1 + s, len); + str[len] = '\0'; + return (str); +} diff --git a/libft/srcs/ft_substr.c b/libft/srcs/ft_substr.c new file mode 100644 index 0000000..8e73142 --- /dev/null +++ b/libft/srcs/ft_substr.c @@ -0,0 +1,34 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* ft_substr.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: lfirmin +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2024/05/22 00:15:54 by lfirmin #+# #+# */ +/* Updated: 2024/05/24 08:28:01 by lfirmin ### ########.fr */ +/* */ +/* ************************************************************************** */ +#include "libft.h" + +char *ft_substr(char const *s, unsigned int start, size_t len) +{ + char *sub; + size_t i; + + if ((ft_strlen(s) - start) < len) + len = ft_strlen(s) - start; + if (ft_strlen(s) < start) + return (ft_strdup("")); + i = 0; + sub = (char *) malloc(len + 1); + if (!sub) + return (NULL); + while (len > 0) + { + sub[i++] = s[start++]; + len--; + } + sub[i] = '\0'; + return (sub); +} diff --git a/libft/srcs/ft_tolower.c b/libft/srcs/ft_tolower.c new file mode 100644 index 0000000..288a27a --- /dev/null +++ b/libft/srcs/ft_tolower.c @@ -0,0 +1,19 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* ft_tolower.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: lfirmin +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2024/05/21 04:50:40 by lfirmin #+# #+# */ +/* Updated: 2024/05/22 11:09:36 by lfirmin ### ########.fr */ +/* */ +/* ************************************************************************** */ +#include "libft.h" + +int ft_tolower(int c) +{ + if (c >= 65 && c <= 90) + return (c + 32); + return (c); +} diff --git a/libft/srcs/ft_toupper.c b/libft/srcs/ft_toupper.c new file mode 100644 index 0000000..d563003 --- /dev/null +++ b/libft/srcs/ft_toupper.c @@ -0,0 +1,19 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* ft_toupper.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: lfirmin +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2024/05/21 04:50:40 by lfirmin #+# #+# */ +/* Updated: 2024/05/22 09:59:44 by lfirmin ### ########.fr */ +/* */ +/* ************************************************************************** */ +#include "libft.h" + +int ft_toupper(int c) +{ + if (c >= 97 && c <= 122) + return (c - 32); + return (c); +} diff --git a/main.c b/main.c deleted file mode 100644 index 6e1b1db..0000000 --- a/main.c +++ /dev/null @@ -1,69 +0,0 @@ -// main.c -#include "cub3d.h" -#include -#include - -// ---- TEMP: petite map de test fermée (a remplacer par le parsing) ---- -static char *gmap[] = { - "111111111111", - "100000000001", - "101111011101", - "100100010001", - "101100010001", - "100000000001", - "111111111111", - NULL -}; - -static int map_w(char **m){ int w=0; for(int i=0;m[0][i];++i) w++; return w; } -static int map_h(char **m){ int h=0; while(m[h]) h++; return h; } - -// Charge texture XPM via mlx_xpm_file_to_image (ou via parsing) -static void load_tex(t_app *a, int id, const char *path){ - t_tex *t = &a->tex[id]; - t->img.ptr = mlx_xpm_file_to_image(a->mlx, (char*)path, &t->w, &t->h); - if (!t->img.ptr){ fprintf(stderr,"Texture load fail: %s\n", path); exit(1); } - t->img.addr = mlx_get_data_addr(t->img.ptr, &t->img.bpp, &t->img.line_len, &t->img.endian); -} - -int main(void) { - t_app a; - memset(&a, 0, sizeof(a)); - - a.mlx = mlx_init(); - if (!a.mlx) return 1; - a.win = mlx_new_window(a.mlx, WIN_W, WIN_H, "cub3d"); - a.frame.ptr = mlx_new_image(a.mlx, WIN_W, WIN_H); - a.frame.addr = mlx_get_data_addr(a.frame.ptr, &a.frame.bpp, &a.frame.line_len, &a.frame.endian); - - // map (remplace par le résultat de ton parsing) - a.map = gmap; - a.map_w = map_w(a.map); - a.map_h = map_h(a.map); - - // player init (à placer selon la map/parsed spawn + direction N/E/S/W) - a.px = 2.5; a.py = 2.5; - a.dirx = -1.0; a.diry = 0.0; - a.planex = 0.0; a.planey = 0.66; - - a.move_speed = 0.08; - a.rot_speed = 0.05; - - a.zbuf = malloc(sizeof(double) * WIN_W); - if (!a.zbuf) return 1; - - // charge 4 textures (exemples de chemins) - load_tex(&a, 0, "tex_north.xpm"); - load_tex(&a, 1, "tex_east.xpm"); - load_tex(&a, 2, "tex_south.xpm"); - load_tex(&a, 3, "tex_west.xpm"); - - // hooks - mlx_hook(a.win, 2, 1L<<0, key_press, &a); // KeyPress - mlx_hook(a.win, 3, 1L<<1, key_release, &a); // KeyRelease - mlx_hook(a.win, 17, 0, close_win, &a); // DestroyNotify - mlx_loop_hook(a.mlx, update, &a); - - mlx_loop(a.mlx); - return 0; -} diff --git a/maps/bad/color_invalid_rgb.cub b/maps/bad/color_invalid_rgb.cub new file mode 100644 index 0000000..1d49b6e --- /dev/null +++ b/maps/bad/color_invalid_rgb.cub @@ -0,0 +1,21 @@ +NO assets/test/north.xpm +SO assets/test/south.xpm +WE assets/test/west.xpm +EA assets/test/east.xpm + +F 20,20,-20 +C 200,200,200 + +11111 +10001 +10S01 +10001 +10001 +10001 +11001 +10001 +10001 +10001 +10001 +10001 +11111 diff --git a/maps/bad/color_missing.cub b/maps/bad/color_missing.cub new file mode 100644 index 0000000..c4267c2 --- /dev/null +++ b/maps/bad/color_missing.cub @@ -0,0 +1,20 @@ +NO assets/test/north.xpm +SO assets/test/south.xpm +WE assets/test/west.xpm +EA assets/test/east.xpm + +C 200,200,200 + +11111 +10001 +10S01 +10001 +10001 +10001 +11001 +10001 +10001 +10001 +10001 +10001 +11111 diff --git a/maps/bad/color_missing_ceiling_rgb.cub b/maps/bad/color_missing_ceiling_rgb.cub new file mode 100644 index 0000000..445f5aa --- /dev/null +++ b/maps/bad/color_missing_ceiling_rgb.cub @@ -0,0 +1,21 @@ +NO assets/test/north.xpm +SO assets/test/south.xpm +WE assets/test/west.xpm +EA assets/test/east.xpm + +F 20,20,20 +C 200,200, + +11111 +10001 +10S01 +10001 +10001 +10001 +11001 +10001 +10001 +10001 +10001 +10001 +11111 diff --git a/maps/bad/color_missing_floor_rgb.cub b/maps/bad/color_missing_floor_rgb.cub new file mode 100644 index 0000000..35de6fc --- /dev/null +++ b/maps/bad/color_missing_floor_rgb.cub @@ -0,0 +1,21 @@ +NO assets/test/north.xpm +SO assets/test/south.xpm +WE assets/test/west.xpm +EA assets/test/east.xpm + +F 20,20 +C 200,200,200 + +11111 +10001 +10S01 +10001 +10001 +10001 +11001 +10001 +10001 +10001 +10001 +10001 +11111 diff --git a/maps/bad/color_none.cub b/maps/bad/color_none.cub new file mode 100644 index 0000000..80de767 --- /dev/null +++ b/maps/bad/color_none.cub @@ -0,0 +1,18 @@ +NO assets/test/north.xpm +SO assets/test/south.xpm +WE assets/test/west.xpm +EA assets/test/east.xpm + +11111 +10001 +10S01 +10001 +10001 +10001 +11001 +10001 +10001 +10001 +10001 +10001 +11111 diff --git a/test b/maps/bad/empty.cub similarity index 100% rename from test rename to maps/bad/empty.cub diff --git a/maps/bad/file_letter_end.cub b/maps/bad/file_letter_end.cub new file mode 100644 index 0000000..ebf31c1 --- /dev/null +++ b/maps/bad/file_letter_end.cub @@ -0,0 +1,35 @@ +NO assets/test/north.xpm +SO assets/test/south.xpm +WE assets/test/west.xpm +EA assets/test/east.xpm + +F 20,20,20 +C 200,200,200 + +11111 +10001 +10S01 +10001 +10001 +10001 +11001 +10001 +10001 +10001 +10001 +10001 +11111 + + + + + + + + + + + + + +1 \ No newline at end of file diff --git a/maps/bad/filetype_missing b/maps/bad/filetype_missing new file mode 100644 index 0000000..050528e --- /dev/null +++ b/maps/bad/filetype_missing @@ -0,0 +1,21 @@ +NO assets/test/north.xpm +SO assets/test/south.xpm +WE assets/test/west.xpm +EA assets/test/east.xpm + +F 20,20,20 +C 200,200,200 + +11111 +10001 +10S01 +10001 +10001 +10001 +11001 +10001 +10001 +10001 +10001 +10001 +11111 diff --git a/maps/bad/filetype_wrong.buc b/maps/bad/filetype_wrong.buc new file mode 100644 index 0000000..050528e --- /dev/null +++ b/maps/bad/filetype_wrong.buc @@ -0,0 +1,21 @@ +NO assets/test/north.xpm +SO assets/test/south.xpm +WE assets/test/west.xpm +EA assets/test/east.xpm + +F 20,20,20 +C 200,200,200 + +11111 +10001 +10S01 +10001 +10001 +10001 +11001 +10001 +10001 +10001 +10001 +10001 +11111 diff --git a/maps/bad/map_only.cub b/maps/bad/map_only.cub new file mode 100644 index 0000000..046766e --- /dev/null +++ b/maps/bad/map_only.cub @@ -0,0 +1,13 @@ +11111 +10001 +10S01 +10001 +10001 +10001 +11001 +10001 +10001 +10001 +10001 +10001 +11111 diff --git a/maps/bad/map_too_small.cub b/maps/bad/map_too_small.cub new file mode 100644 index 0000000..21c3ac6 --- /dev/null +++ b/maps/bad/map_too_small.cub @@ -0,0 +1,10 @@ +NO assets/test/north.xpm +SO assets/test/south.xpm +WE assets/test/west.xpm +EA assets/test/east.xpm + +F 20,20,20 +C 200,200,200 + +111 +111 diff --git a/maps/bad/player_multiple.cub b/maps/bad/player_multiple.cub new file mode 100644 index 0000000..35ecf78 --- /dev/null +++ b/maps/bad/player_multiple.cub @@ -0,0 +1,21 @@ +NO assets/test/north.xpm +SO assets/test/south.xpm +WE assets/test/west.xpm +EA assets/test/east.xpm + +F 20,20,20 +C 200,200,200 + +11111 +10001 +10S01 +10001 +10001 +10001 +11E01 +10001 +10001 +10001 +10001 +10001 +11111 diff --git a/maps/bad/player_none.cub b/maps/bad/player_none.cub new file mode 100644 index 0000000..8122a1b --- /dev/null +++ b/maps/bad/player_none.cub @@ -0,0 +1,21 @@ +NO assets/test/north.xpm +SO assets/test/south.xpm +WE assets/test/west.xpm +EA assets/test/east.xpm + +F 20,20,20 +C 200,200,200 + +11111 +10001 +10001 +10001 +10001 +10001 +11001 +10001 +10001 +10001 +10001 +10001 +11111 diff --git a/maps/bad/player_on_edge.cub b/maps/bad/player_on_edge.cub new file mode 100644 index 0000000..0294635 --- /dev/null +++ b/maps/bad/player_on_edge.cub @@ -0,0 +1,21 @@ +NO assets/test/north.xpm +SO assets/test/south.xpm +WE assets/test/west.xpm +EA assets/test/east.xpm + +F 20,20,20 +C 200,200,200 + +1S111 +10001 +10001 +10001 +10001 +10001 +11001 +10001 +10001 +10001 +10001 +10001 +11111 diff --git a/maps/bad/textures_dir.cub b/maps/bad/textures_dir.cub new file mode 100644 index 0000000..7352765 --- /dev/null +++ b/maps/bad/textures_dir.cub @@ -0,0 +1,21 @@ +NO assets/test/north.xpm +SO assets/test/south.xpm +WE assets/test/west.xpm +EA assets/test/ + +F 20,20,20 +C 200,200,200 + +11111 +10001 +10S01 +10001 +10001 +10001 +11001 +10001 +10001 +10001 +10001 +10001 +11111 diff --git a/maps/bad/textures_duplicates.cub b/maps/bad/textures_duplicates.cub new file mode 100644 index 0000000..9d67178 --- /dev/null +++ b/maps/bad/textures_duplicates.cub @@ -0,0 +1,22 @@ +NO assets/test/north.xpm +SO assets/test/south.xpm +WE assets/test/west.xpm +EA assets/test/east.xpm +EA assets/test/east.xpm + +F 20,20,20 +C 200,200,200 + +11111 +10001 +10S01 +10001 +10001 +10001 +11001 +10001 +10001 +10001 +10001 +10001 +11111 diff --git a/maps/bad/textures_forbidden.cub b/maps/bad/textures_forbidden.cub new file mode 100644 index 0000000..9be89ed --- /dev/null +++ b/maps/bad/textures_forbidden.cub @@ -0,0 +1,21 @@ +NO assets/test/west.xpm +SO assets/test/west.xpm +WE assets/test/west.xpm +EA assets/test/forbidden.xpm + +F 20,20,20 +C 200,200,200 + +11111 +10001 +10S01 +10001 +10001 +10001 +11001 +10001 +10001 +10001 +10001 +10001 +11111 diff --git a/maps/bad/textures_invalid.cub b/maps/bad/textures_invalid.cub new file mode 100644 index 0000000..3839890 --- /dev/null +++ b/maps/bad/textures_invalid.cub @@ -0,0 +1,21 @@ +NO assets/test/north.xpm +SO assets/test/south.xpm +WE assets/test/x +EA assets/test/east.xpm + +F 20,20,20 +C 200,200,200 + +11111 +10001 +10S01 +10001 +10001 +10001 +11001 +10001 +10001 +10001 +10001 +10001 +11111 diff --git a/maps/bad/textures_missing.cub b/maps/bad/textures_missing.cub new file mode 100644 index 0000000..e3a8b74 --- /dev/null +++ b/maps/bad/textures_missing.cub @@ -0,0 +1,20 @@ +SO assets/test/south.xpm +WE assets/test/west.xpm +EA assets/test/east.xpm + +F 20,20,20 +C 200,200,200 + +11111 +10001 +10S01 +10001 +10001 +10001 +11001 +10001 +10001 +10001 +10001 +10001 +11111 diff --git a/maps/bad/textures_none.cub b/maps/bad/textures_none.cub new file mode 100644 index 0000000..1be13ba --- /dev/null +++ b/maps/bad/textures_none.cub @@ -0,0 +1,16 @@ +F 20,20,20 +C 200,200,200 + +11111 +10001 +10S01 +10001 +10001 +10001 +11001 +10001 +10001 +10001 +10001 +10001 +11111 diff --git a/maps/bad/textures_not_xpm.cub b/maps/bad/textures_not_xpm.cub new file mode 100644 index 0000000..758da5e --- /dev/null +++ b/maps/bad/textures_not_xpm.cub @@ -0,0 +1,21 @@ +NO assets/test/north +SO assets/test/south.xpm +WE assets/test/west.xpm +EA assets/test/east.xpm + +F 20,20,20 +C 200,200,200 + +11111 +10001 +10S01 +10001 +10001 +10001 +11001 +10001 +10001 +10001 +10001 +10001 +11111 diff --git a/maps/bad/wall_hole_east.cub b/maps/bad/wall_hole_east.cub new file mode 100644 index 0000000..76fd362 --- /dev/null +++ b/maps/bad/wall_hole_east.cub @@ -0,0 +1,21 @@ +NO assets/test/north.xpm +SO assets/test/south.xpm +WE assets/test/west.xpm +EA assets/test/east.xpm + +F 20,20,20 +C 200,200,200 + +11111 +10001 +10S01 +10001 +10001 +10001 +11000 +10001 +10001 +10001 +10001 +10001 +11111 diff --git a/maps/bad/wall_hole_north.cub b/maps/bad/wall_hole_north.cub new file mode 100644 index 0000000..6530a12 --- /dev/null +++ b/maps/bad/wall_hole_north.cub @@ -0,0 +1,21 @@ +NO assets/test/north.xpm +SO assets/test/south.xpm +WE assets/test/west.xpm +EA assets/test/east.xpm + +F 20,20,20 +C 200,200,200 + +11011 +10001 +10S01 +10001 +10001 +10001 +11001 +10001 +10001 +10001 +10001 +10001 +11111 diff --git a/maps/bad/wall_hole_south.cub b/maps/bad/wall_hole_south.cub new file mode 100644 index 0000000..0689ea2 --- /dev/null +++ b/maps/bad/wall_hole_south.cub @@ -0,0 +1,21 @@ +NO assets/test/north.xpm +SO assets/test/south.xpm +WE assets/test/west.xpm +EA assets/test/east.xpm + +F 20,20,20 +C 200,200,200 + +11111 +10001 +10S01 +10001 +10001 +10001 +11001 +10001 +10001 +10001 +10001 +10001 +11011 diff --git a/maps/bad/wall_hole_west.cub b/maps/bad/wall_hole_west.cub new file mode 100644 index 0000000..709a3eb --- /dev/null +++ b/maps/bad/wall_hole_west.cub @@ -0,0 +1,21 @@ +NO assets/test/north.xpm +SO assets/test/south.xpm +WE assets/test/west.xpm +EA assets/test/east.xpm + +F 20,20,20 +C 200,200,200 + +11111 +10001 +10S01 +10001 +10001 +00001 +11001 +10001 +10001 +10001 +10001 +10001 +11111 diff --git a/maps/bad/wall_none.cub b/maps/bad/wall_none.cub new file mode 100644 index 0000000..54dfed4 --- /dev/null +++ b/maps/bad/wall_none.cub @@ -0,0 +1,21 @@ +NO assets/test/north.xpm +SO assets/test/south.xpm +WE assets/test/west.xpm +EA assets/test/east.xpm + +F 20,20,20 +C 200,200,200 + +00000 +00000 +00S00 +00000 +00000 +00000 +00000 +00000 +00000 +00000 +00000 +00000 +00000 diff --git a/maps/good/dungeon.cub b/maps/good/dungeon.cub new file mode 100644 index 0000000..1039dd9 --- /dev/null +++ b/maps/good/dungeon.cub @@ -0,0 +1,18 @@ +F 76,76,76 +C 99,99,99 +EA assets/cobblestone_02.xpm +NO assets/cobblestone.xpm +SO assets/cobblestone_01.xpm +WE assets/mossy_cobblestone1.xpm + +1111111111111111111 +10W1001001001000001 +1011000001000001001 +1001001001111101111 +1001111000001001001 +1000000000000001001 +1001111111111001001 +1111000000000001011 +1000000001000000001 +1111111111111111111 + diff --git a/maps/good/library.cub b/maps/good/library.cub new file mode 100644 index 0000000..37137ae --- /dev/null +++ b/maps/good/library.cub @@ -0,0 +1,22 @@ +F 139,99,58 +C 171,154,137 + +NO assets/bookshelf.xpm +SO assets/bookshelf_01.xpm +WE assets/bookshelf_02.xpm +EA assets/bookshelf_03.xpm + +1111111111111111111 +1001001001001001001 +1001001001001001001 +1001001001001001001 +1001001000001001001 +100000000S000000001 +1000011111111000001 +1111000000000001111 +1000000101010000001 +1111111111111111111 +1 +1 +1 +1 diff --git a/maps/good/test.cub b/maps/good/test.cub new file mode 100644 index 0000000..bcbe121 --- /dev/null +++ b/maps/good/test.cub @@ -0,0 +1,29 @@ + + +NO assets/n.xpm +EA assets/e.xpm +WE assets/w.xpm +SO assets/s.xpm + + + + +C 200,200,200 +F 200,200,200 + + 1111 + 1001 +10001 +10001 +10101 +1N01 +1001 +10001 +10001 +100011 +10001 +10001 +111111 + 1111 + 11 + 1111 diff --git a/render.c b/render.c deleted file mode 100644 index 9a9057d..0000000 --- a/render.c +++ /dev/null @@ -1,140 +0,0 @@ -// render.c -#include "cub3d.h" - -static int is_wall(t_app *a, int mx, int my) { - if (mx < 0 || my < 0 || mx >= a->map_w || my >= a->map_h) return 1; - return (a->map[my][mx] == '1'); -} - -static void move_player(t_app *a) { - double ms = a->move_speed; - double rs = a->rot_speed; - - // forward/back - if (a->keys.w) { - double nx = a->px + a->dirx * ms; - double ny = a->py + a->diry * ms; - if (!is_wall(a, (int)nx, (int)a->py)) a->px = nx; - if (!is_wall(a, (int)a->px, (int)ny)) a->py = ny; - } - if (a->keys.s) { - double nx = a->px - a->dirx * ms; - double ny = a->py - a->diry * ms; - if (!is_wall(a, (int)nx, (int)a->py)) a->px = nx; - if (!is_wall(a, (int)a->px, (int)ny)) a->py = ny; - } - // strafe - if (a->keys.a) { - double nx = a->px - a->diry * ms; - double ny = a->py + a->dirx * ms; - if (!is_wall(a, (int)nx, (int)a->py)) a->px = nx; - if (!is_wall(a, (int)a->px, (int)ny)) a->py = ny; - } - if (a->keys.d) { - double nx = a->px + a->diry * ms; - double ny = a->py - a->dirx * ms; - if (!is_wall(a, (int)nx, (int)a->py)) a->px = nx; - if (!is_wall(a, (int)a->px, (int)ny)) a->py = ny; - } - // rotation - if (a->keys.left || a->keys.right) { - double angle = (a->keys.left ? -rs : rs); - double olddirx = a->dirx; - a->dirx = a->dirx * cos(angle) - a->diry * sin(angle); - a->diry = olddirx * sin(angle) + a->diry * cos(angle); - double oldplanex = a->planex; - a->planex = a->planex * cos(angle) - a->planey * sin(angle); - a->planey = oldplanex * sin(angle) + a->planey * cos(angle); - } -} - -static void draw_vertical_line_tex(t_app *a, int x, int drawStart, int drawEnd, - t_tex *tex, int texX, double step, double texPos) { - if (drawStart < 0) drawStart = 0; - if (drawEnd >= WIN_H) drawEnd = WIN_H - 1; - - // plafond (optionnel: couleur unie) - for (int y = 0; y < drawStart; ++y) - put_pixel(&a->frame, x, y, 0x0080A0); // bleu doux - - for (int y = drawStart; y <= drawEnd; ++y) { - int texY = (int)texPos & (tex->h - 1); // textures power-of-two → masque ok - texPos += step; - int color = get_tex_color(tex, texX, texY); - put_pixel(&a->frame, x, y, color); - } - // sol - for (int y = drawEnd + 1; y < WIN_H; ++y) - put_pixel(&a->frame, x, y, 0x404040); -} - -void render_frame(t_app *a) { - // clear: pas nécessaire si on redraw tout (plafond/sol + murs) - for (int x = 0; x < WIN_W; ++x) { - // camX dans [-1, 1] - double cameraX = 2.0 * x / (double)WIN_W - 1.0; - double rayDirX = a->dirx + a->planex * cameraX; - double rayDirY = a->diry + a->planey * cameraX; - - int mapX = (int)a->px; - int mapY = (int)a->py; - - double deltaDistX = (rayDirX == 0) ? 1e30 : fabs(1.0 / rayDirX); - double deltaDistY = (rayDirY == 0) ? 1e30 : fabs(1.0 / rayDirY); - double sideDistX, sideDistY; - int stepX, stepY; - - if (rayDirX < 0) { stepX = -1; sideDistX = (a->px - mapX) * deltaDistX; } - else { stepX = 1; sideDistX = (mapX + 1.0 - a->px) * deltaDistX; } - if (rayDirY < 0) { stepY = -1; sideDistY = (a->py - mapY) * deltaDistY; } - else { stepY = 1; sideDistY = (mapY + 1.0 - a->py) * deltaDistY; } - - int hit = 0, side = 0; - while (!hit) { - if (sideDistX < sideDistY) { sideDistX += deltaDistX; mapX += stepX; side = 0; } - else { sideDistY += deltaDistY; mapY += stepY; side = 1; } - if (is_wall(a, mapX, mapY)) hit = 1; - } - - double perpWallDist = (side == 0) - ? (mapX - a->px + (1 - stepX) / 2.0) / rayDirX - : (mapY - a->py + (1 - stepY) / 2.0) / rayDirY; - if (perpWallDist < 1e-6) perpWallDist = 1e-6; - - int lineHeight = (int)(WIN_H / perpWallDist); - int drawStart = -lineHeight / 2 + WIN_H / 2; - int drawEnd = lineHeight / 2 + WIN_H / 2; - - // texture selection: 0=N,1=E,2=S,3=W (à adapter selon ta map) - int tex_id; - if (side == 0 && rayDirX > 0) tex_id = 3; // W - else if (side == 0 && rayDirX < 0) tex_id = 1; // E - else if (side == 1 && rayDirY > 0) tex_id = 0; // N - else tex_id = 2; // S - t_tex *tex = &a->tex[tex_id]; - - // point d'impact sur le mur - double wallX = (side == 0) ? (a->py + perpWallDist * rayDirY) - : (a->px + perpWallDist * rayDirX); - wallX -= floor(wallX); - - int texX = (int)(wallX * (double)tex->w); - if (side == 0 && rayDirX > 0) texX = tex->w - texX - 1; - if (side == 1 && rayDirY < 0) texX = tex->w - texX - 1; - - double step = (double)tex->h / (double)lineHeight; - double texPos = (drawStart - WIN_H / 2 + lineHeight / 2) * step; - - draw_vertical_line_tex(a, x, drawStart, drawEnd, tex, texX, step, texPos); - - a->zbuf[x] = perpWallDist; - } - - mlx_put_image_to_window(a->mlx, a->win, a->frame.ptr, 0, 0); -} - -int update(t_app *a) { - move_player(a); - render_frame(a); - return 0; -} diff --git a/srcs/exec/draw.c b/srcs/exec/draw.c new file mode 100644 index 0000000..a440729 --- /dev/null +++ b/srcs/exec/draw.c @@ -0,0 +1,59 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* draw.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: jle-neze +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2025/09/12 18:18:26 by jle-neze #+# #+# */ +/* Updated: 2025/09/12 18:18:52 by jle-neze ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "cub.h" + +void draw_background(t_game *g) +{ + int x, y, half = g->gfx.h / 2; + + for (y = 0; y < g->gfx.h; y++) + { + for (x = 0; x < g->gfx.w; x++) + { + if (y < half) + img_put_pixel(&g->gfx.frame, x, y, g->colors.ceil); + else + img_put_pixel(&g->gfx.frame, x, y, g->colors.floor); + } + } +} + +/* aussi exposée dans raycast.c, mais on garde la déclaration ici pour réutiliser ailleurs */ +void draw_vline(t_game *g, int x, int y0, int y1, int color) +{ + if (y0 < 0) y0 = 0; + if (y1 >= g->gfx.h) y1 = g->gfx.h - 1; + for (int y = y0; y <= y1; y++) + img_put_pixel(&g->gfx.frame, x, y, color); +} + +void draw_tex_vline(t_game *g, int x, int y0, int y1, + t_tex *tex, int tex_x, double step, double tex_pos) +{ + if (y0 < 0) + { + tex_pos += step * (-y0); + y0 = 0; + } + if (y1 >= g->gfx.h) + y1 = g->gfx.h - 1; + for (int y = y0; y <= y1; y++) + { + int tex_y = (int)tex_pos; + if (tex_y < 0) tex_y = 0; + if (tex_y >= tex->h) tex_y = tex->h - 1; + unsigned int color = tex_get_pixel(tex, tex_x, tex_y); + img_put_pixel(&g->gfx.frame, x, y, (int)color); + tex_pos += step; + } +} diff --git a/srcs/exec/hooks.c b/srcs/exec/hooks.c new file mode 100644 index 0000000..1e2cb0e --- /dev/null +++ b/srcs/exec/hooks.c @@ -0,0 +1,66 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* hooks.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: jle-neze +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2025/09/12 18:19:19 by jle-neze #+# #+# */ +/* Updated: 2025/09/12 18:19:22 by jle-neze ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "cub.h" +#include "keys.h" +#include + +int on_destroy(t_game *g) +{ + textures_free(g); + cleanup_window(g); + world_free(&g->world); + /* Libérer data si disponible */ + if (g->data) + { + free_textures(g->data->texture); + free_data(g->data); + } + exit(0); + return (0); +} + + +static void set_key(int key, t_game *g, int press) +{ + if (key == KEY_W) g->in.w = press; + if (key == KEY_A) g->in.a = press; + if (key == KEY_S) g->in.s = press; + if (key == KEY_D) g->in.d = press; + if (key == KEY_LEFT) g->in.left = press; + if (key == KEY_RIGHT) g->in.right = press; +} + +int on_keydown(int key, t_game *g) +{ + if (key == KEY_ESC) + on_destroy(g); + set_key(key, g, 1); + return (0); +} + +int on_keyup(int key, t_game *g) +{ + set_key(key, g, 0); + return (0); +} + +void setup_hooks(t_game *g) +{ + /* croix de fermeture */ + mlx_hook(g->gfx.win, 17, 0, on_destroy, g); + /* KeyPress / KeyRelease */ + mlx_hook(g->gfx.win, 2, 1L<<0, on_keydown, g); + mlx_hook(g->gfx.win, 3, 1L<<1, on_keyup, g); + /* boucle */ + mlx_loop_hook(g->gfx.mlx, game_loop, g); +} diff --git a/srcs/exec/image.c b/srcs/exec/image.c new file mode 100644 index 0000000..6fe1dec --- /dev/null +++ b/srcs/exec/image.c @@ -0,0 +1,23 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* image.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: jle-neze +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2025/09/12 18:19:47 by jle-neze #+# #+# */ +/* Updated: 2025/09/12 18:19:49 by jle-neze ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "cub.h" + +void img_put_pixel(t_img *img, int x, int y, int color) +{ + char *dst; + + if (x < 0 || y < 0 || x >= img->w || y >= img->h) + return ; + dst = img->addr + (y * img->line_len + x * (img->bpp / 8)); + *(unsigned int *)dst = (unsigned int)color; +} diff --git a/srcs/exec/init.c b/srcs/exec/init.c new file mode 100644 index 0000000..3c5d1ac --- /dev/null +++ b/srcs/exec/init.c @@ -0,0 +1,55 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* init.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: jle-neze +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2025/09/12 18:20:06 by jle-neze #+# #+# */ +/* Updated: 2025/09/12 18:20:08 by jle-neze ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "cub.h" + +int init_window(t_game *g, int w, int h, char *title) +{ + g->gfx.w = w; + g->gfx.h = h; + g->gfx.mlx = mlx_init(); + if (!g->gfx.mlx) + return (1); + g->gfx.win = mlx_new_window(g->gfx.mlx, w, h, title); + if (!g->gfx.win) + return (1); + g->gfx.frame.ptr = mlx_new_image(g->gfx.mlx, w, h); + if (!g->gfx.frame.ptr) + return (1); + g->gfx.frame.addr = mlx_get_data_addr(g->gfx.frame.ptr, &g->gfx.frame.bpp, + &g->gfx.frame.line_len, &g->gfx.frame.endian); + g->gfx.frame.w = w; + g->gfx.frame.h = h; + return (0); +} + +void cleanup_window(t_game *g) +{ + if (!g) + return ; + if (g->gfx.frame.ptr) + { + mlx_destroy_image(g->gfx.mlx, g->gfx.frame.ptr); + g->gfx.frame.ptr = NULL; + } + if (g->gfx.win) + { + mlx_destroy_window(g->gfx.mlx, g->gfx.win); + g->gfx.win = NULL; + } + if (g->gfx.mlx) + { + mlx_destroy_display(g->gfx.mlx); + free(g->gfx.mlx); + g->gfx.mlx = NULL; + } +} \ No newline at end of file diff --git a/srcs/exec/loop.c b/srcs/exec/loop.c new file mode 100644 index 0000000..883b4e1 --- /dev/null +++ b/srcs/exec/loop.c @@ -0,0 +1,25 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* loop.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: jle-neze +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2025/09/12 18:24:03 by jle-neze #+# #+# */ +/* Updated: 2025/09/12 18:24:05 by jle-neze ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "cub.h" + +int game_loop(t_game *g) +{ + /* 1) Update joueur selon input */ + player_update(g); + /* 2) Dessin */ + draw_background(g); + raycast_frame(g); + mlx_put_image_to_window(g->gfx.mlx, g->gfx.win, g->gfx.frame.ptr, 0, 0); + return (0); +} +/* Note: on pourrait optimiser en ne redessinant que ce qui change */ diff --git a/srcs/exec/player.c b/srcs/exec/player.c new file mode 100644 index 0000000..8e9311f --- /dev/null +++ b/srcs/exec/player.c @@ -0,0 +1,80 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* player.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: jle-neze +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2025/09/12 18:24:21 by jle-neze #+# #+# */ +/* Updated: 2025/09/12 18:24:22 by jle-neze ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "cub.h" + +void player_init(t_game *g, double px, double py, double dx, double dy) +{ + g->cam.pos_x = px; + g->cam.pos_y = py; + g->cam.dir_x = dx; + g->cam.dir_y = dy; + /* FOV ≈ 66° → plane perpendiculaire (0.66) */ + g->cam.plane_x = -dy * 0.66; + g->cam.plane_y = dx * 0.66; + g->move_speed = 0.07; /* ajuste si besoin */ + g->rot_speed = 0.05; /* rad/frame */ +} + +/* petits helpers collision */ +static int is_wall(t_world *w, int mx, int my) +{ + if (mx < 0 || my < 0 || mx >= w->w || my >= w->h) return (1); + return (w->grid[my][mx] == '1'); +} + +void player_update(t_game *g) +{ + double nx, ny; + + /* Avancer/retour W/S */ + if (g->in.w) + { + nx = g->cam.pos_x + g->cam.dir_x * g->move_speed; + ny = g->cam.pos_y + g->cam.dir_y * g->move_speed; + if (!is_wall(&g->world, (int)nx, (int)g->cam.pos_y)) g->cam.pos_x = nx; + if (!is_wall(&g->world, (int)g->cam.pos_x, (int)ny)) g->cam.pos_y = ny; + } + if (g->in.s) + { + nx = g->cam.pos_x - g->cam.dir_x * g->move_speed; + ny = g->cam.pos_y - g->cam.dir_y * g->move_speed; + if (!is_wall(&g->world, (int)nx, (int)g->cam.pos_y)) g->cam.pos_x = nx; + if (!is_wall(&g->world, (int)g->cam.pos_x, (int)ny)) g->cam.pos_y = ny; + } + /* Strafe A/D (gauche/droite) */ + if (g->in.a) + { + nx = g->cam.pos_x - g->cam.dir_y * g->move_speed; + ny = g->cam.pos_y + g->cam.dir_x * g->move_speed; + if (!is_wall(&g->world, (int)nx, (int)g->cam.pos_y)) g->cam.pos_x = nx; + if (!is_wall(&g->world, (int)g->cam.pos_x, (int)ny)) g->cam.pos_y = ny; + } + if (g->in.d) + { + nx = g->cam.pos_x + g->cam.dir_y * g->move_speed; + ny = g->cam.pos_y - g->cam.dir_x * g->move_speed; + if (!is_wall(&g->world, (int)nx, (int)g->cam.pos_y)) g->cam.pos_x = nx; + if (!is_wall(&g->world, (int)g->cam.pos_x, (int)ny)) g->cam.pos_y = ny; + } + /* Rotation gauche/droite */ + if (g->in.left || g->in.right) + { + double rs = g->rot_speed * (g->in.right ? 1.0 : -1.0); + double old_dir_x = g->cam.dir_x; + g->cam.dir_x = g->cam.dir_x * cos(rs) - g->cam.dir_y * sin(rs); + g->cam.dir_y = old_dir_x * sin(rs) + g->cam.dir_y * cos(rs); + double old_plane_x = g->cam.plane_x; + g->cam.plane_x = g->cam.plane_x * cos(rs) - g->cam.plane_y * sin(rs); + g->cam.plane_y = old_plane_x * sin(rs) + g->cam.plane_y * cos(rs); + } +} diff --git a/srcs/exec/raycast.c b/srcs/exec/raycast.c new file mode 100644 index 0000000..be707b0 --- /dev/null +++ b/srcs/exec/raycast.c @@ -0,0 +1,243 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* raycast.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: jle-neze +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2025/09/12 18:24:37 by jle-neze #+# #+# */ +/* Updated: 2025/10/26 02:20:06 by lfirmin ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "cub.h" + +// /* petite fonction utilitaire: trace une ligne verticale remplie */ +// void draw_vline(t_game *g, int x, int y0, int y1, int color) +// { +// if (y0 < 0) y0 = 0; +// if (y1 >= g->gfx.h) y1 = g->gfx.h - 1; +// for (int y = y0; y <= y1; y++) +// img_put_pixel(&g->gfx.frame, x, y, color); +// } + +/* Version 1: simple couleurs */ +// void raycast_frame(t_game *g) +// { +// for (int x = 0; x < g->gfx.w; x++) +// { +// double camera_x = 2.0 * x / (double)g->gfx.w - 1.0; +// double ray_dir_x = g->cam.dir_x + g->cam.plane_x * camera_x; +// double ray_dir_y = g->cam.dir_y + g->cam.plane_y * camera_x; + +// int map_x = (int)g->cam.pos_x; +// int map_y = (int)g->cam.pos_y; + +// double delta_dist_x = (ray_dir_x == 0) ? 1e30 : fabs(1.0 / ray_dir_x); +// double delta_dist_y = (ray_dir_y == 0) ? 1e30 : fabs(1.0 / ray_dir_y); + +// int step_x, step_y; +// double side_dist_x, side_dist_y; + +// if (ray_dir_x < 0) +// { +// step_x = -1; +// side_dist_x = (g->cam.pos_x - map_x) * delta_dist_x; +// } +// else +// { +// step_x = 1; +// side_dist_x = (map_x + 1.0 - g->cam.pos_x) * delta_dist_x; +// } +// if (ray_dir_y < 0) +// { +// step_y = -1; +// side_dist_y = (g->cam.pos_y - map_y) * delta_dist_y; +// } +// else +// { +// step_y = 1; +// side_dist_y = (map_y + 1.0 - g->cam.pos_y) * delta_dist_y; +// } + +// int hit = 0; +// int side = 0; /* 0:x, 1:y */ + +// while (!hit) +// { +// if (side_dist_x < side_dist_y) +// { +// side_dist_x += delta_dist_x; +// map_x += step_x; +// side = 0; +// } +// else +// { +// side_dist_y += delta_dist_y; +// map_y += step_y; +// side = 1; +// } +// if (map_x < 0 || map_y < 0 || map_x >= g->world.w || map_y >= g->world.h +// || g->world.grid[map_y][map_x] == '1') +// hit = 1; +// } +// double perp_wall_dist; +// if (side == 0) +// perp_wall_dist = (side_dist_x - delta_dist_x); +// else +// perp_wall_dist = (side_dist_y - delta_dist_y); + +// int line_h = (int)(g->gfx.h / (perp_wall_dist > 1e-6 ? perp_wall_dist : 1e-6)); +// int draw_start = -line_h / 2 + g->gfx.h / 2; +// int draw_end = line_h / 2 + g->gfx.h / 2; + +// /* Couleur: simple code NSEW selon step & side */ +// int color_idx; +// if (side == 0) +// color_idx = (step_x < 0) ? 2 /* E */ : 3 /* W */; +// else +// color_idx = (step_y < 0) ? 1 /* S */ : 0 /* N */; + +// int color = g->colors.wall_nsew[color_idx]; +// if (side == 1) color = (color & 0xFEFEFE) >> 1; /* ombre simple */ + +// draw_vline(g, x, draw_start, draw_end, color); +// } +// } + +/* 2eme test de la meme focntion (pas encore choisi laquelle)*/ +// void raycast_frame(t_game *g) +// { +// for (int x = 0; x < g->gfx.w; x++) +// { +// double camera_x = 2.0 * x / (double)g->gfx.w - 1.0; +// double ray_dir_x = g->cam.dir_x + g->cam.plane_x * camera_x; +// double ray_dir_y = g->cam.dir_y + g->cam.plane_y * camera_x; + +// int map_x = (int)g->cam.pos_x; +// int map_y = (int)g->cam.pos_y; + +// double delta_dist_x = (ray_dir_x == 0) ? 1e30 : fabs(1.0 / ray_dir_x); +// double delta_dist_y = (ray_dir_y == 0) ? 1e30 : fabs(1.0 / ray_dir_y); + +// int step_x, step_y; +// double side_dist_x, side_dist_y; + +// if (ray_dir_x < 0) { step_x = -1; side_dist_x = (g->cam.pos_x - map_x) * delta_dist_x; } +// else { step_x = 1; side_dist_x = (map_x + 1.0 - g->cam.pos_x) * delta_dist_x; } +// if (ray_dir_y < 0) { step_y = -1; side_dist_y = (g->cam.pos_y - map_y) * delta_dist_y; } +// else { step_y = 1; side_dist_y = (map_y + 1.0 - g->cam.pos_y) * delta_dist_y; } + +// int hit = 0, side = 0; +// while (!hit) +// { +// if (side_dist_x < side_dist_y) { side_dist_x += delta_dist_x; map_x += step_x; side = 0; } +// else { side_dist_y += delta_dist_y; map_y += step_y; side = 1; } +// if (map_x < 0 || map_y < 0 || map_x >= g->world.w || map_y >= g->world.h +// || g->world.grid[map_y][map_x] == '1') +// hit = 1; +// } + +// double perp_wall_dist = (side == 0) ? (side_dist_x - delta_dist_x) : (side_dist_y - delta_dist_y); +// if (perp_wall_dist < 1e-6) perp_wall_dist = 1e-6; + +// int line_h = (int)(g->gfx.h / perp_wall_dist); +// int draw_start = -line_h / 2 + g->gfx.h / 2; +// int draw_end = line_h / 2 + g->gfx.h / 2; + +// int color_idx; +// if (side == 0) color_idx = (step_x < 0) ? 2 /* E */ : 3 /* W */; +// else color_idx = (step_y < 0) ? 1 /* S */ : 0 /* N */; + +// int color = g->colors.wall_nsew[color_idx]; +// if (side == 1) color = (color & 0xFEFEFE) >> 1; /* ombre simple */ + +// draw_vline(g, x, draw_start, draw_end, color); /* impl. dans draw.c */ +// } +// } + +/* Version 3: textures */ +void raycast_frame(t_game *g) +{ + const double EPS = 1e-6; + + for (int x = 0; x < g->gfx.w; x++) + { + double camera_x = 2.0 * x / (double)g->gfx.w - 1.0; + double ray_dir_x = g->cam.dir_x + g->cam.plane_x * camera_x; + double ray_dir_y = g->cam.dir_y + g->cam.plane_y * camera_x; + + int map_x = (int)g->cam.pos_x; + int map_y = (int)g->cam.pos_y; + + double delta_dist_x = (ray_dir_x == 0) ? 1e30 : fabs(1.0 / ray_dir_x); + double delta_dist_y = (ray_dir_y == 0) ? 1e30 : fabs(1.0 / ray_dir_y); + + int step_x, step_y; + double side_dist_x, side_dist_y; + + if (ray_dir_x < 0) { step_x = -1; side_dist_x = (g->cam.pos_x - map_x) * delta_dist_x; } + else { step_x = 1; side_dist_x = (map_x + 1.0 - g->cam.pos_x) * delta_dist_x; } + if (ray_dir_y < 0) { step_y = -1; side_dist_y = (g->cam.pos_y - map_y) * delta_dist_y; } + else { step_y = 1; side_dist_y = (map_y + 1.0 - g->cam.pos_y) * delta_dist_y; } + + int hit = 0, side = 0; + while (!hit) + { + if (side_dist_x < side_dist_y) { side_dist_x += delta_dist_x; map_x += step_x; side = 0; } + else { side_dist_y += delta_dist_y; map_y += step_y; side = 1; } + if (map_x < 0 || map_y < 0 || map_x >= g->world.w || map_y >= g->world.h + || g->world.grid[map_y][map_x] == '1') + hit = 1; + } + + double perp_wall_dist = (side == 0) ? (side_dist_x - delta_dist_x) : (side_dist_y - delta_dist_y); + if (perp_wall_dist < EPS) perp_wall_dist = EPS; + + int line_h = (int)(g->gfx.h / perp_wall_dist); + int draw_start = -line_h / 2 + g->gfx.h / 2; + int draw_end = line_h / 2 + g->gfx.h / 2; + + /* Choix de texture 0:N 1:S 2:E 3:W (même logique que couleurs) */ + int tex_id; + if (side == 0) tex_id = (step_x < 0) ? 2 /* E */ : 3 /* W */; + else tex_id = (step_y < 0) ? 1 /* S */ : 0 /* N */; + + if (!g->has_tex) + { + int color = g->colors.wall_nsew[tex_id]; + if (side == 1) color = (color & 0xFEFEFE) >> 1; + draw_vline(g, x, draw_start, draw_end, color); + continue; + } + + /* --- TEXTURE MAPPING --- */ + t_tex *t = &g->tex[tex_id]; + + /* Position exacte du hit sur le mur (0..1) */ + double wall_x; + if (side == 0) + wall_x = g->cam.pos_y + perp_wall_dist * ray_dir_y; + else + wall_x = g->cam.pos_x + perp_wall_dist * ray_dir_x; + wall_x -= floor(wall_x); + + /* Coordonnée X dans la texture */ + int tex_x = (int)(wall_x * (double)t->w); + if (side == 0 && ray_dir_x > 0) tex_x = t->w - tex_x - 1; + if (side == 1 && ray_dir_y < 0) tex_x = t->w - tex_x - 1; + + /* Échantillonnage vertical */ + double step = (double)t->h / (double)line_h; + double tex_pos = (draw_start - g->gfx.h / 2 + line_h / 2) * step; + + /* Ombre légère sur faces Y (optionnel) */ + draw_tex_vline(g, x, draw_start, draw_end, t, tex_x, step, tex_pos); + if (side == 1) { + /* sombrement simple: on pourrait parcourir y et foncer; plus simple: rien faire + pour rester portable / endianness-safe. */ + } + } +} + + diff --git a/srcs/exec/textures.c b/srcs/exec/textures.c new file mode 100644 index 0000000..1f79947 --- /dev/null +++ b/srcs/exec/textures.c @@ -0,0 +1,53 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* textures.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: jle-neze +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2025/09/12 18:24:56 by jle-neze #+# #+# */ +/* Updated: 2025/09/12 18:24:58 by jle-neze ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "cub.h" + +static int load_one(t_game *g, t_tex *t, const char *path) +{ + t->ptr = mlx_xpm_file_to_image(g->gfx.mlx, (char *)path, &t->w, &t->h); + if (!t->ptr) + return (1); + t->addr = mlx_get_data_addr(t->ptr, &t->bpp, &t->line_len, &t->endian); + return (0); +} + +int textures_load(t_game *g, const char *no, const char *so, + const char *we, const char *ea) +{ + if (load_one(g, &g->tex[0], no) + || load_one(g, &g->tex[1], so) + || load_one(g, &g->tex[2], we) + || load_one(g, &g->tex[3], ea)) + { + textures_free(g); + return (1); + } + g->has_tex = 1; + return (0); +} + +void textures_free(t_game *g) +{ + for (int i = 0; i < 4; i++) + { + if (g->tex[i].ptr) + mlx_destroy_image(g->gfx.mlx, g->tex[i].ptr); + g->tex[i].ptr = NULL; + } +} + +unsigned int tex_get_pixel(t_tex *t, int x, int y) +{ + char *px = t->addr + (y * t->line_len + x * (t->bpp / 8)); + return (*(unsigned int *)px); +} diff --git a/srcs/exec/world.c b/srcs/exec/world.c new file mode 100644 index 0000000..4dae474 --- /dev/null +++ b/srcs/exec/world.c @@ -0,0 +1,81 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* world.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: jle-neze +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2025/09/12 18:25:13 by jle-neze #+# #+# */ +/* Updated: 2025/09/12 18:25:17 by jle-neze ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "cub.h" +#include + +// static const char *demo_map[] = { +// "111111111111", +// "100000000001", +// "100011110001", +// "100000010001", +// "101111010001", +// "100100010001", +// "10010N010001", /* N = start dir nord, on l'ignore ici (juste info) */ +// "100000000001", +// "111111111111", +// NULL +// }; +static const char *demo_map[] = { + "111111111111", + "100000000001", + "100000000001", + "100000000001", + "100000001111", + "100000000001", + "100000000001", /* N = start dir nord, on l'ignore ici (juste info) */ + "100000000001", + "111111111111", + NULL +}; + +int world_init_demo(t_world *w) +{ + int h = 0; + while (demo_map[h]) + h++; + w->h = h; + w->w = 0; + for (int i = 0; i < h; i++) + { + int len = 0; + while (demo_map[i][len]) len++; + if (len > w->w) w->w = len; + } + w->grid = (char **)malloc(sizeof(char *) * (h + 1)); + if (!w->grid) return (1); + for (int y = 0; y < h; y++) + { + w->grid[y] = (char *)malloc(w->w + 1); + if (!w->grid[y]) return (1); + for (int x = 0; x < w->w; x++) + { + char c = demo_map[y][x]; + if (c == 0) c = '1'; + if (c == 'N' || c == 'S' || c == 'E' || c == 'W') + c = '0'; + w->grid[y][x] = c; + } + w->grid[y][w->w] = '\0'; + } + w->grid[h] = NULL; + return (0); +} + +void world_free(t_world *w) +{ + if (!w->grid) return ; + for (int y = 0; y < w->h; y++) + free(w->grid[y]); + free(w->grid); + w->grid = NULL; +} diff --git a/srcs/main.c b/srcs/main.c new file mode 100644 index 0000000..7f205fa --- /dev/null +++ b/srcs/main.c @@ -0,0 +1,207 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* main.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: lfirmin +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2025/08/22 14:56:25 by lfirmin #+# #+# */ +/* Updated: 2025/10/08 16:25:42 by lfirmin ### ########.fr */ +/* */ +/* ************************************************************************** */ +#include "cub.h" + +// void print_int_array(int *array, int size) +// { +// int i; + +// if (!array) +// return ; +// i = 0; +// while (i < size) +// { +// ft_putnbr_fd(array[i], 1); +// if (i < size - 1) +// write(1, ", ", 2); +// i++; +// } +// write(1, "\n", 1); +// } +// void debug(t_data data) +// { +// printf("map:\n\n"); +// print_array(data.map); +// printf("\n"); +// printf("c: "); +// fflush(stdout); +// print_int_array(data.texture->ceiling, 3); +// printf("f: "); +// fflush(stdout); +// print_int_array(data.texture->floor, 3); +// printf("p: "); +// fflush(stdout); +// print_int_array(data.parsing.player, 3); +// printf("\n"); +// printf("\ntexture:\n\n"); +// printf("%s\n", data.texture->east); +// printf("%s\n", data.texture->north); +// printf("%s\n", data.texture->west); +// printf("%s\n", data.texture->south); +// } + +// int main(int ac, char **av) +// { +// t_data data; + +// init_data(&data, av[1]); +// if (parsing(&data)); +// debug(data); +// free_char_array(data.parsing.raw_map); +// free_textures(data.texture); +// free_data(&data); +// } + +int rgb_to_int(int r, int g, int b) +{ + if (r < 0) r = 0; + if (r > 255) r = 255; + if (g < 0) g = 0; + if (g > 255) g = 255; + if (b < 0) b = 0; + if (b > 255) b = 255; + return ((r << 16) | (g << 8) | b); +} + +static int world_init_from_parsing(t_world *world, t_data *data) +{ + int y; + + world->h = 0; + while (data->map[world->h]) + world->h++; + world->w = ft_strlen(data->map[0]); + + world->grid = malloc(sizeof(char *) * (world->h + 1)); + if (!world->grid) + return (1); + y = 0; + while (y < world->h) + { + world->grid[y] = ft_strdup(data->map[y]); + if (!world->grid[y]) + return (1); + y++; + } + world->grid[world->h] = NULL; + return (0); +} + + +// int main(int ac, char **av) +// { +// t_game g; +// t_data data; + +// if (ac != 2) +// return (printf("Usage: ./cub3d \n"), 1); + +// init_data(&data, av[1]); +// if (parsing(&data)) +// return (printf("Parsing error\n"), 1); +// free_char_array(data.parsing.raw_map); + +// /* init couleurs et textures */ +// g.colors.floor = rgb_to_int(data.texture->floor[0], data.texture->floor[1], data.texture->floor[2]); // ok jai change le fonction rgb_to_int elle attend 3 int le r le g et le b +// g.colors.ceil = rgb_to_int(data.texture->ceiling[0], data.texture->ceiling[1], data.texture->ceiling[2]); +// if (textures_load(&g, +// data.texture->north, data.texture->south, +// data.texture->west, data.texture->east) != 0) +// g.has_tex = 0; + +// /* init map et player */ +// if (world_init_from_parsing(&g.world, &data) != 0) +// return (printf("World init failed\n"), 1); +// double dx = 0, dy = 0; +// if (data.parsing.player[2] == 'N') dy = -1; +// if (data.parsing.player[2] == 'S') dy = 1; +// if (data.parsing.player[2] == 'E') dx = 1; +// if (data.parsing.player[2] == 'W') dx = -1; +// player_init(&g, +// data.parsing.player[0] + 0.5, +// data.parsing.player[1] + 0.5, +// dx, dy); + +// /* window + loop */ +// if (init_window(&g, 1024, 768, "cub3D") != 0) +// return (1); +// setup_hooks(&g); +// mlx_loop(g.gfx.mlx); + +// world_free(&g.world); +// free_data(&data); +// return (0); +// } + +int main(int ac, char **av) +{ + t_game g; + t_data data; + + if (ac != 2) + return (printf("Usage: ./cub3d \n"), 1); + + memset(&g, 0, sizeof(t_game)); // IMPORTANT : initialiser g + + init_data(&data, av[1]); + if (parsing(&data)) + { + free_textures(data.texture); + free_data(&data); + return (1); + } + + /* init couleurs */ + g.colors.floor = rgb_to_int(data.texture->floor[0], data.texture->floor[1], data.texture->floor[2]); + g.colors.ceil = rgb_to_int(data.texture->ceiling[0], data.texture->ceiling[1], data.texture->ceiling[2]); + + /* init map et player */ + if (world_init_from_parsing(&g.world, &data) != 0) + return (printf("World init failed\n"), 1); + /* Libérer data->map après la duplication vers world->grid */ + free_char_array(data.map); + data.map = NULL; + + double dx = 0, dy = 0; + if (data.parsing.player[2] == 'S') dy = -1; + if (data.parsing.player[2] == 'N') dy = 1; + if (data.parsing.player[2] == 'E') dx = 1; + if (data.parsing.player[2] == 'W') dx = -1; + player_init(&g, + data.parsing.player[0] + 0.5, + data.parsing.player[1] + 0.5, + dx, dy); + + /* window AVANT textures ! */ + if (init_window(&g, 1024, 768, "cub3D") != 0) + return (1); + + /* MAINTENANT on charge les textures */ + if (textures_load(&g, + data.texture->north, data.texture->south, + data.texture->west, data.texture->east) != 0) + g.has_tex = 0; + + /* Passer data à g pour le cleanup */ + g.data = &data; + + setup_hooks(&g); + /* Vider le buffer gnl avant de rentrer dans mlx_loop */ + get_next_line(-2); + mlx_loop(g.gfx.mlx); + + world_free(&g.world); + free_textures(data.texture); + free_data(&data); + + return (0); +} \ No newline at end of file diff --git a/srcs/parsing/check_colors.c b/srcs/parsing/check_colors.c new file mode 100644 index 0000000..97a04a8 --- /dev/null +++ b/srcs/parsing/check_colors.c @@ -0,0 +1,35 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* check_colors.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: lfirmin +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2025/08/25 18:41:26 by lfirmin #+# #+# */ +/* Updated: 2025/10/07 10:06:32 by lfirmin ### ########.fr */ +/* */ +/* ************************************************************************** */ +#include "cub.h" + +int check_colors(t_textures *texture) +{ + if (is_rgb(texture->floor)) + return (ft_error(ERROR_COL), 1); + if (is_rgb(texture->ceiling)) + return (ft_error(ERROR_COL), 1); + return (0); +} + +int is_rgb(int color[3]) +{ + int i; + + i = 0; + while (i < 3) + { + if (color[i] > 255 || color[i] < 0) + return (1); + i++; + } + return (0); +} diff --git a/srcs/parsing/check_file.c b/srcs/parsing/check_file.c new file mode 100644 index 0000000..5022033 --- /dev/null +++ b/srcs/parsing/check_file.c @@ -0,0 +1,40 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* check_file.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: lfirmin +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2025/08/22 15:07:29 by lfirmin #+# #+# */ +/* Updated: 2025/10/07 10:11:50 by lfirmin ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "cub.h" + +int check_file(char *map_path, t_data_parsing *parsing) +{ + if (!map_path) + return (ft_error(ERROR_EMPT_PATH), 1); + if (check_extension(map_path)) + return (1); + parsing->fd_map = open(map_path, O_RDONLY); + if (parsing->fd_map < 0) + return (perror("Error\n"), 1); + parsing->fd_map_dup = open(map_path, O_RDONLY); + if (parsing->fd_map_dup < 0) + return (perror("Error\n"), 1); + return (0); +} + +int check_extension(char *map_path) +{ + int len_map_path; + + len_map_path = ft_strlen(map_path); + if (len_map_path < 4) + return (ft_error(ERROR_EXT), 1); + if (ft_strcmp(map_path + len_map_path - 4, ".cub") != 0) + return (ft_error(ERROR_EXT), 1); + return (0); +} diff --git a/srcs/parsing/check_map.c b/srcs/parsing/check_map.c new file mode 100644 index 0000000..ea6065d --- /dev/null +++ b/srcs/parsing/check_map.c @@ -0,0 +1,129 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* check_map.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: lfirmin +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2025/08/22 15:07:29 by lfirmin #+# #+# */ +/* Updated: 2025/10/07 10:11:50 by lfirmin ### ########.fr */ +/* */ +/* ************************************************************************** */ +#include "cub.h" + +int check_char_and_count(char c, int *p) +{ + if (c == '1' || c == '0' || c == ' ' || c == '\n') + return (0); + else if (c == 'S' || c == 'N' || c == 'E' || c == 'W') + { + (*p)++; + return (0); + } + else + return (2); +} + +int check_map_char(char **map) +{ + int i; + int j; + int p; + int ret; + + i = 0; + p = 0; + while (map[i]) + { + j = 0; + while (map[i][j]) + { + ret = check_char_and_count(map[i][j], &p); + if (ret != 0) + return (ret); + j++; + } + i++; + } + if (p != 1) + return (1); + return (0); +} + +void find_player_pos(char **map, int *player) +{ + int i; + int j; + + i = 0; + while (map[i]) + { + j = 0; + while (map[i][j]) + { + if (map[i][j] == 'S' || map[i][j] == 'N' || + map[i][j] == 'E' || map[i][j] == 'W') + { + player[0] = j; + player[1] = i; + player[2] = map[i][j]; + return ; + } + j++; + } + i++; + } +} + +int flood_fill(char **map_cp, int x, int y) +{ + if (!map_cp || y < 0 || x < 0 || !map_cp[y] || !map_cp[y][x]) + return (1); + if (map_cp[y][x] == 'v') + return (0); + if (map_cp[y][x] == '1') + { + map_cp[y][x] = 'v'; + return (0); + } + if (map_cp[y][x] == '0' || map_cp[y][x] == 'N' || map_cp[y][x] == 'S' + || map_cp[y][x] == 'E' || map_cp[y][x] == 'W') + { + map_cp[y][x] = 'v'; + if (flood_fill(map_cp, x + 1, y)) + return (1); + if (flood_fill(map_cp, x - 1, y)) + return (1); + if (flood_fill(map_cp, x, y + 1)) + return (1); + if (flood_fill(map_cp, x, y - 1)) + return (1); + return (0); + } + return (1); +} + +int rep_ex_wall(char **map_cp, int x, int y) +{ + int len; + + len = 0; + if (y < 0 || x < 0) + return (0); + if (!map_cp[y]) + return (0); + len = ft_strlen(map_cp[y]); + if (x >= (int)len) + return (0); + if (map_cp[y][x] == '1') + map_cp[y][x] = 'v'; + if (map_cp[y][x] == 'v') + { + map_cp[y][x] = 'c'; + rep_ex_wall(map_cp, x + 1, y); + rep_ex_wall(map_cp, x - 1, y); + rep_ex_wall(map_cp, x, y + 1); + rep_ex_wall(map_cp, x, y - 1); + } + return (0); +} diff --git a/srcs/parsing/check_map_2.c b/srcs/parsing/check_map_2.c new file mode 100644 index 0000000..b4de039 --- /dev/null +++ b/srcs/parsing/check_map_2.c @@ -0,0 +1,54 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* check_map_2.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: lfirmin +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2025/08/22 15:07:29 by lfirmin #+# #+# */ +/* Updated: 2025/10/07 12:09:03 by lfirmin ### ########.fr */ +/* */ +/* ************************************************************************** */ +#include "cub.h" + +int hasinvalidchar(char **map) +{ + int y; + int x; + + y = 0; + while (map[y]) + { + x = 0; + while (map[y][x]) + { + if (map[y][x] != 'c' && map[y][x] != ' ' && map[y][x] != ' ' + && map[y][x] != '\n') + return (1); + x++; + } + y++; + } + return (0); +} + +int validate_map(char **map, int *player) +{ + int result; + char **map_cp; + + map_cp = ft_arrcpy(map); + result = check_map_char(map); + if (result == 1) + return (free_char_array(map_cp), ft_error(ERROR_PLAYER), 1); + if (result == 2) + return (free_char_array(map_cp), ft_error(ERROR_CHAR), 1); + find_player_pos(map, player); + if (flood_fill(map_cp, player[0], player[1])) + return (free_char_array(map_cp), ft_error(ERROR_NOT_CLOSE), 1); + rep_ex_wall(map_cp, player[0], player[1]); + if (hasinvalidchar(map_cp)) + return (free_char_array(map_cp), ft_error(ERROR_CHAR), 1); + free_char_array(map_cp); + return (0); +} diff --git a/srcs/parsing/get_map.c b/srcs/parsing/get_map.c new file mode 100644 index 0000000..343214e --- /dev/null +++ b/srcs/parsing/get_map.c @@ -0,0 +1,64 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* get_map.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: lfirmin +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2025/08/23 13:29:28 by lfirmin #+# #+# */ +/* Updated: 2025/10/07 10:13:07 by lfirmin ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "cub.h" + +int get_map(t_data *data) +{ + int nb_line; + + nb_line = line_counter(data->parsing.fd_map); + if (nb_line <= 0) + return (ft_error(ERROR_EMPTY), 1); + data->parsing.raw_map = ft_calloc(nb_line + 1, sizeof(char *)); + if (put_map_on_array(data)) + { + free_char_array(data->parsing.raw_map); + return (1); + } + return (0); +} + +int line_counter(int fd) +{ + int nb_line; + char *line; + + line = NULL; + nb_line = 0; + line = get_next_line(fd); + while (line != NULL) + { + nb_line++; + free(line); + line = get_next_line(fd); + } + free(line); + line = get_next_line(-1); + while (line != NULL) + { + free(line); + line = get_next_line(-1); + } + get_next_line(-2); + return (nb_line); +} + +char *clean_line(char *raw_line) +{ + char *cleaned; + + if (!raw_line) + return (NULL); + cleaned = ft_strtrim(raw_line, " \t\n\r"); + return (cleaned); +} diff --git a/srcs/parsing/get_map_2.c b/srcs/parsing/get_map_2.c new file mode 100644 index 0000000..4a0ffa8 --- /dev/null +++ b/srcs/parsing/get_map_2.c @@ -0,0 +1,77 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* check_map_2.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: lfirmin +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2025/08/22 15:07:29 by lfirmin #+# #+# */ +/* Updated: 2025/10/07 10:11:50 by lfirmin ### ########.fr */ +/* */ +/* ************************************************************************** */ +#include "cub.h" + +static int process_config_line(char *line, t_data *data, int *j) +{ + char *cleaned; + + cleaned = clean_line(line); + if (get_texture_path(cleaned, data->texture, j)) + { + free(line); + free(cleaned); + return (1); + } + free(cleaned); + return (0); +} + +static void flush_remaining_lines(int fd) +{ + char *line; + + line = get_next_line(fd); + while (line != NULL) + { + free(line); + line = get_next_line(fd); + } +} + +static int handle_line(char *line, t_data *data, int *i, int *j) +{ + if (is_config_line(line)) + { + if (process_config_line(line, data, j)) + { + flush_remaining_lines(-1); + return (1); + } + free(line); + } + else if (is_empty_line(line) && *i == 0) + free(line); + else + data->parsing.raw_map[(*i)++] = line; + return (0); +} + +int put_map_on_array(t_data *data) +{ + char *line; + int i; + int j[6]; + + ft_memset(j, 0, sizeof(j)); + i = 0; + line = get_next_line(data->parsing.fd_map_dup); + while (line != NULL) + { + if (handle_line(line, data, &i, j)) + return (1); + line = get_next_line(data->parsing.fd_map_dup); + } + data->parsing.raw_map[i] = NULL; + get_next_line(-2); + return (0); +} diff --git a/srcs/parsing/get_textures.c b/srcs/parsing/get_textures.c new file mode 100644 index 0000000..55b68a5 --- /dev/null +++ b/srcs/parsing/get_textures.c @@ -0,0 +1,91 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* get_textures.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: lfirmin +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2025/08/24 12:37:11 by lfirmin #+# #+# */ +/* Updated: 2025/10/07 10:13:41 by lfirmin ### ########.fr */ +/* */ +/* ************************************************************************** */ +#include "cub.h" + +int get_texture_path(char *line, t_textures *texture, int *j) +{ + if (check_extension_2(line) && !is_color_line(line)) + return (ft_error(ERROR_NOT_XMP), 1); + else if (is_texture_line(line) == 1 && j[0]++ == 0) + texture->north = ft_strtrim(line + 2, " \t\n\r"); + else if (is_texture_line(line) == 2 && j[1]++ == 0) + texture->south = ft_strtrim(line + 2, " \t\n\r"); + else if (is_texture_line(line) == 3 && j[2]++ == 0) + texture->west = ft_strtrim(line + 2, " \t\n\r"); + else if (is_texture_line(line) == 4 && j[3]++ == 0) + texture->east = ft_strtrim(line + 2, " \t\n\r"); + else if (is_color_line(line) == 1 && j[4]++ == 0) + get_rgb_values(line, texture->floor); + else if (is_color_line(line) == 2 && j[5]++ == 0) + get_rgb_values(line, texture->ceiling); + else + return (ft_error(ERROR_DOUBLE), 2); + return (0); +} + +int is_valid_number(char *str) +{ + int i; + + if (!str || !*str) + return (0); + i = 0; + while (str[i] == ' ' || str[i] == '\t') + i++; + if (!str[i] || !(str[i] >= '0' && str[i] <= '9')) + return (0); + while (str[i] >= '0' && str[i] <= '9') + i++; + while (str[i] == ' ' || str[i] == '\t') + i++; + if (str[i] != '\0') + return (0); + return (1); +} + +int validate_and_convert_rgb(char **parts, int rgb[3]) +{ + int i; + + i = -1; + while (++i < 3) + { + if (!is_valid_number(parts[i])) + return (free_char_array(parts), 1); + rgb[i] = ft_atoi(parts[i]); + if (rgb[i] < 0 || rgb[i] > 255) + return (free_char_array(parts), 1); + } + return (free_char_array(parts), 0); +} + +int get_rgb_values(char *line, int rgb[3]) +{ + char *start; + char **parts; + int i; + + if (!line || !rgb) + return (1); + start = ft_strchr(line, ' '); + if (!start) + return (1); + parts = ft_split(start + 1, ','); + if (!parts) + return (1); + i = 0; + while (parts[i]) + i++; + if (i != 3) + return (free_char_array(parts), 1); + return (validate_and_convert_rgb(parts, rgb)); +} diff --git a/srcs/parsing/init_parsing.c b/srcs/parsing/init_parsing.c new file mode 100644 index 0000000..b899b24 --- /dev/null +++ b/srcs/parsing/init_parsing.c @@ -0,0 +1,56 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* init_parsing.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: lfirmin +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2025/08/23 13:33:00 by lfirmin #+# #+# */ +/* Updated: 2025/10/07 10:14:37 by lfirmin ### ########.fr */ +/* */ +/* ************************************************************************** */ +#include "cub.h" + +int init_parsing(t_data_parsing *parsing) +{ + if (!parsing) + return (ft_error(ERROR_INIT_PARS), 1); + parsing->fd_map = 0; + parsing->raw_map = NULL; + return (0); +} + +int init_textures(t_textures *textures) +{ + int i; + + if (!textures) + return (ft_error(ERROR_INIT_TEX), 1); + textures->north = NULL; + textures->south = NULL; + textures->east = NULL; + textures->west = NULL; + i = 0; + while (i < 3) + { + textures->floor[i] = -1; + textures->ceiling[i] = -1; + i++; + } + return (0); +} + +int free_textures(t_textures *textures) +{ + if (!textures) + return (0); + if (textures->north) + free(textures->north); + if (textures->south) + free(textures->south); + if (textures->east) + free(textures->east); + if (textures->west) + free(textures->west); + return (0); +} diff --git a/srcs/parsing/line_detect.c b/srcs/parsing/line_detect.c new file mode 100644 index 0000000..a76b055 --- /dev/null +++ b/srcs/parsing/line_detect.c @@ -0,0 +1,104 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* line_detect.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: lfirmin +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2025/08/24 11:58:39 by lfirmin #+# #+# */ +/* Updated: 2025/10/08 14:05:47 by lfirmin ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "cub.h" + +int check_extension_2(char *str) +{ + size_t len; + + len = strlen(str); + if (len < 4) + return (1); + return (ft_strcmp(str + len - 4, ".xpm")); +} + +int is_config_line(char *line) +{ + char *trimmed; + int result; + + result = 0; + if (!line) + return (0); + trimmed = ft_strtrim(line, " \t\n\r"); + if (!trimmed) + return (0); + if (ft_strncmp(trimmed, "NO ", 3) == 0 + || ft_strncmp(trimmed, "SO ", 3) == 0 + || ft_strncmp(trimmed, "WE ", 3) == 0 + || ft_strncmp(trimmed, "EA ", 3) == 0 + || ft_strncmp(trimmed, "F ", 2) == 0 + || ft_strncmp(trimmed, "C ", 2) == 0) + result = 1; + free(trimmed); + return (result); +} + +int is_empty_line(char *line) +{ + int i; + + i = 0; + if (!line) + return (1); + while (line[i]) + { + if (line[i] != ' ' && line[i] != '\t' + && line[i] != '\n' && line[i] != '\r') + return (0); + i++; + } + return (1); +} + +int is_color_line(char *line) +{ + char *trimmed; + int result; + + result = 0; + if (!line) + return (0); + trimmed = ft_strtrim(line, " \t\n\r"); + if (!trimmed) + return (0); + if (ft_strncmp(trimmed, "F ", 2) == 0) + result = 1; + else if (ft_strncmp(trimmed, "C ", 2) == 0) + result = 2; + free(trimmed); + return (result); +} + +int is_texture_line(char *line) +{ + char *trimmed; + int result; + + result = 0; + if (!line) + return (0); + trimmed = ft_strtrim(line, " \t\n\r"); + if (!trimmed) + return (0); + if (ft_strncmp(trimmed, "NO ", 3) == 0) + result = 1; + else if (ft_strncmp(trimmed, "SO ", 3) == 0) + result = 2; + else if (ft_strncmp(trimmed, "WE ", 3) == 0) + result = 3; + else if (ft_strncmp(trimmed, "EA ", 3) == 0) + result = 4; + free(trimmed); + return (result); +} diff --git a/srcs/parsing/parsing.c b/srcs/parsing/parsing.c new file mode 100644 index 0000000..11d84ef --- /dev/null +++ b/srcs/parsing/parsing.c @@ -0,0 +1,62 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* parsing.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: lfirmin +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2025/08/22 14:17:58 by lfirmin #+# #+# */ +/* Updated: 2025/10/26 02:10:59 by lfirmin ### ########.fr */ +/* */ +/* ************************************************************************** */ +#include "cub.h" + +int check_xpm_file(char *filepath) +{ + int fd; + + if (!filepath) + return (1); + fd = open(filepath, O_RDONLY); + if (fd == -1) + return (1); + close(fd); + return (0); +} + +int check_texture_file(t_textures *texture) +{ + if (check_xpm_file(texture->north)) + return (ft_error(ERR_I_N), 1); + if (check_xpm_file(texture->south)) + return (ft_error(ERR_I_S), 1); + if (check_xpm_file(texture->east)) + return (ft_error(ERR_I_E), 1); + if (check_xpm_file(texture->west)) + return (ft_error(ERR_I_W), 1); + return (0); +} + +int parsing(t_data *data) +{ + if (check_file(data->map_path, &data->parsing) == 1) + return (1); + if (get_map(data)) + { + close(data->parsing.fd_map); + close(data->parsing.fd_map_dup); + return (1); + } + close(data->parsing.fd_map); + close(data->parsing.fd_map_dup); + get_next_line(-2); + if (check_colors(data->texture) == 1) + return (free_char_array(data->parsing.raw_map), 1); + if (check_texture_file(data->texture) == 1) + return (free_char_array(data->parsing.raw_map), 1); + if (validate_map(data->parsing.raw_map, data->parsing.player)) + return (free_char_array(data->parsing.raw_map), 1); + data->map = data->parsing.raw_map; + data->parsing.raw_map = NULL; + return (0); +} diff --git a/srcs/utils/init.c b/srcs/utils/init.c new file mode 100644 index 0000000..77d21fd --- /dev/null +++ b/srcs/utils/init.c @@ -0,0 +1,35 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* init.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: lfirmin +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2025/08/22 18:57:21 by lfirmin #+# #+# */ +/* Updated: 2025/10/08 16:21:46 by lfirmin ### ########.fr */ +/* */ +/* ************************************************************************** */ +#include "cub.h" + +int init_data(t_data *data, char *path) +{ + if (!data) + return (ft_error(ERROR_INIT_DATA), 1); + data->texture = malloc(sizeof(t_textures)); + if (!data->texture) + return (ft_error(ERROR_INIT_TEX), 1); + init_parsing(&data->parsing); + init_textures(data->texture); + data->map = NULL; + data->map_path = path; + return (0); +} + +void free_data(t_data *data) +{ + if (!data) + return ; + if (data->texture) + free(data->texture); + free_char_array(data->map); +} diff --git a/srcs/utils/utils.c b/srcs/utils/utils.c new file mode 100644 index 0000000..1ec6fcd --- /dev/null +++ b/srcs/utils/utils.c @@ -0,0 +1,70 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* utils.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: lfirmin +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2025/08/22 14:56:25 by lfirmin #+# #+# */ +/* Updated: 2025/10/07 12:14:42 by lfirmin ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "cub.h" + +void ft_error(char *message) +{ + int len; + + len = 0; + while (message[len]) + len++; + write(2, ERROR_PREFIX, 6); + write(2, message, len); + write(2, "\n", 1); +} + +void free_char_array(char **array) +{ + int i; + + if (!array) + return ; + i = 0; + while (array[i]) + free(array[i++]); + free(array); +} + +int ft_arrlen(char **arr) +{ + int i; + + while (arr[i]) + i++; + return (i); +} + +void print_array(char **array) +{ + int i; + + i = 0; + if (!array) + return ; + while (array[i]) + { + printf("%s", array[i]); + i++; + } +} + +int ft_strlen_2d(char **str) +{ + int i; + + i = 0; + while (str[i]) + ++i; + return (i); +} diff --git a/utils.c b/utils.c deleted file mode 100644 index 200e699..0000000 --- a/utils.c +++ /dev/null @@ -1,15 +0,0 @@ -// utils.c -#include "cub3d.h" - -void put_pixel(t_img *img, int x, int y, int color) { - if (x < 0 || x >= WIN_W || y < 0 || y >= WIN_H) return; - char *dst = img->addr + (y * img->line_len + x * (img->bpp / 8)); - *(unsigned int*)dst = (unsigned int)color; -} - -int get_tex_color(t_tex *t, int tx, int ty) { - if (tx < 0) tx = 0; if (tx >= t->w) tx = t->w - 1; - if (ty < 0) ty = 0; if (ty >= t->h) ty = t->h - 1; - char *p = t->img.addr + ty * t->img.line_len + tx * (t->img.bpp / 8); - return *(unsigned int*)p; -}