Paste #40383: Edit of P#40381 A Calculator - simple, and gui

Date: 2017/03/01 06:38:06 UTC-08:00
Type: Denizen Script

View Raw Paste Download This Paste
Copy Link


#############################
# simple GUI Calculator
# scripted by dr_lennon
# 2017/3/1
# version 1.0
# special thanks to mcmonkey, blackcoyote, anthony, and Other Dev.
#############################

easy_command_inv_calculator:
    type: inventory
    title: "GUI - calculator"
    size: 54
    definitions:
        b: i@eci_blank
        d1: i@eci_calculator_number_button[display_name=<&9>1;quantity=1]
        d2: i@eci_calculator_number_button[display_name=<&9>2;quantity=2]
        d3: i@eci_calculator_number_button[display_name=<&9>3;quantity=3]
        d4: i@eci_calculator_number_button[display_name=<&9>4;quantity=4]
        d5: i@eci_calculator_number_button[display_name=<&9>5;quantity=5]
        d6: i@eci_calculator_number_button[display_name=<&9>6;quantity=6]
        d7: i@eci_calculator_number_button[display_name=<&9>7;quantity=7]
        d8: i@eci_calculator_number_button[display_name=<&9>8;quantity=8]
        d9: i@eci_calculator_number_button[display_name=<&9>9;quantity=9]
        d0: i@eci_calculator_number_button_0[display_name=<&9>0]
        d00: i@eci_calculator_number_button_0[display_name=<&9>00]
        dot: i@eci_calculator_number_button_dot
        ac: i@eci_calculator_ac
        c: i@eci_calculator_c
        confirm: i@eci_calculator_confirm[lore=<&6>result :<&b><player.flag[eci_calc_display_value]||0>]
        equal: i@eci_calculator_equal[display_name=<&a>=;base_color=red;patterns=li@white/stripe_top|white/stripe_bottom|white/stripe_middle]
        plus: i@eci_calculator_operation[display_name=<&a>+;base_color=white;patterns=li@red/stripe_middle|red/stripe_center]
        minus: i@eci_calculator_operation[display_name=<&a>-;base_color=white;patterns=li@red/stripe_middle]
        multiply: i@eci_calculator_operation[display_name=<&a>÷;base_color=white;patterns=li@red/stripe_downleft]
        divide: i@eci_calculator_operation[display_name=<&a>X;base_color=white;patterns=li@red/cross]
        mr: i@eci_calculator_memory[display_name=<&9>MR;lore=<&6>memory - <&b><player.flag[eci_calc_memory_value]||0>]
        mc: i@eci_calculator_memory[display_name=<&9>MC]
        m+: i@eci_calculator_memory[display_name=<&9>M+]
        m-: i@eci_calculator_memory[display_name=<&9>M-]
        display1: i@eci_calculator_display[display_name=<&6>1;base_color=white;patterns=li@BLACK/SQUARE_TOP_LEFT|WHITE/BORDER|BLACK/STRIPE_CENTER]
        display2: i@eci_calculator_display[display_name=&62;base_color=white;patterns=li@BLACK/STRIPE_TOP|WHITE/RHOMBUS_MIDDLE|BLACK/STRIPE_DOWNLEFT|BLACK/STRIPE_BOTTOM|WHITE/BORDER]
        display3: i@eci_calculator_display[display_name=&63;base_color=white;patterns=li@BLACK/STRIPE_MIDDLE|WHITE/STRIPE_LEFT|BLACK/STRIPE_BOTTOM|BLACK/STRIPE_RIGHT|BLACK/STRIPE_TOP|WHITE/BORDER]
        display4: i@eci_calculator_display[display_name=&64;base_color=BLACK;patterns=li@WHITE/HALF_HORIZONTAL|BLACK/STRIPE_LEFT|WHITE/STRIPE_BOTTOM|BLACK/STRIPE_RIGHT|BLACK/STRIPE_MIDDLE|WHITE/BORDER]
        display5: i@eci_calculator_display[display_name=&65;base_color=white;patterns=li@BLACK/STRIPE_BOTTOM|BLACK/STRIPE_DOWNRIGHT|WHITE/CURLY_BORDER|BLACK/SQUARE_BOTTOM_LEFT|BLACK/STRIPE_TOP|WHITE/BORDER]
        display6: i@eci_calculator_display[display_name=&66;base_color=BLACK;patterns=li@WHITE/HALF_HORIZONTAL_MIRROR|BLACK/STRIPE_RIGHT|WHITE/STRIPE_TOP|BLACK/STRIPE_BOTTOM|BLACK/STRIPE_LEFT|WHITE/BORDER]
        display7: i@eci_calculator_display[display_name=&67;base_color=white;patterns=li@BLACK/STRIPE_TOP|WHITE/DIAGONAL_RIGHT|BLACK/STRIPE_DOWNLEFT|BLACK/SQUARE_BOTTOM_LEFT|WHITE/BORDER]
        display8: i@eci_calculator_display[display_name=&68;base_color=BLACK;patterns=li@WHITE/STRIPE_CENTER|BLACK/STRIPE_BOTTOM|BLACK/STRIPE_TOP|BLACK/STRIPE_MIDDLE|WHITE/BORDER]
        display9: i@eci_calculator_display[display_name=9;base_color=BLACK;patterns=li@WHITE/HALF_HORIZONTAL|BLACK/STRIPE_LEFT|WHITE/STRIPE_BOTTOM|BLACK/STRIPE_TOP|BLACK/STRIPE_RIGHT|WHITE/BORDER]
        display0: i@eci_calculator_display[display_name=0;base_color=white;patterns=li@BLACK/STRIPE_TOP|BLACK/STRIPE_BOTTOM|BLACK/STRIPE_RIGHT|BLACK/STRIPE_LEFT|WHITE/BORDER]
        displaydot: i@eci_calculator_display[display_name=dot;base_color=white;patterns=li@BLACK/SQUARE_BOTTOM_LEFT|WHITE/BORDER]
        displaydash: i@eci_calculator_display[display_name=-;base_color=white;patterns=li@BLACK/stripe_middle]

    procedural items:
        - define list li@
        - if <player.flag[eci_calc_display_value].mod[1]> > 0 {
            - define display <player.flag[eci_calc_display_value].round_to[2].to_list> }
        else {
            - define display <player.flag[eci_calc_display_value].to_list> }
        - define blank_digit <def[b]>
        - define redual_digit <el@9.sub[<def[display].size||li@>].max[0]>
        - repeat <def[redual_digit]> {
            - define list <def[list].include[<def[blank_digit]>]> }

        - foreach <def[display]> {
            - if <def[value]> = <el@-> {
                - define list <def[list].include[<def[displaydash]>]> }
            - if <def[value]> = <&dot> {
                - define list <def[list].include[<def[displaydot]>]> }
            else {
                - define number display<def[value]>
                - define list <def[list].include[<def[<def[number]>]>]> }
        }
        - determine <def[list]> 

    slots: 
        - "[b] [b] [b] [b] [eci_message] [b] [b] [b] [b]"
        - "[b] [mr] [b] [d1] [d2] [d3] [plus] [b] [b]"
        - "[b] [m+] [ac] [d4] [d5] [d6] [minus] [b] [b]"
        - "[b] [m-] [c] [d7] [d8] [d9] [multiply] [confirm] [b]"
        - "[b] [mc] [d00] [d0] [dot] [equal] [divide] [b] [b]"
        - "[] [] [] [] [] [] [] [] []"

