Log In  

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

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

P#134830 2023-09-24 09:23 ( Edited 2023-09-24 10:21)


[Please log in to post a comment]