/// @description Draw the inventory for one or more Characters.
/// @param [secondary] (Optional) The second Solid to draw the inventory of
// Some placement variables
var frame_width=320;
var border_width=2;
var frame_bottom=640;
var text_y=frame_bottom+(720-frame_bottom)/3;
var text_y_b=frame_bottom+(720-frame_bottom)*2/3;
// Create the required lists
var list=ds_list_create();
var list_int=ds_list_create();
var list_owner=ds_list_create();
var list_quantity=ds_list_create();
if (argument_count==1&&argument[0]!=noone){
ds_list_add(list, argument[0].name);
ds_list_add(list_int, ItemClasses.no);
ds_list_add(list_owner, argument[0]);
ds_list_add(list_quantity, ds_list_size(argument[0].inventory));
var category=ItemClasses.no;
for (var i=0; i<ds_list_size(argument[0].inventory); i++){
var stack=argument[0].inventory[| i];
var new_category=World.all_items[argument[0].inventory[| i].index].class;
if (category!=new_category){
if (new_category==ItemClasses.misc){
var add=" - "+string(GetGold(argument[0]))+" gold";
} else {
var add="";
}
ds_list_add(list, TAB+World.item_class_names[new_category]+add);
ds_list_add(list_int, new_category);
ds_list_add(list_owner, argument[0]);
ds_list_add(list_quantity, 1);
category=new_category;
} else {
list_quantity[| ds_list_size(list_quantity)-1]++;
}
}
}
ds_list_add(list, Player.name);
ds_list_add(list_int, ItemClasses.no);
ds_list_add(list_owner, Player);
ds_list_add(list_quantity, ds_list_size(Player.inventory));
var category=ItemClasses.no;
for (var i=0; i<ds_list_size(Player.inventory); i++){
var new_category=World.all_items[Player.inventory[| i].index].class;
if (category!=new_category){
if (new_category==ItemClasses.misc){
var add=" - "+string(GetGold(Player))+" gold";
} else {
var add="";
}
ds_list_add(list, TAB+World.item_class_names[new_category]+add);
ds_list_add(list_int, new_category);
ds_list_add(list_owner, Player);
ds_list_add(list_quantity, 1);
category=new_category;
} else {
list_quantity[| ds_list_size(list_quantity)-1]++;
}
}
for (var i=0; i<ds_list_size(list); i++){
if (list_owner[| i]==pause_inventory_temp_owner&&list[| i]==pause_inventory_temp_category){
pause_greater_position=i;
pause_inventory_temp_owner=noone;
pause_inventory_temp_category=-1;
break;
}
}
pause_greater_position=min(pause_greater_position, ds_list_size(list)-1);
// Draw the category frame
draw_set_alpha(pause_base_alpha);
draw_set_color(c_black);
draw_rectangle(0+pause_menu_offset, 0, frame_width+pause_menu_offset, 720, false);
draw_rectangle(0, frame_bottom, 1280, 720, false);
draw_set_alpha(1);
draw_line_width(frame_width+pause_menu_offset, 0, frame_width+pause_menu_offset, 720, border_width);
draw_line_width(0, frame_bottom, 1280, frame_bottom, border_width);
draw_set_halign(fa_left);
draw_set_valign(fa_middle);
draw_set_font(FontPauseRegular);
draw_set_color(c_white);
var x_hp=640+32;
var x_mp=640+640/3+32;
var x_sp=640+640*2/3+32;
draw_health(x_hp, text_y);
draw_magic(x_mp, text_y);
draw_stamina(x_sp, text_y);
draw_text(x_hp, text_y_b, "Damage: "+string(get_damage_rating(Player)));
draw_text(x_sp, text_y_b, "Armor: "+string(get_armor_rating(Player)));
for (var i=0; i<ds_list_size(list); i++){
draw_text(96+pause_menu_offset, 64+32*i, list[| i]);
}
draw_sprite(spr_menu_arrow, 0, 32+pause_menu_offset, 64+32*pause_greater_position);
if (pause_greater==PauseInventoryScreens.base){
// Scroll through the category list
if (Controller.release_up){
pause_greater_position=max(--pause_greater_position, 0);
} else if (Controller.release_down){
pause_greater_position=min(++pause_greater_position, ds_list_size(list)-1);
} else if (Controller.release_a||Controller.release_right){
if (list_quantity[| pause_greater_position]>0){
pause_greater=PauseInventoryScreens.contents;
pause_lesser_position=0;
}
} else if (Controller.release_b||Controller.release_left){
drawPauseMenuQuit();
} else if (Controller.release_x){
var owner=list_owner[| pause_greater_position];
if (argument_count==1&&argument[0]!=noone&&!pause_exchange_money&&owner==argument[0]){
drawPauseMenuTakeAll(argument[0]);
drawPauseMenuQuit();
}
}
} else {
// Draw the outer frame
draw_set_color(c_black);
draw_set_alpha(pause_base_alpha);
draw_rectangle(frame_width+pause_menu_offset, 0, 2*frame_width+pause_menu_offset, 720, false);
draw_set_alpha(1);
draw_line_width(2*frame_width+pause_menu_offset, 0, 2*frame_width+pause_menu_offset, 720, border_width);
draw_set_color(c_white);
// Fill the item list
var list_item=ds_list_create();
var owner=list_owner[| pause_greater_position];
for (var i=0; i<ds_list_size(owner.inventory); i++){
var stack=owner.inventory[| i];
var base_item=World.all_items[stack.index];
if (list_int[| pause_greater_position]==ItemClasses.no||base_item.class==list_int[| pause_greater_position]){
ds_list_add(list_item, stack);
}
}
// Draw the item list
for (var i=0; i<ds_list_size(list_item); i++){
var stack=list_item[| i];
var base_item=World.all_items[stack.index];
if (getItemIsEquipped(stack, list_owner[| pause_greater_position])){
draw_sprite(spr_menu_equip, getItemIsEquippedIcon(stack, list_owner[| pause_greater_position]), frame_width+96+pause_menu_offset, 64+32*i);
var spacing=TAB;
} else {
var spacing="";
}
if (stack.quantity>1){
var suffix=" ("+string(stack.quantity)+")";
} else {
var suffix="";
}
draw_text(frame_width+96+pause_menu_offset, 64+32*i, spacing+base_item.name+suffix);
}
pause_lesser_position=min(ds_list_size(list_item)-1, pause_lesser_position);
draw_sprite(spr_menu_arrow, 0, frame_width+32+pause_menu_offset, 64+32*pause_lesser_position);
pause_inventory_temp_category=list[| pause_greater_position];
pause_inventory_temp_owner=list_owner[| pause_greater_position];
switch (pause_greater){
case PauseInventoryScreens.contents:
// Draw the item summary
var x1=640+80;
var y1=360-160-128;
var x2=1280-80;
var y2=360+160-128;
var center_x=(x1+x2)/2;
var center_y=(y1+y2)/2;
var text_width=(x2-x1)-64;
var stack=list_item[| pause_lesser_position];
var base_item=World.all_items[stack.index];
var owner=list_owner[| pause_greater_position];
drawPauseMenuInventoryBox(x1, y1, x2, y2, border_width);
draw_set_color(c_white);
draw_set_halign(fa_center);
draw_set_font(FontPauseRose);
draw_text(center_x, center_y, base_item.name);
draw_sprite_ext(base_item.sprite_index, pause_menu_image_index, center_x, (center_y+y1)/2, 2, 2, 0, c_white, 1);
draw_set_font(FontPauseRegular);
draw_line_width(x1+32, center_y+32, x2-32, center_y+32, border_width);
var str="";
if (base_item.base_power>0){
str="Power: "+string(base_item.base_power)+" | ";
}
str=str+"Weight: "+string(base_item.weight)+" | Value: "
if (owner==Player){
str=str+string(get_sell_price(base_item));
} else {
str=str+string(get_buy_price(base_item));
}
draw_text(center_x, center_y+64, str);
var y1=360+160-96;
var y2=360+160;
var center_y=(y1+y2)/2;
drawPauseMenuInventoryBox(x1, y1, x2, y2, border_width);
draw_set_color(c_white);
draw_text_ext(center_x, center_y, base_item.description, -1, text_width);
// Controls
if (Controller.release_up){
pause_lesser_position=max(--pause_lesser_position, 0);
} else if (Controller.release_down){
pause_lesser_position=min(++pause_lesser_position, ds_list_size(list_item)-1);
} else if (Controller.release_a||Controller.release_l||Controller.release_r){
if (owner==Player){
script_execute(base_item.use_script, stack, Controller.release_l);
} else {
// If you must pay
if (pause_exchange_money){
if (stack.quantity>5){
pause_greater=PauseInventoryScreens.quantity_transaction;
pause_inventory_transaction_quantity=1;
} else {
var amt=get_buy_price(base_item);
if (GetGold(Player)>=amt){
RemoveGold(Player, amt);
AddGold(owner, amt);
AddItem(Player, stack.index, 1);
if (stack.quantity==1&&ds_list_size(list_item)==1){
pause_greater=PauseInventoryScreens.base;
}
RemoveItem(stack.index, 1, owner);
}
}
// If you may take freely
} else {
if (stack.quantity>5&&stack.index!=Items.gold){
pause_greater=PauseInventoryScreens.quantity_transaction;
pause_inventory_transaction_quantity=1;
} else {
if (stack.index==Items.gold){
var n=stack.quantity;
} else {
var n=1;
}
if (owner!=noone){
// @todo Stealing
}
AddItem(Player, stack.index, n);
if (stack.quantity==n&&ds_list_size(list_item)==1){
pause_greater=PauseInventoryScreens.base;
}
RemoveItem(stack.index, n, owner);
}
}
}
} else if (Controller.release_b||Controller.release_left){
pause_greater=PauseInventoryScreens.base;
} else if (Controller.release_x){
// If you are giving to someone else
if (argument_count==1&&argument[0]!=noone){
// If this is your inventory
if (owner==Player){
// If you must be paid
if (pause_exchange_money){
if (stack.quantity>5){
pause_greater=PauseInventoryScreens.quantity_transaction;
} else {
var amt=get_sell_price(base_item);
if (GetGold(argument[0])>=amt){
AddGold(Player, amt);
RemoveGold(argument[0], amt);
AddItem(argument[0], stack.index, 1);
if (stack.quantity==1&&ds_list_size(list_item)==1){
pause_greater=PauseInventoryScreens.base;
}
RemoveItem(stack.index, 1, Player);
}
}
// If you may give freely
} else {
if (stack.quantity>5){
pause_greater=PauseInventoryScreens.quantity_transaction;
pause_inventory_transaction_quantity=1;
} else {
AddItem(argument[0], stack.index, 1);
if (stack.quantity==1&&ds_list_size(list_item)==1){
pause_greater=PauseInventoryScreens.base;
}
RemoveItem(stack.index, 1, Player);
}
}
// If this is a container inventory
} else {
drawPauseMenuTakeAll(owner);
drawPauseMenuQuit();
}
// If you are just chucking the items
} else {
if (stack.quantity>5){
pause_greater=PauseInventoryScreens.quantity_toss;
pause_inventory_transaction_quantity=1;
} else {
if (stack.quantity==1&&ds_list_size(list_item)==1){
pause_greater=PauseInventoryScreens.base;
}
RemoveItem(stack.index, 1, Player);
}
}
}
break;
case PauseInventoryScreens.quantity_transaction:
var x1=640+80;
var y1=360-160;
var x2=1280-80;
var y2=360+160;
var center_x=(x1+x2)/2;
var center_y=(y1+y2)/2;
var text_width=(x2-x1)-64;
var stack=list_item[| pause_lesser_position];
var base_item=World.all_items[stack.index];
var owner=list_owner[| pause_greater_position];
drawPauseMenuInventoryBox(x1, y1, x2, y2, border_width);
draw_set_halign(fa_center);
draw_set_color(c_white);
draw_text(center_x, center_y, "How many?");
draw_text(center_x, center_y+32, string(floor(pause_inventory_transaction_quantity))+"/"+string(stack.quantity));
var rate=stack.quantity/120;
if (Controller.left){
pause_inventory_transaction_quantity=max(pause_inventory_transaction_quantity-rate, 0);
} else if (Controller.right){
pause_inventory_transaction_quantity=min(pause_inventory_transaction_quantity+rate, stack.quantity);
} else if (Controller.release_a){
var qty=floor(pause_inventory_transaction_quantity);
pause_greater=PauseInventoryScreens.contents; // this may be overwritten later if there's nothing left in "contents"
if (owner==Player){
// If you will be paid
if (pause_exchange_money){
var cost=qty*get_sell_price(base_item);
if (GetGold(argument[0])>=cost){
AddGold(Player, cost);
RemoveGold(argument[0], cost);
AddItem(argument[0], stack.index, qty);
if (stack.quantity==qty&&ds_list_size(list_item)==1){
pause_greater=PauseInventoryScreens.base;
}
RemoveItem(stack.index, qty, Player);
} else {
var safe_qty=GetGold(argument[0]) div get_sell_price(base_item);
var safe_cost=safe_qty*get_sell_price(base_item);
RemoveGold(argument[0], safe_cost);
AddGold(Player, safe_cost);
AddItem(argument[0], stack.index, safe_qty);
if (stack.quantity==qty&&ds_list_size(list_item)==1){
pause_greater=PauseInventoryScreens.base;
}
RemoveItem(stack.index, safe_qty, Player);
}
// If you are giving freely
} else {
AddItem(argument[0], stack.index, qty);
if (stack.quantity==qty&&ds_list_size(list_item)==1){
pause_greater=PauseInventoryScreens.base;
}
RemoveItem(stack.index, qty, Player);
}
} else {
// If you must pay
if (pause_exchange_money){
var cost=qty*get_buy_price(base_item);
if (GetGold(Player)>=cost){
RemoveGold(Player, cost);
AddGold(owner, cost);
AddItem(Player, stack.index, qty);
if (stack.quantity==qty&&ds_list_size(list_item)==1){
pause_greater=PauseInventoryScreens.base;
}
RemoveItem(stack.index, qty, owner);
} else {
var safe_qty=GetGold(Player) div get_buy_price(base_item);
var safe_cost=safe_qty*get_buy_price(base_item);
RemoveGold(Player, safe_cost);
AddGold(owner, safe_cost);
AddItem(Player, stack.index, safe_qty);
if (stack.quantity==qty&&ds_list_size(list_item)==1){
pause_greater=PauseInventoryScreens.base;
}
RemoveItem(stack.index, safe_qty, owner);
}
// If you may take freely
} else {
if (owner!=noone){
// @todo Stealing
}
AddItem(Player, stack.index, qty);
if (stack.quantity==qty&&ds_list_size(list_item)==1){
pause_greater=PauseInventoryScreens.base;
}
RemoveItem(stack.index, qty, owner);
}
}
} else if (Controller.release_b){
pause_greater=PauseInventoryScreens.contents;
}
// After the value(s) are updated draw potential price text.
if (pause_exchange_money){
var qty=floor(pause_inventory_transaction_quantity);
if (owner==Player){
var cost=qty*get_sell_price(base_item);
draw_text(center_x, center_y+64, "You will recieve "+string(cost)+" gold.");
if (cost>GetGold(argument[0])){
draw_text(center_x, center_y+96, "("+argument[0].name+" does not have this much gold.)");
}
} else {
var cost=qty*get_buy_price(base_item);
draw_text(center_x, center_y+64, "You must pay "+string(cost)+" gold.");
if (cost>GetGold(Player)){
draw_text(center_x, center_y+96, "(You do not have this much gold.)");
}
}
}
break;
case PauseInventoryScreens.quantity_toss:
var x1=640+80;
var y1=360-160;
var x2=1280-80;
var y2=360+160;
var center_x=(x1+x2)/2;
var center_y=(y1+y2)/2;
var text_width=(x2-x1)-64;
var stack=list_item[| pause_lesser_position];
var base_item=World.all_items[stack.index];
drawPauseMenuInventoryBox(x1, y1, x2, y2, border_width);
draw_set_halign(fa_center);
draw_set_color(c_white);
draw_text(center_x, center_y, "How many?");
draw_text(center_x, center_y+32, string(floor(pause_inventory_transaction_quantity))+"/"+string(stack.quantity));
var rate=stack.quantity/120;
if (Controller.left){
pause_inventory_transaction_quantity=max(pause_inventory_transaction_quantity-rate, 0);
} else if (Controller.right){
pause_inventory_transaction_quantity=min(pause_inventory_transaction_quantity+rate, stack.quantity);
} else if (Controller.release_a){
pause_greater=PauseInventoryScreens.contents; // this may be overwritten later if there's nothing left in "contents"
var qty=floor(pause_inventory_transaction_quantity);
if (stack.quantity==qty&&ds_list_size(list_item)==1){
pause_greater=PauseInventoryScreens.base;
}
RemoveItem(stack.index, qty, Player);
} else if (Controller.release_b){
pause_greater=PauseInventoryScreens.contents;
}
break;
case PauseInventoryScreens.poison:
var x1=640+80;
var y1=360-160;
var x2=1280-80;
var y2=360+160;
var center_x=(x1+x2)/2;
var center_y=(y1+y2)/2;
var text_width=(x2-x1)-64;
var stack=list_item[| pause_lesser_position];
var base_item=World.all_items[stack.index];
var stack_weapon=Player.equip_right;
var base_weapon=World.all_items[stack_weapon.index];
draw_text_ext(center_x, center_y, "Would you like to poison your "+base_weapon.name+" with the "+base_item.name+"?", -1, text_width);
// @todo Finish this
break;
}
ds_list_destroy(list_item);
}
// Clean up
pause_menu_offset=lerp(pause_menu_offset, 0, 0.1);
pause_menu_image_index=pause_menu_image_index+ANIMATION_ITEM_PER_SECOND/game_get_speed(gamespeed_fps);
ds_list_destroy(list);
ds_list_destroy(list_int);
ds_list_destroy(list_owner);
Comments
0 B
|👍
/👎
0 B
|👍
/👎