recipe filtering in crafting list
parent
553afd44d0
commit
d51d88002d
|
@ -101,14 +101,15 @@ inv_draw_result inventory_draw_crafting_btn(float xpos, float ypos, const char *
|
|||
}
|
||||
|
||||
static inline
|
||||
bool inventory_draw_crafting_list(float xpos, float ypos) {
|
||||
// NOTE(zaklaus): collect the list of supported recipes
|
||||
// TODO(zaklaus): too lazy, draw all recipes everywhere for now
|
||||
|
||||
bool inventory_draw_crafting_list(entity_view *e, float xpos, float ypos) {
|
||||
float start_xpos = xpos;
|
||||
float start_ypos = ypos;
|
||||
for (uint16_t i = 0; i < craft_get_num_recipes(); ++i) {
|
||||
asset_id id = craft_get_recipe_asset(i);
|
||||
|
||||
if (!e->sel_ent)
|
||||
return DAREA_OUTSIDE;
|
||||
|
||||
for (uint16_t i = 0; e->craftables[i]; ++i) {
|
||||
asset_id id = e->craftables[i];
|
||||
inventory_draw_crafting_btn(start_xpos+1, ypos+1, asset_names[id], id, BLACK);
|
||||
inv_draw_result entry = inventory_draw_crafting_btn(start_xpos, ypos, asset_names[id], id, RAYWHITE);
|
||||
ypos = entry.y;
|
||||
|
@ -134,7 +135,7 @@ void inventory_draw_panel(entity_view *e, bool is_player, float sx, float sy){
|
|||
inv_keystate *inv = (!is_player) ? &storage_inv : &player_inv;
|
||||
inv_keystate *inv2 = (is_player) ? &storage_inv : &player_inv;
|
||||
|
||||
bool inside_craft = !is_player && inventory_draw_crafting_list(screenWidth/2.0f - 684, screenHeight/2.0f - 128);
|
||||
bool inside_craft = !is_player && inventory_draw_crafting_list(e, screenWidth/2.0f - 684, screenHeight/2.0f - 128);
|
||||
|
||||
inv->is_inside = check_mouse_area(sx, sy, (float)grid_size, (float)grid_size) != DAREA_OUTSIDE;
|
||||
inv_is_inside |= inv->is_inside || inside_craft;
|
||||
|
|
|
@ -52,6 +52,16 @@ bool craft_is_reagent_used_in_producer(asset_id reagent, asset_id producer) {
|
|||
return craft__find_num_recipes_by_reagent(producer, reagent) > 0;
|
||||
}
|
||||
|
||||
bool craft_is_item_produced_by_producer(asset_id item, asset_id producer) {
|
||||
uint32_t num_recipes=0;
|
||||
for (int i = 0; i < (int)MAX_RECIPES; ++i) {
|
||||
if (recipes[i].producer == producer && item == recipes[i].product) {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
uint16_t craft_get_num_recipes(void) {
|
||||
return MAX_RECIPES;
|
||||
}
|
||||
|
|
|
@ -12,6 +12,9 @@ asset_id craft_perform_recipe(ecs_entity_t *items, asset_id producer, asset_id t
|
|||
// NOTE(zaklaus): mostly used by item router so we don't push reagents out
|
||||
bool craft_is_reagent_used_in_producer(asset_id reagent, asset_id producer);
|
||||
|
||||
// used to filter out craftables
|
||||
bool craft_is_item_produced_by_producer(asset_id item, asset_id producer);
|
||||
|
||||
// NOTE(zaklaus): utilities
|
||||
uint16_t craft_get_num_recipes(void);
|
||||
asset_id craft_get_recipe_asset(uint16_t id);
|
||||
|
|
|
@ -90,7 +90,7 @@ typedef struct entity_view {
|
|||
uint8_t storage_selected_item;
|
||||
|
||||
// NOTE(zaklaus): craftable recipes
|
||||
uint8_t craftables[MAX_CRAFTABLES];
|
||||
uint16_t craftables[MAX_CRAFTABLES];
|
||||
|
||||
// NOTE(zaklaus): entity picking
|
||||
uint64_t pick_ent;
|
||||
|
|
|
@ -11,6 +11,7 @@
|
|||
#include "platform/profiler.h"
|
||||
#include "core/game.h"
|
||||
#include "models/entity.h"
|
||||
#include "models/crafting.h"
|
||||
|
||||
#include "packets/pkt_send_librg_update.h"
|
||||
|
||||
|
@ -103,9 +104,17 @@ entity_view *world_build_entity_view(int64_t e) {
|
|||
|
||||
view.storage_selected_item = in->storage_selected_item;
|
||||
|
||||
if (ecs_get(world_ecs(), e, Producer)) {
|
||||
Device const* dev = ecs_get(world_ecs(), e, Device);
|
||||
if (ecs_get(world_ecs(), in->storage_ent, Producer)) {
|
||||
Device const* dev = ecs_get(world_ecs(), in->storage_ent, Device);
|
||||
zpl_zero_array(view.craftables, MAX_CRAFTABLES);
|
||||
|
||||
for (uint16_t i = 0, si = 0; i < craft_get_num_recipes(); i++) {
|
||||
ZPL_ASSERT(si < MAX_CRAFTABLES);
|
||||
asset_id pid = craft_get_recipe_asset(i);
|
||||
if (craft_is_item_produced_by_producer(pid, dev->asset)) {
|
||||
view.craftables[si++] = pid;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue