Dimenticare

Some more inventory code

Jun 12th, 2017
384
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. /// @description Draw the inventory for one or more Characters.
  2. /// @param [secondary] (Optional) The second Solid to draw the inventory of
  3.  
  4. // Some placement variables
  5. var frame_width=320;
  6. var border_width=2;
  7. var frame_bottom=640;
  8. var text_y=frame_bottom+(720-frame_bottom)/3;
  9. var text_y_b=frame_bottom+(720-frame_bottom)*2/3;
  10.  
  11. // Create the required lists
  12. var list=ds_list_create();
  13. var list_int=ds_list_create();
  14. var list_owner=ds_list_create();
  15. var list_quantity=ds_list_create();
  16. if (argument_count==1&&argument[0]!=noone){
  17.     ds_list_add(list, argument[0].name);
  18.     ds_list_add(list_int, ItemClasses.no);
  19.     ds_list_add(list_owner, argument[0]);
  20.     ds_list_add(list_quantity, ds_list_size(argument[0].inventory));
  21.     var category=ItemClasses.no;
  22.     for (var i=0; i<ds_list_size(argument[0].inventory); i++){
  23.         var stack=argument[0].inventory[| i];
  24.         var new_category=World.all_items[argument[0].inventory[| i].index].class;
  25.         if (category!=new_category){
  26.             if (new_category==ItemClasses.misc){
  27.                 var add=" - "+string(GetGold(argument[0]))+" gold";
  28.             } else {
  29.                 var add="";
  30.             }
  31.             ds_list_add(list, TAB+World.item_class_names[new_category]+add);
  32.             ds_list_add(list_int, new_category);
  33.             ds_list_add(list_owner, argument[0]);
  34.             ds_list_add(list_quantity, 1);
  35.             category=new_category;
  36.         } else {
  37.             list_quantity[| ds_list_size(list_quantity)-1]++;
  38.         }
  39.     }
  40. }
  41.  
  42. ds_list_add(list, Player.name);
  43. ds_list_add(list_int, ItemClasses.no);
  44. ds_list_add(list_owner, Player);
  45. ds_list_add(list_quantity, ds_list_size(Player.inventory));
  46. var category=ItemClasses.no;
  47. for (var i=0; i<ds_list_size(Player.inventory); i++){
  48.     var new_category=World.all_items[Player.inventory[| i].index].class;
  49.     if (category!=new_category){
  50.         if (new_category==ItemClasses.misc){
  51.             var add=" - "+string(GetGold(Player))+" gold";
  52.         } else {
  53.             var add="";
  54.         }
  55.         ds_list_add(list, TAB+World.item_class_names[new_category]+add);
  56.         ds_list_add(list_int, new_category);
  57.         ds_list_add(list_owner, Player);
  58.         ds_list_add(list_quantity, 1);
  59.         category=new_category;
  60.     } else {
  61.         list_quantity[| ds_list_size(list_quantity)-1]++;
  62.     }
  63. }
  64.  
  65. for (var i=0; i<ds_list_size(list); i++){
  66.     if (list_owner[| i]==pause_inventory_temp_owner&&list[| i]==pause_inventory_temp_category){
  67.         pause_greater_position=i;
  68.         pause_inventory_temp_owner=noone;
  69.         pause_inventory_temp_category=-1;
  70.         break;
  71.     }
  72. }
  73.    
  74.  
  75. pause_greater_position=min(pause_greater_position, ds_list_size(list)-1);
  76.  
  77. // Draw the category frame
  78. draw_set_alpha(pause_base_alpha);
  79. draw_set_color(c_black);
  80. draw_rectangle(0+pause_menu_offset, 0, frame_width+pause_menu_offset, 720, false);
  81. draw_rectangle(0, frame_bottom, 1280, 720, false);
  82. draw_set_alpha(1);
  83. draw_line_width(frame_width+pause_menu_offset, 0, frame_width+pause_menu_offset, 720, border_width);
  84. draw_line_width(0, frame_bottom, 1280, frame_bottom, border_width);
  85.  
  86. draw_set_halign(fa_left);
  87. draw_set_valign(fa_middle);
  88. draw_set_font(FontPauseRegular);
  89. draw_set_color(c_white);
  90.  
  91. var x_hp=640+32;
  92. var x_mp=640+640/3+32;
  93. var x_sp=640+640*2/3+32;
  94. draw_health(x_hp, text_y);
  95. draw_magic(x_mp, text_y);
  96. draw_stamina(x_sp, text_y);
  97. draw_text(x_hp, text_y_b, "Damage: "+string(get_damage_rating(Player)));
  98. draw_text(x_sp, text_y_b, "Armor: "+string(get_armor_rating(Player)));
  99.  
  100. for (var i=0; i<ds_list_size(list); i++){
  101.     draw_text(96+pause_menu_offset, 64+32*i, list[| i]);
  102. }
  103.  
  104. draw_sprite(spr_menu_arrow, 0, 32+pause_menu_offset, 64+32*pause_greater_position);
  105.  
  106. if (pause_greater==PauseInventoryScreens.base){
  107.     // Scroll through the category list
  108.     if (Controller.release_up){
  109.         pause_greater_position=max(--pause_greater_position, 0);
  110.     } else if (Controller.release_down){
  111.         pause_greater_position=min(++pause_greater_position, ds_list_size(list)-1);
  112.     } else if (Controller.release_a||Controller.release_right){
  113.         if (list_quantity[| pause_greater_position]>0){
  114.             pause_greater=PauseInventoryScreens.contents;
  115.             pause_lesser_position=0;
  116.         }
  117.     } else if (Controller.release_b||Controller.release_left){
  118.         drawPauseMenuQuit();
  119.     } else if (Controller.release_x){
  120.         var owner=list_owner[| pause_greater_position];
  121.         if (argument_count==1&&argument[0]!=noone&&!pause_exchange_money&&owner==argument[0]){
  122.             drawPauseMenuTakeAll(argument[0]);
  123.             drawPauseMenuQuit();
  124.         }
  125.     }
  126. } else {
  127.     // Draw the outer frame
  128.     draw_set_color(c_black);
  129.     draw_set_alpha(pause_base_alpha);
  130.     draw_rectangle(frame_width+pause_menu_offset, 0, 2*frame_width+pause_menu_offset, 720, false);
  131.     draw_set_alpha(1);
  132.     draw_line_width(2*frame_width+pause_menu_offset, 0, 2*frame_width+pause_menu_offset, 720,  border_width);
  133.     draw_set_color(c_white);
  134.     // Fill the item list
  135.     var list_item=ds_list_create();
  136.     var owner=list_owner[| pause_greater_position];
  137.     for (var i=0; i<ds_list_size(owner.inventory); i++){
  138.         var stack=owner.inventory[| i];
  139.         var base_item=World.all_items[stack.index];
  140.         if (list_int[| pause_greater_position]==ItemClasses.no||base_item.class==list_int[| pause_greater_position]){
  141.             ds_list_add(list_item, stack);
  142.         }
  143.     }
  144.     // Draw the item list
  145.     for (var i=0; i<ds_list_size(list_item); i++){
  146.         var stack=list_item[| i];
  147.         var base_item=World.all_items[stack.index];
  148.         if (getItemIsEquipped(stack, list_owner[| pause_greater_position])){
  149.             draw_sprite(spr_menu_equip, getItemIsEquippedIcon(stack, list_owner[| pause_greater_position]), frame_width+96+pause_menu_offset, 64+32*i);
  150.             var spacing=TAB;
  151.         } else {
  152.             var spacing="";
  153.         }
  154.         if (stack.quantity>1){
  155.             var suffix=" ("+string(stack.quantity)+")";
  156.         } else {
  157.             var suffix="";
  158.         }
  159.         draw_text(frame_width+96+pause_menu_offset, 64+32*i, spacing+base_item.name+suffix);
  160.     }
  161.     pause_lesser_position=min(ds_list_size(list_item)-1, pause_lesser_position);
  162.    
  163.     draw_sprite(spr_menu_arrow, 0, frame_width+32+pause_menu_offset, 64+32*pause_lesser_position);
  164.    
  165.     pause_inventory_temp_category=list[| pause_greater_position];
  166.     pause_inventory_temp_owner=list_owner[| pause_greater_position];
  167.     switch (pause_greater){
  168.         case PauseInventoryScreens.contents:
  169.             // Draw the item summary
  170.             var x1=640+80;
  171.             var y1=360-160-128;
  172.             var x2=1280-80;
  173.             var y2=360+160-128;
  174.             var center_x=(x1+x2)/2;
  175.             var center_y=(y1+y2)/2;
  176.             var text_width=(x2-x1)-64;
  177.             var stack=list_item[| pause_lesser_position];
  178.             var base_item=World.all_items[stack.index];
  179.             var owner=list_owner[| pause_greater_position];
  180.             drawPauseMenuInventoryBox(x1, y1, x2, y2, border_width);
  181.             draw_set_color(c_white);
  182.             draw_set_halign(fa_center);
  183.             draw_set_font(FontPauseRose);
  184.             draw_text(center_x, center_y, base_item.name);
  185.             draw_sprite_ext(base_item.sprite_index, pause_menu_image_index, center_x, (center_y+y1)/2, 2, 2, 0, c_white, 1);
  186.             draw_set_font(FontPauseRegular);
  187.             draw_line_width(x1+32, center_y+32, x2-32, center_y+32, border_width);
  188.             var str="";
  189.             if (base_item.base_power>0){
  190.                 str="Power: "+string(base_item.base_power)+" | ";
  191.             }
  192.             str=str+"Weight: "+string(base_item.weight)+" | Value: "
  193.             if (owner==Player){
  194.                 str=str+string(get_sell_price(base_item));
  195.             } else {
  196.                 str=str+string(get_buy_price(base_item));
  197.             }
  198.             draw_text(center_x, center_y+64, str);
  199.             var y1=360+160-96;
  200.             var y2=360+160;
  201.             var center_y=(y1+y2)/2;
  202.             drawPauseMenuInventoryBox(x1, y1, x2, y2, border_width);
  203.             draw_set_color(c_white);
  204.             draw_text_ext(center_x, center_y, base_item.description, -1, text_width);
  205.             // Controls
  206.             if (Controller.release_up){
  207.                 pause_lesser_position=max(--pause_lesser_position, 0);
  208.             } else if (Controller.release_down){
  209.                 pause_lesser_position=min(++pause_lesser_position, ds_list_size(list_item)-1);
  210.             } else if (Controller.release_a||Controller.release_l||Controller.release_r){
  211.                 if (owner==Player){
  212.                     script_execute(base_item.use_script, stack, Controller.release_l);
  213.                 } else {
  214.                     // If you must pay
  215.                     if (pause_exchange_money){
  216.                         if (stack.quantity>5){
  217.                             pause_greater=PauseInventoryScreens.quantity_transaction;
  218.                             pause_inventory_transaction_quantity=1;
  219.                         } else {
  220.                             var amt=get_buy_price(base_item);
  221.                             if (GetGold(Player)>=amt){
  222.                                 RemoveGold(Player, amt);
  223.                                 AddGold(owner, amt);
  224.                                 AddItem(Player, stack.index, 1);
  225.                                 if (stack.quantity==1&&ds_list_size(list_item)==1){
  226.                                     pause_greater=PauseInventoryScreens.base;
  227.                                 }
  228.                                 RemoveItem(stack.index, 1, owner);
  229.                             }
  230.                         }
  231.                     // If you may take freely
  232.                     } else {
  233.                         if (stack.quantity>5&&stack.index!=Items.gold){
  234.                             pause_greater=PauseInventoryScreens.quantity_transaction;
  235.                             pause_inventory_transaction_quantity=1;
  236.                         } else {
  237.                             if (stack.index==Items.gold){
  238.                                 var n=stack.quantity;
  239.                             } else {
  240.                                 var n=1;
  241.                             }
  242.                             if (owner!=noone){
  243.                                 // @todo Stealing
  244.                             }
  245.                             AddItem(Player, stack.index, n);
  246.                             if (stack.quantity==n&&ds_list_size(list_item)==1){
  247.                                 pause_greater=PauseInventoryScreens.base;
  248.                             }
  249.                             RemoveItem(stack.index, n, owner);
  250.                         }
  251.                     }
  252.                 }
  253.             } else if (Controller.release_b||Controller.release_left){
  254.                 pause_greater=PauseInventoryScreens.base;
  255.             } else if (Controller.release_x){
  256.                 // If you are giving to someone else
  257.                 if (argument_count==1&&argument[0]!=noone){
  258.                     // If this is your inventory
  259.                     if (owner==Player){
  260.                         // If you must be paid
  261.                         if (pause_exchange_money){
  262.                             if (stack.quantity>5){
  263.                                 pause_greater=PauseInventoryScreens.quantity_transaction;
  264.                             } else {
  265.                                 var amt=get_sell_price(base_item);
  266.                                 if (GetGold(argument[0])>=amt){
  267.                                     AddGold(Player, amt);
  268.                                     RemoveGold(argument[0], amt);
  269.                                     AddItem(argument[0], stack.index, 1);
  270.                                     if (stack.quantity==1&&ds_list_size(list_item)==1){
  271.                                         pause_greater=PauseInventoryScreens.base;
  272.                                     }
  273.                                     RemoveItem(stack.index, 1, Player);
  274.                                 }
  275.                             }
  276.                         // If you may give freely
  277.                         } else {
  278.                             if (stack.quantity>5){
  279.                                 pause_greater=PauseInventoryScreens.quantity_transaction;
  280.                                 pause_inventory_transaction_quantity=1;
  281.                             } else {
  282.                                 AddItem(argument[0], stack.index, 1);
  283.                                 if (stack.quantity==1&&ds_list_size(list_item)==1){
  284.                                     pause_greater=PauseInventoryScreens.base;
  285.                                 }
  286.                                 RemoveItem(stack.index, 1, Player);
  287.                             }
  288.                         }
  289.                     // If this is a container inventory
  290.                     } else {
  291.                         drawPauseMenuTakeAll(owner);
  292.                         drawPauseMenuQuit();
  293.                     }
  294.                 // If you are just chucking the items
  295.                 } else {
  296.                     if (stack.quantity>5){
  297.                         pause_greater=PauseInventoryScreens.quantity_toss;
  298.                         pause_inventory_transaction_quantity=1;
  299.                     } else {
  300.                         if (stack.quantity==1&&ds_list_size(list_item)==1){
  301.                             pause_greater=PauseInventoryScreens.base;
  302.                         }
  303.                         RemoveItem(stack.index, 1, Player);
  304.                     }
  305.                 }
  306.             }
  307.             break;
  308.         case PauseInventoryScreens.quantity_transaction:
  309.             var x1=640+80;
  310.             var y1=360-160;
  311.             var x2=1280-80;
  312.             var y2=360+160;
  313.             var center_x=(x1+x2)/2;
  314.             var center_y=(y1+y2)/2;
  315.             var text_width=(x2-x1)-64;
  316.             var stack=list_item[| pause_lesser_position];
  317.             var base_item=World.all_items[stack.index];
  318.             var owner=list_owner[| pause_greater_position];
  319.             drawPauseMenuInventoryBox(x1, y1, x2, y2, border_width);
  320.             draw_set_halign(fa_center);
  321.             draw_set_color(c_white);
  322.             draw_text(center_x, center_y, "How many?");
  323.             draw_text(center_x, center_y+32, string(floor(pause_inventory_transaction_quantity))+"/"+string(stack.quantity));
  324.             var rate=stack.quantity/120;
  325.             if (Controller.left){
  326.                 pause_inventory_transaction_quantity=max(pause_inventory_transaction_quantity-rate, 0);
  327.             } else if (Controller.right){
  328.                 pause_inventory_transaction_quantity=min(pause_inventory_transaction_quantity+rate, stack.quantity);
  329.             } else if (Controller.release_a){
  330.                 var qty=floor(pause_inventory_transaction_quantity);
  331.                 pause_greater=PauseInventoryScreens.contents;   // this may be overwritten later if there's nothing left in "contents"
  332.                 if (owner==Player){
  333.                     // If you will be paid
  334.                     if (pause_exchange_money){
  335.                         var cost=qty*get_sell_price(base_item);
  336.                         if (GetGold(argument[0])>=cost){
  337.                             AddGold(Player, cost);
  338.                             RemoveGold(argument[0], cost);
  339.                             AddItem(argument[0], stack.index, qty);
  340.                             if (stack.quantity==qty&&ds_list_size(list_item)==1){
  341.                                 pause_greater=PauseInventoryScreens.base;
  342.                             }
  343.                             RemoveItem(stack.index, qty, Player);
  344.                         } else {
  345.                             var safe_qty=GetGold(argument[0]) div get_sell_price(base_item);
  346.                             var safe_cost=safe_qty*get_sell_price(base_item);
  347.                             RemoveGold(argument[0], safe_cost);
  348.                             AddGold(Player, safe_cost);
  349.                             AddItem(argument[0], stack.index, safe_qty);
  350.                             if (stack.quantity==qty&&ds_list_size(list_item)==1){
  351.                                 pause_greater=PauseInventoryScreens.base;
  352.                             }
  353.                             RemoveItem(stack.index, safe_qty, Player);
  354.                         }
  355.                     // If you are giving freely
  356.                     } else {
  357.                         AddItem(argument[0], stack.index, qty);
  358.                         if (stack.quantity==qty&&ds_list_size(list_item)==1){
  359.                             pause_greater=PauseInventoryScreens.base;
  360.                         }
  361.                         RemoveItem(stack.index, qty, Player);
  362.                     }
  363.                 } else {
  364.                     // If you must pay
  365.                     if (pause_exchange_money){
  366.                         var cost=qty*get_buy_price(base_item);
  367.                         if (GetGold(Player)>=cost){
  368.                             RemoveGold(Player, cost);
  369.                             AddGold(owner, cost);
  370.                             AddItem(Player, stack.index, qty);
  371.                             if (stack.quantity==qty&&ds_list_size(list_item)==1){
  372.                                 pause_greater=PauseInventoryScreens.base;
  373.                             }
  374.                             RemoveItem(stack.index, qty, owner);
  375.                         } else {
  376.                             var safe_qty=GetGold(Player) div get_buy_price(base_item);
  377.                             var safe_cost=safe_qty*get_buy_price(base_item);
  378.                             RemoveGold(Player, safe_cost);
  379.                             AddGold(owner, safe_cost);
  380.                             AddItem(Player, stack.index, safe_qty);
  381.                             if (stack.quantity==qty&&ds_list_size(list_item)==1){
  382.                                 pause_greater=PauseInventoryScreens.base;
  383.                             }
  384.                             RemoveItem(stack.index, safe_qty, owner);
  385.                         }
  386.                     // If you may take freely
  387.                     } else {
  388.                         if (owner!=noone){
  389.                             // @todo Stealing
  390.                         }
  391.                         AddItem(Player, stack.index, qty);
  392.                         if (stack.quantity==qty&&ds_list_size(list_item)==1){
  393.                             pause_greater=PauseInventoryScreens.base;
  394.                         }
  395.                         RemoveItem(stack.index, qty, owner);
  396.                     }
  397.                 }
  398.             } else if (Controller.release_b){
  399.                 pause_greater=PauseInventoryScreens.contents;
  400.             }
  401.             // After the value(s) are updated draw potential price text.
  402.             if (pause_exchange_money){
  403.                 var qty=floor(pause_inventory_transaction_quantity);
  404.                 if (owner==Player){
  405.                     var cost=qty*get_sell_price(base_item);
  406.                     draw_text(center_x, center_y+64, "You will recieve "+string(cost)+" gold.");
  407.                     if (cost>GetGold(argument[0])){
  408.                         draw_text(center_x, center_y+96, "("+argument[0].name+" does not have this much gold.)");
  409.                     }
  410.                 } else {
  411.                     var cost=qty*get_buy_price(base_item);
  412.                     draw_text(center_x, center_y+64, "You must pay "+string(cost)+" gold.");
  413.                     if (cost>GetGold(Player)){
  414.                         draw_text(center_x, center_y+96, "(You do not have this much gold.)");
  415.                     }
  416.                 }
  417.             }
  418.             break;
  419.         case PauseInventoryScreens.quantity_toss:
  420.             var x1=640+80;
  421.             var y1=360-160;
  422.             var x2=1280-80;
  423.             var y2=360+160;
  424.             var center_x=(x1+x2)/2;
  425.             var center_y=(y1+y2)/2;
  426.             var text_width=(x2-x1)-64;
  427.             var stack=list_item[| pause_lesser_position];
  428.             var base_item=World.all_items[stack.index];
  429.             drawPauseMenuInventoryBox(x1, y1, x2, y2, border_width);
  430.             draw_set_halign(fa_center);
  431.             draw_set_color(c_white);
  432.             draw_text(center_x, center_y, "How many?");
  433.             draw_text(center_x, center_y+32, string(floor(pause_inventory_transaction_quantity))+"/"+string(stack.quantity));
  434.             var rate=stack.quantity/120;
  435.             if (Controller.left){
  436.                 pause_inventory_transaction_quantity=max(pause_inventory_transaction_quantity-rate, 0);
  437.             } else if (Controller.right){
  438.                 pause_inventory_transaction_quantity=min(pause_inventory_transaction_quantity+rate, stack.quantity);
  439.             } else if (Controller.release_a){
  440.                 pause_greater=PauseInventoryScreens.contents;   // this may be overwritten later if there's nothing left in "contents"
  441.                 var qty=floor(pause_inventory_transaction_quantity);
  442.                 if (stack.quantity==qty&&ds_list_size(list_item)==1){
  443.                     pause_greater=PauseInventoryScreens.base;
  444.                 }
  445.                 RemoveItem(stack.index, qty, Player);
  446.             } else if (Controller.release_b){
  447.                 pause_greater=PauseInventoryScreens.contents;
  448.             }
  449.             break;
  450.         case PauseInventoryScreens.poison:
  451.             var x1=640+80;
  452.             var y1=360-160;
  453.             var x2=1280-80;
  454.             var y2=360+160;
  455.             var center_x=(x1+x2)/2;
  456.             var center_y=(y1+y2)/2;
  457.             var text_width=(x2-x1)-64;
  458.             var stack=list_item[| pause_lesser_position];
  459.             var base_item=World.all_items[stack.index];
  460.             var stack_weapon=Player.equip_right;
  461.             var base_weapon=World.all_items[stack_weapon.index];
  462.             draw_text_ext(center_x, center_y, "Would you like to poison your "+base_weapon.name+" with the "+base_item.name+"?", -1, text_width);
  463.             // @todo Finish this
  464.             break;
  465.     }
  466.    
  467.     ds_list_destroy(list_item);
  468. }
  469.  
  470. // Clean up
  471.  
  472. pause_menu_offset=lerp(pause_menu_offset, 0, 0.1);
  473. pause_menu_image_index=pause_menu_image_index+ANIMATION_ITEM_PER_SECOND/game_get_speed(gamespeed_fps);
  474.  
  475. ds_list_destroy(list);
  476. ds_list_destroy(list_int);
  477. ds_list_destroy(list_owner);
Advertisement
Add Comment
Please, Sign In to add comment