upgrades and inventory | gml
objPlayer Create
inventory = ds_list_create();
objPlayer Step
//------------ Movement:
x += (keyboard_check(vk_right) - keyboard_check(vk_left))*3;
y += (keyboard_check(vk_down) - keyboard_check(vk_up))*3;
//------------ Collect upgrades:
var flash = instance_position(x,y,objFlashPickup);
if flash != noone {
    instance_destroy(flash);
    ds_list_add(inventory, "Flash press F");
}
var invisible = instance_position(x,y,objInvisiblePickup);
if invisible != noone {
    instance_destroy(invisible);
    ds_list_add(inventory, "Invisible press I");
}
//------------ Apply upgrades:
if keyboard_check_pressed(ord("F")){
    for (var i = 0; i < ds_list_size(inventory); i++){
        var item = ds_list_find_value(inventory, i);
        if item == "Flash press F"{
            ds_list_delete(inventory, i);
            sprite_index = sprPlayerFlash;
        }
    }
}
if keyboard_check_pressed(ord("I")){
    for (var i = 0; i < ds_list_size(inventory); i++){
        var item = ds_list_find_value(inventory, i);
        if item == "Invisible press I"{
            ds_list_delete(inventory, i);
            image_alpha = 0;
        }
    }
}
objPlayer Draw GUI
draw_set_font(font0);
draw_text(5,5,"Inventory Items:");
for (var i = 0; i < ds_list_size(inventory); i++){
    draw_text(5,(25 + i*25),ds_list_find_value(inventory, i));
}
Challenges - Add:
- other upgrades
 - upgrades only apply for limited time, then reset
 - respawn / randomize upgrades