mapcreator git · master
SDL3 2.5D game and engine using assets, with map editor
C++ 99.3%git clone https://git.christianimmanuel.de/sdl-graphics/mapcreator.gitwget https://git.christianimmanuel.de/sdl-graphics/mapcreator/archive/mapcreator.tar.gzAdd collect vegetable BUT planting twice and remove soil?
src/character/character.cpp | 49 +++++++++++++++++++++++++++++++++---------- src/character/character.hpp | 1 + src/objects/object.cpp | 1 - src/vegetables/vegetables.cpp | 30 ++++++++++++++++++++------ src/vegetables/vegetables.hpp | 7 +++++-- 5 files changed, 68 insertions(+), 20 deletions(-) diff --git a/src/character/character.cpp b/src/character/character.cpp index a752dfb..85e4571 100644 --- a/src/character/character.cpp +++ b/src/character/character.cpp @@ -253,7 +253,7 @@ Character::Draw(SDL_Renderer* renderer) { 0.0, nullptr, flip ? SDL_FLIP_HORIZONTAL : SDL_FLIP_NONE); if (collecting_logic.is_collecting) { - float collecting_progress = collecting_logic.duration / collecting_logic.resource.collecting_duration; + float collecting_progress = collecting_logic.duration / collecting_logic.duration_max; size_t r = 6; draw_CircleProgress(renderer, Scale(Character::x + Character::tile_size/2), Scale(Character::y + Character::tile_size/6), Scale(r), collecting_progress); } @@ -422,6 +422,11 @@ Character::find_ClosestObject(SDL_Point* tile_found, ObjectCategory category) { || o->category == ObjectCategory::BUILDING) { *tile_found = tile_point; return &object; + } else + if (o->category == ObjectCategory::FARM_CROP) { + Vegetable* veg = static_cast<Vegetable*>(o); + if (veg->is_Collectable()) + return &object; } } } @@ -438,14 +443,26 @@ Character::collect_Start(TileObject* map_object_p, SDL_Point tile_point) { } else { //Tile::print_TileObject(*map_object_p); Object* object = Object::get_ObjectById(map_object_p->object_id); + set_Status(CharacterStatus::COLLECT); + std::cout << "stat: " << (int)status << std::endl; + collecting_logic.duration = 0; collecting_logic.object = map_object_p; - if (!map_object_p || object->category != ObjectCategory::RESOURCE) { + std::cout << "Item found!\n"; + if (!map_object_p || (object->category != ObjectCategory::RESOURCE && + object->category != ObjectCategory::FARM_CROP)) { + std::cout << "Invalid object: " << (int)object->category << std::endl; collect_Stop(); + return; + } + collecting_logic.duration_max = 3; + if (object->object_type != ObjectType::VEGETABLE) { + collecting_logic.resource = Tile::get_ResourceFromTileSet(object->tileset_id, object->tileset_object_id); + collecting_logic.duration_max = collecting_logic.resource.collecting_duration; + } else { + collecting_logic.duration_max = static_cast<Vegetable*>(object)->collecting_duration_max; } - std::cout << "Item found!\n"; - collecting_logic.resource = Tile::get_ResourceFromTileSet(object->tileset_id, object->tileset_object_id); collecting_logic.is_collecting = true; float dx = (tile_point.x * Tile::tile_size + Tile::tile_size * 0.5f) @@ -476,19 +493,26 @@ Character::collect_Start(TileObject* map_object_p, SDL_Point tile_point) { void Character::collect_Object() { collecting_logic.duration += Default::delta_time; - if (collecting_logic.duration >= collecting_logic.resource.collecting_duration) { + if (collecting_logic.duration >= collecting_logic.duration_max) { std::cout << "Collected item!\n"; // Remove object from MapTileObject s - inventory->add_Resource(collecting_logic.resource.resource, static_cast<int>(collecting_logic.resource.quantity), messages.get()); + Object* object = Object::get_ObjectById(collecting_logic.object->object_id); + if (object->object_type == ObjectType::VEGETABLE) + inventory->add_Vegetable(static_cast<Vegetable*>(object)->type, static_cast<Vegetable*>(object)->quantity, messages.get()); + else + inventory->add_Resource(collecting_logic.resource.resource, static_cast<int>(collecting_logic.resource.quantity), messages.get()); /* resources[collecting_logic.resource.resource] += collecting_logic.resource.quantity; */ set_ResourceDiscovery(collecting_logic.resource.resource); - TileObject* to = collecting_logic.object; - Object::Remove(Object::get_ObjectById(to->object_id)); - + if (object->object_type == ObjectType::VEGETABLE) { + static_cast<Vegetable*>(object)->pick_Up(); + } else { + TileObject* to = collecting_logic.object; + Object::Remove(Object::get_ObjectById(to->object_id)); + } collect_Stop(); } } @@ -845,7 +869,7 @@ Character::plant_Vegetable() { if (planting_logic.duration >= planting_logic.duration_max) { const VegetableData::CropDefinition* crop_def = VegetableData::get_DataByType(planting_logic.type); std::cout << "DEF " << (int)planting_logic.type << " " << crop_def->name << std::endl; - Vegetable* v = new Vegetable(crop_def, planting_logic.tile_world); + Vegetable* v = new Vegetable(crop_def, planting_logic.type, planting_logic.tile_world); TileObject to = {{0,0}, true, v->id}; size_t id = Map::get_IdFromTilePoint(planting_logic.tile_world); std::cout << " " << id << std::endl; @@ -1270,7 +1294,9 @@ Character::handle_Input(Input& input, SDL_Rect win_size) { Object* object = Object::get_ObjectById(map_object_p->object_id); switch (object->category) { case ObjectCategory::RESOURCE: + case ObjectCategory::FARM_CROP: collect_Start(map_object_p, tile_point); + std::cout << "STAT: " << (int)status << std::endl; break; case ObjectCategory::BUILDING: interact_WithBuilding(static_cast<Building*>(object)); @@ -1461,8 +1487,9 @@ void Character::handle_Move() { } - if (collecting_logic.is_collecting) + if (collecting_logic.is_collecting) { collect_Stop(); + } if (consuming_logic.is_consuming) drink_Stop(); diff --git a/src/character/character.hpp b/src/character/character.hpp index be6c4c6..38dd7f9 100644 --- a/src/character/character.hpp +++ b/src/character/character.hpp @@ -47,6 +47,7 @@ struct CharacterMoveLogic { struct CharacterCollectingLogic { float duration; + float duration_max; TileObject* object; Resource_s resource; bool is_collecting; diff --git a/src/objects/object.cpp b/src/objects/object.cpp index 4794381..a0cbcb4 100644 --- a/src/objects/object.cpp +++ b/src/objects/object.cpp @@ -272,6 +272,5 @@ Object::Remove(Object* obj) { } } - objects.erase( std::remove_if(objects.begin(), objects.end(), [obj](Object* o) { return o->id == obj->id; }), objects.end()); delete obj; } diff --git a/src/vegetables/vegetables.cpp b/src/vegetables/vegetables.cpp index 080ead2..2a8a7cd 100644 --- a/src/vegetables/vegetables.cpp +++ b/src/vegetables/vegetables.cpp @@ -7,6 +7,7 @@ namespace VegetableData { std::vector<Vegetable*> all_vegetables; const CropDefinition crop_defs[(int)Type::COUNT] = { + // STAGE: 0 1 2 3 4 { "",0,0,0,0,0,0,0,0,0,0,0 }, { "carrot", 2,1, 5,1, 6,1, 7,1, 23,0, (5-2+1)+1}, { "raddish", 2,3, 5,3, 6,3, 7,3, 23,1, (5-2+1)+1}, @@ -26,7 +27,7 @@ namespace VegetableData { } } -Vegetable::Vegetable(const VegetableData::CropDefinition* cd, +Vegetable::Vegetable(const VegetableData::CropDefinition* cd, VegetableData::Type t, SDL_Point world_pos) : Object(ObjectType::VEGETABLE, @@ -37,15 +38,18 @@ Vegetable::Vegetable(const VegetableData::CropDefinition* cd, world_pos, {1,1}, 0), + type(t), definition(cd), growth_stage(0), - last_update_sec(Default::get_TimeSinceStartInSec()), + next_update_sec(Default::get_TimeSinceStartInSec()), equipement_slot(EquipmentSlot::HAND_RIGHT) { tileset_object_x = definition->start_tile_x; tileset_object_y = definition->start_tile_y; VegetableData::all_vegetables.push_back(this); + collecting_duration_max = 3.2; + objects.push_back(this); update_TilesetId(); @@ -72,11 +76,12 @@ Vegetable::get_SetPosition() { static constexpr double SECONDS_PER_STAGE = 5.0; + void Vegetable::Grow(double current_seconds) { - if (current_seconds <= last_update_sec) + if (current_seconds <= next_update_sec) return; - double delta_sec = current_seconds - last_update_sec; + double delta_sec = current_seconds - next_update_sec; size_t delta_stages = static_cast<size_t>(delta_sec / SECONDS_PER_STAGE); //std::cout << "GROW " << delta_stages << " " << delta_sec << " " << SECONDS_PER_STAGE << std::endl; @@ -84,7 +89,13 @@ void Vegetable::Grow(double current_seconds) { if (delta_stages == 0) return; - last_update_sec += static_cast<double>(delta_stages) * SECONDS_PER_STAGE; + + // MULTIPLY LAST STAGE + int grow_multiplier = 3; + if (growth_stage == (definition->total_stages - 3)) + next_update_sec += static_cast<double>(delta_stages) * SECONDS_PER_STAGE*grow_multiplier; + else + next_update_sec += static_cast<double>(delta_stages) * SECONDS_PER_STAGE; growth_stage += delta_stages; if (growth_stage >= definition->total_stages) @@ -103,7 +114,14 @@ bool Vegetable::is_FullyGrown() const { void Vegetable::pick_Up() { // mark as removed → caller inserts into inventory - delete this; + for (auto it = VegetableData::all_vegetables.begin(); it != VegetableData::all_vegetables.end(); ++it) { + if (*it == this) { + VegetableData::all_vegetables.erase(it); + break; + } + } + + Object::Remove(Object::get_ObjectById(id)); } bool Vegetable::is_Collectable() const { diff --git a/src/vegetables/vegetables.hpp b/src/vegetables/vegetables.hpp index 3e2ba2e..982291d 100644 --- a/src/vegetables/vegetables.hpp +++ b/src/vegetables/vegetables.hpp @@ -52,16 +52,19 @@ namespace VegetableData { class Vegetable : public Object, public IsCollectable { public: + VegetableData::Type type; const VegetableData::CropDefinition* definition; + size_t quantity = 2; size_t growth_stage; // 0 = planted, last = rotten - double last_update_sec; // seconds since game start + double next_update_sec; // seconds since game start + float collecting_duration_max; int tileset_object_x = 0; int tileset_object_y = 0; EquipmentSlot equipement_slot; - Vegetable(const VegetableData::CropDefinition* cd, + Vegetable(const VegetableData::CropDefinition* cd, VegetableData::Type t, SDL_Point world_pos); SDL_Point get_SetPosition() override;