Log In  


Cart #show_book_function-0 | 2023-09-24 | Code ▽ | Embed ▽ | License: CC4-BY-NC-SA
4

This is a function that draws a book with some custom content to the screen. My inspiration was morrowind and its plethora of books. All this function needs to work is an external,global page variable.

How to use:

  • copy this function to your code
  • declare a global page variable (that starts at -1, which is the cover page)
  • keep in mind that it resets camera() to print the book on screen regardless of the camera offset, so use it after you already printed you game with desired offset
  • add your book as a pair of title and a long content string like this: {"Title","Super long and cool content"}, to the books table
  • consider using P8SCII to achieve certain effects cheaply - it breaks the function in fun, weird ways
function show_book(title)
	camera()
	local given_title=title or "how to use show_book"
	local books={
			{"how to use show_book",
			"this book will teach you how to use the show_book function in pico-8. the show_book function takes a given title and displays the book content on the screen. you can use the⬅️ and ➡️buttons to turn the pages, and the 🅾️ button to exit the book. you can also add your own books to the books table, as long as they have a title and a content string. the function will automatically split the string into lines and pages, and draw the book cover and pages for you. you can also change some variables in the function, such as the maximum length of a line, the maximum number of lines per page, and the colors and positions of the book elements. to use the function, you need to call it with a title argument, like this: show_book ('how to use show_book'). have fun reading and writing books with pico-8!"
		 },
			}
		local function split_str(str,length)
			local max_length=length or 13
			local strings=split(str," ",false)
			local result={}
			local cur_str=""
				for i in all(strings) do
					if #cur_str+#i<max_length then
						if #cur_str!=0 then
						cur_str=cur_str.." "..i
						else
						cur_str=i
						end
					else
						add(result,cur_str)
						cur_str=i
					end
				end
			add(result,cur_str)
			return result
		end
		--end split_str

		local function draw_cover(tit)
			local title=split_str(tit,11)
			local line_nr=0
			rectfill(64,25,117,100,2)
			line(118,25,118,100,15)
			rect(66,27,115,98,15)
			for i in all(title) do
				line_nr+=1
				print(i,70,35+line_nr*6,15)
			end
		end--draw_cover_end
		local function give_book(tit)
		local title=tit or "the hanging tree"
			local book_lines={}
			local lib={}
			local ret={}
			--lookup the book and split
			--the strings
			for i in all(books) do
				if i[1]==title then
					book_lines=split_str(i[2])
				end
			end	
			for i in all(book_lines) do 
				add(lib,i)
				if #lib==10 then
					add(ret,lib)
					lib={}
				end
			end
			if(#lib!=0)add(ret,lib)
			return ret
		--
		end--give_book end

		local content=give_book(given_title)
		--dislay background
		fillp(▒)
		rectfill(0,0,127,127,0)
		fillp()
		if page>0 then
			--draw the book itself
			rectfill(10,25,117,100,7)
			line(10,24,118,24,2)
			line(118,25,118,100,15)
			line(64,25,64,100,15)
			--page numbers
			print(page,64-print(page,0,-1000),95,4)
			print(page+1,66,95,4)
			--print left page
			trash=0
				for i in all(content[page]) do
					trash+=1
					print(i,12,24+trash*6,13)	
				end
			if#content+1>=page then
				--print right page
				trash=0
				for i in all(content[page+1]) do
					trash+=1
					print(i,66,24+trash*6,13)	
				end
			end
		elseif page==-1 then
			--draw the book cover
			draw_cover(given_title)
		end	
		--controls
		print("🅾️",111,115,4)
		if page+1<#content then
			print("➡️",111,95,4)
			if(btnp(➡️))page+=2
		end
		if page>-1 then
			print("⬅️",11,95,4)
			if(btnp(⬅️))page-=2		
		end
end

401 tokens

4



[Please log in to post a comment]