## flag clear task
easy_command_inv_calculator_clear_task:
    type: task
    script:
    - ^flag player eci_calc_buffer_value:!
    - ^flag player eci_calc_result_value:!
    - ^flag player eci_calc_oper_value:!
    - ^flag player eci_calc_equal_value:!
    - ^flag player eci_calc_memory_value:!
    - ^flag player eci_calc_dot_position:0
    - ^flag player eci_calc_display_value:!

## calculator handler
easy_command_inv_calculator_handler:
    type: world
    events:

        on player clicks in easy_command_inv_calculator:
        - determine cancelled
        on player drags in easy_command_inv_calculator:
        - determine cancelled

        on player clicks eci_calculator_confirm in easy_command_inv_calculator:
        - narrate "<&6>result : <&b><player.flag[eci_calc_display_value]>"
        - ~run easy_command_inv_calculator_clear_task
        - inventory close


        #clicks 1-9
        on player clicks eci_calculator_number_button in easy_command_inv_calculator:
        - if <player.flag[eci_calc_equal_value]||null> == true {
            - flag player eci_calc_result_value:!
            - flag player eci_calc_equal_value:! }

        - define initial <player.flag[eci_calc_buffer_value]||0>
        ## point below
        - if <player.flag[eci_calc_dot_position]||0> > 0 {
            - define belowdot <el@10.power[<player.flag[eci_calc_dot_position]>]>
            - define digitadd <def[initial].mul[<def[belowdot]>].add[<context.item.quantity>].div[<def[belowdot]>].round_to[6]>
            - flag player eci_calc_dot_position:+:1 }
        else {
            - define digitadd <def[initial].mul[10].add[<context.item.quantity>]> }

        - flag player eci_calc_buffer_value:<def[digitadd]>
        - flag player eci_calc_display_value:<player.flag[eci_calc_buffer_value]>

        - inventory open d:in@easy_command_inv_calculator

        #0 or 00
        on player clicks eci_calculator_number_button_0 in easy_command_inv_calculator:
        - if <player.flag[eci_calc_equal_value]||null> == true {
            - flag player eci_calc_result_value:!
            - flag player eci_calc_equal_value:! }
        - define initial <player.flag[eci_calc_buffer_value]||0>
        - choose <context.item.display>:
            - case "<&9>0":
                - if <player.flag[eci_calc_dot_position]||0> > 0 {
                    - flag player eci_calc_dot_position:+:1
                    - queue clear }
                - define digitadd <def[initial].mul[10]>
            - case "<&9>00":
                - if <player.flag[eci_calc_dot_position]||0> > 0 {
                    - flag player eci_calc_dot_position:+:2
                    - queue clear }
                - define digitadd <def[initial].mul[100]>
        - flag player eci_calc_buffer_value:<def[digitadd]>
        - flag player eci_calc_display_value:<player.flag[eci_calc_buffer_value]>

        - inventory open d:in@easy_command_inv_calculator

        ## dot
        on player clicks eci_calculator_number_button_dot in easy_command_inv_calculator:
        - if <player.flag[eci_calc_dot_position]> > 0 queue clear
        - flag player eci_calc_dot_position:1

        ## allclear
        on player clicks eci_calculator_ac in easy_command_inv_calculator:
        - ~run easy_command_inv_calculator_clear_task
        - inventory open d:in@easy_command_inv_calculator


        ### clear 
        on player clicks eci_calculator_c in easy_command_inv_calculator:
        - if  <player.flag[eci_calc_dot_position]||0> == 1 {
            - flag player eci_calc_dot_position:0
            - queue clear }
        else if <player.flag[eci_calc_dot_position]||0> >= 2 {
            - define belowdot <el@10.power[<player.flag[eci_calc_dot_position].sub[2]>]>
            - flag player eci_calc_buffer_value:<player.flag[eci_calc_buffer_value].mul[<def[belowdot]>].round_down.div[<def[belowdot]>]>
            - flag player eci_calc_dot_position:-:1
            - if <player.flag[eci_calc_dot_position]> == 1 flag player eci_calc_dot_position:0 }
        else {
            - flag player eci_calc_buffer_value:<player.flag[eci_calc_buffer_value].div[10].round_down> }

        - flag player eci_calc_display_value:<player.flag[eci_calc_buffer_value]>
        - inventory open d:in@easy_command_inv_calculator

        ## mr, mc, m+, m-
        on player clicks eci_calculator_memory in easy_command_inv_calculator:
        - choose <context.item.display>:
            - case "<&9>MR":
                - flag player eci_calc_buffer_value:<player.flag[eci_calc_memory_value]>
                - flag player eci_calc_display_value:<player.flag[eci_calc_memory_value]>
            - case "<&9>MC":
                - flag player eci_calc_memory_value:0
            - case "<&9>M+":
                - flag player eci_calc_memory_value:+:<player.flag[eci_calc_display_value]>
            - case "<&9>M-":
                - flag player eci_calc_memory_value:-:<player.flag[eci_calc_display_value]>
        - inventory open d:in@easy_command_inv_calculator

        # operator + - * /
        on player clicks eci_calculator_operation in easy_command_inv_calculator:
        - flag player eci_calc_dot_position:0
        - if <player.flag[eci_calc_equal_value]||null> == true {
            - flag player eci_calc_equal_value:! }
        - if <player.has_flag[eci_calc_result_value]> == true && <player.has_flag[eci_calc_oper_value]> == true && <player.has_flag[eci_calc_buffer_value]> == true {
            - if <player.flag[eci_calc_oper_value]> == <&a>+ {
                - flag player eci_calc_result_value:+:<player.flag[eci_calc_buffer_value]> }
            else if <player.flag[eci_calc_oper_value]> == <&a>- {
                - flag player eci_calc_result_value:-:<player.flag[eci_calc_buffer_value]> }
            else if <player.flag[eci_calc_oper_value]> == <&a>÷ {
                - flag player eci_calc_result_value:/:<player.flag[eci_calc_buffer_value]> }
            else if <player.flag[eci_calc_oper_value]> == <&a>X {
                - flag player eci_calc_result_value:*:<player.flag[eci_calc_buffer_value]> }
            - flag player eci_calc_buffer_value:!
            - flag player eci_calc_oper_value:<context.item.display>
            - flag player eci_calc_display_value:<player.flag[eci_calc_result_value]>
            - queue clear
        }
        - flag player eci_calc_oper_value:<context.item.display>
        - if <player.has_flag[eci_calc_buffer_value]> {
            - flag player eci_calc_result_value:<player.flag[eci_calc_buffer_value]>
            - flag player eci_calc_buffer_value:! }
        - inventory open d:in@easy_command_inv_calculator

        # = button
        on player clicks eci_calculator_equal in easy_command_inv_calculator:
        - flag player eci_calc_dot_position:0
        - choose <player.flag[eci_calc_oper_value]||0>:
            - case "0":
                - flag player eci_calc_result_value:<player.flag[eci_calc_buffer_value]>
            - case "<&a>+":
                - flag player eci_calc_result_value:+:<player.flag[eci_calc_buffer_value]>
            - case "<&a>-":
                - flag player eci_calc_result_value:-:<player.flag[eci_calc_buffer_value]>
            - case "<&a>÷":
                - flag player eci_calc_result_value:/:<player.flag[eci_calc_buffer_value]>
            - case "<&a>X":
                - flag player eci_calc_result_value:*:<player.flag[eci_calc_buffer_value]>
        - flag player eci_calc_buffer_value:!
        - flag player eci_calc_display_value:<player.flag[eci_calc_result_value]>
        - flag player eci_calc_equal_value:true
        - inventory open d:in@easy_command_inv_calculator

## press buttons
eci_blank:
    type: item
    Material: gray_stained_glass_pane
    display name: ' '
eci_message:
    type: item
    Material: workbench
    display name: '<&6>calculator'
eci_calculator_memory:
    type: item
    material: chest
eci_calculator_number_button_dot:
    type: item
    Material: ink
    display name: <&9>.
eci_calculator_number_button:
    type: item
    Material: lime_dye
eci_calculator_number_button_0:
    type: item
    Material: gray_dye
eci_calculator_display:
    type: item
    material: banner
eci_calculator_AC:
    type: item
    Material: bone_meal
    display name: <&c>AC
eci_calculator_C:
    type: item
    Material: light_gray_dye
    display name: <&c>C
eci_calculator_confirm:
    type: item
    Material: compass
    display name: <&a>print output
eci_calculator_operation:
    type: item
    Material: banner
eci_calculator_equal:
    type: item
    Material: banner


easy_command:
    type: command
    name: calc
    aliases:
    - c
    description: The calculator
    usage:
    - /calc - open your gui calculator
    script:
    - run easy_command_inv_calculator_clear_task instantly
    - inventory open d:in@easy_command_inv_calculator