Files
GDevelop/Core/GDCore/Events/Builtin/WhileEvent.h
Florian Rival 6bb56c6e5b Add support for local variables for loop events (While, Repeat, For Each, For Each Child Variable) and loop counter variable (#8273)
- "For Each Child Variable" now also properly support choosing local variables for the variable to iterate on, and for the variable where to store the child and the optional variable where to store the name.
- The loop counter starts from 0 and is automatically increased by 1 each time the event is repeated.
2026-02-15 16:14:04 +01:00

98 lines
3.5 KiB
C++

/*
* GDevelop Core
* Copyright 2008-2016 Florian Rival (Florian.Rival@gmail.com). All rights
* reserved. This project is released under the MIT License.
*/
#ifndef GDCORE_WHILEEVENT_H
#define GDCORE_WHILEEVENT_H
#include "GDCore/Events/Event.h"
#include "GDCore/Events/EventsList.h"
#include "GDCore/Project/VariablesContainer.h"
namespace gd {
class Instruction;
class Project;
}
namespace gd {
/**
* \brief While event is a standard event that is repeated while some conditions
* are true
*
* \note The platforms are required to warn the user about a possible infinite
* loop if the iteration count reach 100 000 and if HasInfiniteLoopWarning()
* returns true.
*/
class GD_CORE_API WhileEvent : public gd::BaseEvent {
public:
WhileEvent()
: infiniteLoopWarning(true),
justCreatedByTheUser(true),
variables(gd::VariablesContainer::SourceType::Local){};
virtual ~WhileEvent(){};
virtual gd::WhileEvent* Clone() const { return new WhileEvent(*this); }
virtual bool IsExecutable() const { return true; }
virtual bool CanHaveSubEvents() const { return true; }
virtual const gd::EventsList& GetSubEvents() const { return events; };
virtual gd::EventsList& GetSubEvents() { return events; };
virtual bool CanHaveVariables() const { return true; }
virtual const gd::VariablesContainer& GetVariables() const {
return variables;
};
virtual gd::VariablesContainer& GetVariables() { return variables; };
const gd::InstructionsList& GetConditions() const { return conditions; };
gd::InstructionsList& GetConditions() { return conditions; };
const gd::InstructionsList& GetActions() const { return actions; };
gd::InstructionsList& GetActions() { return actions; };
const gd::InstructionsList& GetWhileConditions() const {
return whileConditions;
};
gd::InstructionsList& GetWhileConditions() { return whileConditions; };
void SetWhileConditions(gd::InstructionsList& whileConditions_) {
whileConditions = whileConditions_;
};
bool HasInfiniteLoopWarning() const { return infiniteLoopWarning; }
const gd::String& GetLoopIndexVariableName() const { return loopIndexVariableName; }
void SetLoopIndexVariableName(const gd::String& name) { loopIndexVariableName = name; }
virtual std::vector<gd::InstructionsList*> GetAllConditionsVectors();
virtual std::vector<gd::InstructionsList*> GetAllActionsVectors();
virtual std::vector<const gd::InstructionsList*> GetAllConditionsVectors()
const;
virtual std::vector<const gd::InstructionsList*> GetAllActionsVectors() const;
virtual void SerializeTo(SerializerElement& element) const;
virtual void UnserializeFrom(gd::Project& project,
const SerializerElement& element);
private:
gd::InstructionsList whileConditions;
gd::InstructionsList conditions;
gd::InstructionsList actions;
EventsList events;
bool infiniteLoopWarning; ///< If true, code will be generated to warn the
///< developer against an infinite loop.
bool justCreatedByTheUser; ///< Used so as not to show message box to
///< de/activate infinite loop warning when the
///< user create the event
gd::VariablesContainer variables;
gd::String loopIndexVariableName;
int GetConditionsHeight() const;
int GetActionsHeight() const;
int GetWhileConditionsHeight() const;
};
} // namespace gd
#endif // GDCORE_WHILEEVENT_H