diff --git a/source/application.cpp b/source/application.cpp index 3bba878..a47b2ce 100644 --- a/source/application.cpp +++ b/source/application.cpp @@ -42,6 +42,7 @@ namespace gmtk psemek_declare_enum(shape_type, std::uint32_t, (circle) (square) + (hexagon) ) struct resource_type @@ -63,13 +64,13 @@ namespace gmtk psemek_declare_enum(transformer_type, std::uint32_t, (mixer) - (square_maker) + (reshaper) (hue_shifter) ) psemek_declare_enum(card_type, std::uint32_t, (mixer) - (square_maker) + (reshaper) (hue_shifter) (crossing) (zoomer) @@ -83,12 +84,12 @@ namespace gmtk case color_type::white: return {255, 255, 255, 255}; case color_type::black: return {64, 64, 64, 255}; case color_type::gray: return {160, 160, 160, 255}; - case color_type::red: return {255, 64, 64, 255}; - case color_type::green: return {64, 255, 64, 255}; - case color_type::blue: return {64, 64, 255, 255}; - case color_type::cyan: return {64, 255, 255, 255}; - case color_type::magenta: return {255, 64, 255, 255}; - case color_type::yellow: return {255, 255, 64, 255}; + case color_type::red: return {255, 96, 96, 255}; + case color_type::green: return {96, 255, 96, 255}; + case color_type::blue: return {96, 96, 255, 255}; + case color_type::cyan: return {96, 255, 255, 255}; + case color_type::magenta: return {255, 96, 255, 255}; + case color_type::yellow: return {255, 255, 96, 255}; } throw util::unknown_enum_value_exception{c}; @@ -104,7 +105,7 @@ namespace gmtk switch (type) { case transformer_type::mixer: return card_type::mixer; - case transformer_type::square_maker: return card_type::square_maker; + case transformer_type::reshaper: return card_type::reshaper; case transformer_type::hue_shifter: return card_type::hue_shifter; } @@ -116,7 +117,7 @@ namespace gmtk switch (type) { case card_type::mixer: return transformer_type::mixer; - case card_type::square_maker: return transformer_type::square_maker; + case card_type::reshaper: return transformer_type::reshaper; case card_type::hue_shifter: return transformer_type::hue_shifter; default: return std::nullopt; } @@ -126,7 +127,7 @@ namespace gmtk struct recipe { - boost::container::flat_set inputs; + boost::container::flat_multiset inputs; resource_type output; }; @@ -139,10 +140,13 @@ namespace gmtk {{{color_type::white, shape_type::circle}, {color_type::red, shape_type::circle}, {color_type::green, shape_type::circle}}, {color_type::yellow, shape_type::circle}}, {{{color_type::white, shape_type::circle}, {color_type::red, shape_type::circle}, {color_type::blue, shape_type::circle}}, {color_type::magenta, shape_type::circle}}, {{{color_type::white, shape_type::circle}, {color_type::green, shape_type::circle}, {color_type::blue, shape_type::circle}}, {color_type::cyan, shape_type::circle}}, + {{{color_type::red, shape_type::square}, {color_type::green, shape_type::square}, {color_type::blue, shape_type::square}}, {color_type::white, shape_type::square}}, + {{{color_type::cyan, shape_type::square}, {color_type::magenta, shape_type::square}, {color_type::yellow, shape_type::square}}, {color_type::black, shape_type::square}}, + {{{color_type::white, shape_type::square}, {color_type::black, shape_type::square}}, {color_type::gray, shape_type::square}}, }, }, { - transformer_type::square_maker, + transformer_type::reshaper, { {{{color_type::gray, shape_type::circle}, {color_type::red, shape_type::circle}}, {color_type::red, shape_type::square}}, {{{color_type::gray, shape_type::circle}, {color_type::green, shape_type::circle}}, {color_type::green, shape_type::square}}, @@ -150,6 +154,13 @@ namespace gmtk {{{color_type::gray, shape_type::circle}, {color_type::cyan, shape_type::circle}}, {color_type::cyan, shape_type::square}}, {{{color_type::gray, shape_type::circle}, {color_type::magenta, shape_type::circle}}, {color_type::magenta, shape_type::square}}, {{{color_type::gray, shape_type::circle}, {color_type::yellow, shape_type::circle}}, {color_type::yellow, shape_type::square}}, + + // {{{color_type::white, shape_type::square}, {color_type::red, shape_type::square}}, {color_type::red, shape_type::hexagon}}, + // {{{color_type::white, shape_type::square}, {color_type::green, shape_type::square}}, {color_type::green, shape_type::hexagon}}, + // {{{color_type::white, shape_type::square}, {color_type::blue, shape_type::square}}, {color_type::blue, shape_type::hexagon}}, + // {{{color_type::white, shape_type::square}, {color_type::cyan, shape_type::square}}, {color_type::cyan, shape_type::hexagon}}, + // {{{color_type::white, shape_type::square}, {color_type::magenta, shape_type::square}}, {color_type::magenta, shape_type::hexagon}}, + // {{{color_type::white, shape_type::square}, {color_type::yellow, shape_type::square}}, {color_type::yellow, shape_type::hexagon}}, }, }, { @@ -405,11 +416,17 @@ namespace gmtk static stage_info stages[] { {{color_type::white, shape_type::circle}, 0, {}, {{color_type::white, shape_type::circle}}}, - {{color_type::white, shape_type::circle}, 10, {card_type::mixer}, {{color_type::black, shape_type::circle}}}, - {{color_type::gray, shape_type::circle}, 30, {card_type::hue_shifter, card_type::crossing}, {{color_type::red, shape_type::circle}}}, - {{color_type::green, shape_type::circle}, 30, {card_type::square_maker, card_type::crossing}, {}}, + {{color_type::white, shape_type::circle}, 15, {card_type::mixer}, {{color_type::black, shape_type::circle}}}, + {{color_type::gray, shape_type::circle}, 15, {card_type::hue_shifter, card_type::crossing}, {{color_type::red, shape_type::circle}}}, + {{color_type::green, shape_type::circle}, 15, {card_type::reshaper, card_type::crossing}, {}}, {{color_type::green, shape_type::square}, 30, {card_type::hue_shifter, card_type::crossing, card_type::zoomer}, {}}, - {{color_type::blue, shape_type::square}, 30, {card_type::hue_shifter, card_type::crossing}, {}}, + {{color_type::blue, shape_type::square}, 30, {card_type::mixer, card_type::crossing, card_type::zoomer}, {}}, + {{color_type::yellow, shape_type::square}, 30, {card_type::zoomer}, {}}, + {{color_type::magenta, shape_type::square}, 30, {}, {}}, + {{color_type::cyan, shape_type::square}, 30, {card_type::reshaper, card_type::reshaper, card_type::zoomer}, {{color_type::black, shape_type::circle}}}, + {{color_type::white, shape_type::square}, 45, {card_type::mixer, card_type::mixer, card_type::mixer, card_type::zoomer}, {{color_type::white, shape_type::circle}}}, + {{color_type::black, shape_type::square}, 45, {card_type::mixer, card_type::mixer, card_type::reshaper, card_type::reshaper, card_type::reshaper, card_type::zoomer}, {{color_type::red, shape_type::circle}}}, + {{color_type::gray, shape_type::square}, 60, {card_type::zoomer}, {}}, }; template @@ -662,6 +679,21 @@ namespace gmtk painter.rect(box, color); } break; + case shape_type::hexagon: + { + for (int i = 0; i < 2; ++i) + { + float r = (i == 0 ? 0.0875f : 0.0875f - 0.025f / std::sqrt(0.75f)) * scale; + auto c = (i == 0) ? bcolor : color; + for (int j = 0; j < 6; ++j) + { + float a = geom::rad(j * 60.f); + float b = geom::rad((j + 1) * 60.f); + painter.triangle(pos, pos + geom::direction(a) * r, pos + geom::direction(b) * r, c); + } + } + } + break; } } @@ -688,7 +720,7 @@ namespace gmtk painter.triangle(box.corner(0.f, 0.5f), box.corner(1.f, 0.5f), box.corner(0.5f, 0.f), color); painter.triangle(box.corner(0.f, 0.5f), box.corner(1.f, 0.5f), box.corner(0.5f, 1.f), color); break; - case transformer_type::square_maker: + case transformer_type::reshaper: painter.rect(box, color); break; case transformer_type::hue_shifter: @@ -717,7 +749,7 @@ namespace gmtk draw_structure(bbox, crossing{}, painter); break; case card_type::mixer: - case card_type::square_maker: + case card_type::reshaper: case card_type::hue_shifter: draw_structure(bbox, transformer{card_to_transformer(type).value()}, painter); break; @@ -900,8 +932,8 @@ namespace gmtk return {"Mixer", "Mixes input colors"}; case card_type::hue_shifter: return {"Hue shifter", "Shifts the hue of", " input colors"}; - case card_type::square_maker: - return {"Squarer", "Turns circles into squares"}; + case card_type::reshaper: + return {"Reshaper", "Turns circles into squares", " and squares into hexagons"}; case card_type::crossing: return {"Bridge", "Allows belts to cross", " without merging"}; case card_type::zoomer: @@ -915,6 +947,7 @@ namespace gmtk std::uint64_t make_seed() { + return 15249261661545616321ull; random::device d; return (std::uint64_t(d()) << 32) | d(); } @@ -1002,7 +1035,7 @@ namespace gmtk { case card_type::mixer: case card_type::hue_shifter: - case card_type::square_maker: + case card_type::reshaper: map_.world.create( vertex{*selected_}, transformer{card_to_transformer(*active_card_).value()} @@ -1114,6 +1147,21 @@ namespace gmtk for (auto type : card_type_values()) map_.cards[type] += 10; } + + if (event.down && event.key == app::keycode::NUM_1) + { + time_speed_ = 1.f; + } + + if (event.down && event.key == app::keycode::NUM_2) + { + time_speed_ = 2.f; + } + + if (event.down && event.key == app::keycode::NUM_3) + { + time_speed_ = 3.f; + } } bool running() const override @@ -1128,7 +1176,7 @@ namespace gmtk void update() override { - float const dt = clock_.restart().count(); + float const dt = clock_.restart().count() * time_speed_; map_.spawn_timer += 3.f * dt; if (map_.spawn_timer >= 1.f) @@ -1203,7 +1251,7 @@ namespace gmtk map_.world.apply([&](vertex const & v, transformer & t) { - boost::container::flat_map has_inputs; + boost::container::flat_multimap has_inputs; auto c = v.location.down(); auto ce = map_.world.index().get(c); @@ -1219,28 +1267,42 @@ namespace gmtk if (auto occ = map_.world.get(*ne).get_if()) if (auto i = map_.world.get(occ->entity).get_if()) if (i->start == p) - has_inputs[i->type] = p; + has_inputs.insert({i->type, p}); } bool crafted = false; for (auto const & recipe : recipies.at(t.type)) { - bool has_all = true; + boost::container::flat_set input_types; + for (auto type : recipe.inputs) - has_all &= has_inputs.contains(type); + input_types.insert(type); + + bool has_all = true; + for (auto type : input_types) + { + has_all &= (has_inputs.count(type) >= recipe.inputs.count(type)); + } if (!has_all) continue; - for (auto type : recipe.inputs) + for (auto type : input_types) { - auto l = has_inputs.at(type); - auto e = map_.world.index().get(l); - auto re = map_.world.get(e).get().entity; + auto it = has_inputs.lower_bound(type); - map_.world.detach(e); - map_.world.destroy(re); + for (int i = 0; i < recipe.inputs.count(type); ++i) + { + auto l = it->second; + auto e = map_.world.index().get(l); + auto re = map_.world.get(e).get().entity; + + map_.world.detach(e); + map_.world.destroy(re); + + ++it; + } } auto r = map_.world.create( @@ -1754,6 +1816,7 @@ namespace gmtk map map_; util::clock<> clock_; + float time_speed_ = 1.f; geom::vector screen_size_{1, 1}; geom::point mouse_{0, 0}; diff --git a/tree.xcf b/tree.xcf index 9d81db3..504356e 100644 Binary files a/tree.xcf and b/tree.xcf differ