From 4506865512eced998903cf61b33628e3300ac998 Mon Sep 17 00:00:00 2001 From: lisyarus Date: Mon, 19 Aug 2024 00:22:15 +0300 Subject: [PATCH] Add recipe printing --- source/application.cpp | 160 ++++++++++++++++++++++++++++------------- 1 file changed, 112 insertions(+), 48 deletions(-) diff --git a/source/application.cpp b/source/application.cpp index c5bab4d..5e5420e 100644 --- a/source/application.cpp +++ b/source/application.cpp @@ -60,8 +60,8 @@ namespace gmtk case resource_type::copper_plate: return color_of(resource_type::copper_ore); case resource_type::iron_gear: return color_of(resource_type::iron_ore); case resource_type::copper_wire: return color_of(resource_type::copper_ore); - case resource_type::inserter: return {224, 160, 64, 255}; - case resource_type::electric_circuit: return {64, 160, 0, 255}; + case resource_type::inserter: return {224, 192, 64, 255}; + case resource_type::electric_circuit: return {64, 192, 64, 255}; case resource_type::red_science_pack: return {192, 64, 64, 255}; case resource_type::green_science_pack: return {64, 192, 64, 255}; } @@ -93,7 +93,7 @@ namespace gmtk {{resource_type::copper_plate, resource_type::stone_brick}, resource_type::copper_wire}, {{resource_type::iron_plate, resource_type::copper_wire}, resource_type::electric_circuit}, {{resource_type::iron_gear, resource_type::copper_plate}, resource_type::inserter}, - {{resource_type::electric_circuit, resource_type::inserter}, resource_type::green_science_pack}, + {{resource_type::electric_circuit, resource_type::inserter, resource_type::red_science_pack}, resource_type::green_science_pack}, }, }, }; @@ -453,6 +453,55 @@ namespace gmtk } } + void draw_item(resource_type type, geom::point const & pos, float scale, gfx::painter & painter) + { + auto color = color_of(type); + + switch (type) + { + case resource_type::coal: + case resource_type::stone: + case resource_type::iron_ore: + case resource_type::copper_ore: + painter.circle(pos, 0.075f * scale, {0, 0, 0, 255}); + painter.circle(pos, 0.05f * scale, color); + break; + case resource_type::stone_brick: + case resource_type::iron_plate: + case resource_type::copper_plate: + { + auto box = geom::expand(geom::box::singleton(pos), 0.075f * scale); + painter.rect(box, {0, 0, 0, 255}); + box = geom::shrink(box, 0.025f * scale); + painter.rect(box, color); + } + break; + case resource_type::iron_gear: + case resource_type::copper_wire: + case resource_type::inserter: + case resource_type::electric_circuit: + { + bool first = true; + for (float radius : {0.075f * scale, 0.05f * scale}) + { + for (int i = 0; i < 6; ++i) + painter.triangle(pos, pos + geom::direction(geom::rad(i * 60.f)) * radius, pos + geom::direction(geom::rad((i + 1) * 60.f)) * radius, first ? gfx::black : color); + first = false; + } + } + break; + case resource_type::red_science_pack: + case resource_type::green_science_pack: + { + auto box = geom::expand(geom::box::singleton(pos), 0.075f * scale); + painter.triangle(box.corner(0, 0), box.corner(1, 0), box.corner(0.5f, 1), {0, 0, 0, 255}); + box = geom::shrink(box, 0.025f * scale); + painter.triangle(box.corner(0, 0), box.corner(1, 0), box.corner(0.5f, 1), color); + } + break; + } + } + void draw(map & map, float view_level, gfx::painter & painter) { draw_grid({-1, {0, 0}}, view_level, painter, false); @@ -576,51 +625,7 @@ namespace gmtk } scale *= 3.f; - auto color = color_of(i.type); - - switch (i.type) - { - case resource_type::coal: - case resource_type::stone: - case resource_type::iron_ore: - case resource_type::copper_ore: - painter.circle(pos, 0.075f * scale, {0, 0, 0, 255}); - painter.circle(pos, 0.05f * scale, color); - break; - case resource_type::stone_brick: - case resource_type::iron_plate: - case resource_type::copper_plate: - { - auto box = geom::expand(geom::box::singleton(pos), 0.075f * scale); - painter.rect(box, {0, 0, 0, 255}); - box = geom::shrink(box, 0.025f * scale); - painter.rect(box, color); - } - break; - case resource_type::iron_gear: - case resource_type::copper_wire: - case resource_type::inserter: - case resource_type::electric_circuit: - { - bool first = true; - for (float radius : {0.075f * scale, 0.05f * scale}) - { - for (int i = 0; i < 6; ++i) - painter.triangle(pos, pos + geom::direction(geom::rad(i * 60.f)) * radius, pos + geom::direction(geom::rad((i + 1) * 60.f)) * radius, first ? gfx::black : color); - first = false; - } - } - break; - case resource_type::red_science_pack: - case resource_type::green_science_pack: - { - auto box = geom::expand(geom::box::singleton(pos), 0.075f * scale); - painter.triangle(box.corner(0, 0), box.corner(1, 0), box.corner(0.5f, 1), {0, 0, 0, 255}); - box = geom::shrink(box, 0.025f * scale); - painter.triangle(box.corner(0, 0), box.corner(1, 0), box.corner(0.5f, 1), color); - } - break; - } + draw_item(i.type, pos, scale, painter); }); } @@ -1108,6 +1113,65 @@ namespace gmtk if (belt_start_) draw_selection(*belt_start_, painter_, {255, 255, 0, 255}); + { + float w = (view_box_[0].length() - view_box_[1].length()) / 2.f; + geom::vector t{view_box_[1].length() / 5.f, 0.f}; + geom::vector d{w - t[0], 0.f}; + geom::vector n{w, 0.f}; + + auto p00 = view_box_.corner(0, 0); + auto p01 = view_box_.corner(0, 1); + auto p10 = view_box_.corner(1, 0); + auto p11 = view_box_.corner(1, 1); + + gfx::color_rgba c1{255, 255, 255, 255}; + gfx::color_rgba c0{255, 255, 255, 0}; + + painter_.triangle(p00, p00 + d, p01 + d, c1, c1, c1); + painter_.triangle(p00, p01 + d, p01, c1, c1, c1); + + painter_.triangle(p00 + d, p00 + n, p01 + n, c1, c0, c0); + painter_.triangle(p00 + d, p01 + n, p01 + d, c1, c0, c1); + + painter_.triangle(p10, p10 - d, p11 - d, c1, c1, c1); + painter_.triangle(p10, p11 - d, p11, c1, c1, c1); + + painter_.triangle(p10 - d, p10 - n, p11 - n, c1, c0, c0); + painter_.triangle(p10 - d, p11 - n, p11 - d, c1, c0, c1); + } + + if (selected_) + if (auto entity = map_.world.index().find(*selected_)) + if (auto t = map_.world.get(*entity).get_if()) + { + float const scale = std::pow(3.f, -1.f - view_level); + float const step = 1.5f * scale / 9.f; + + geom::point pen = view_box_.corner(0, 1) + geom::vector{1.f, -1.f} * view_box_[1].length() / 10.f; + for (auto const & recipe : recipies.at(t->type)) + { + int i = 0; + for (auto type : recipe.inputs) + { + draw_item(type, pen + geom::vector{i * step, 0.f}, scale, painter_); + ++i; + } + + i = 3; + painter_.triangle( + pen + geom::vector{(i - 0.4f) * step, -0.4f * step}, + pen + geom::vector{(i - 0.4f) * step, 0.4f * step}, + pen + geom::vector{(i + 0.4f) * step, 0.f}, + {127, 127, 127, 255} + ); + + i = 4; + draw_item(recipe.output, pen + geom::vector{i * step, 0.f}, scale, painter_); + + pen[1] -= step; + } + } + painter_.render(geom::orthographic_camera{view_box_}.transform()); }