Last active
April 25, 2023 21:46
-
-
Save Broxzier/dc82b3134a2f86a4b1e3ffd8a355980c to your computer and use it in GitHub Desktop.
Draft of how a scenario objective system could be made
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#pragma once | |
#include <variant> | |
#include "Deadline.h" | |
#include "GuestCount.h" | |
#include "ParkValue.h" | |
namespace Objectives | |
{ | |
using Condition = std::variant<Deadline, GuestCount, ParkValue>; | |
using ScrenarioObjective = Objective<Condition>; | |
} // namespace Objectives |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#include "Deadline.h" | |
// Globals - refactor to get through objective variable interface | |
Date gDate = 0; | |
bool gEarlyScenarioCompletion = false; | |
namespace Objectives | |
{ | |
Deadline::Deadline(Date deadline) | |
: _deadline(deadline * 30 * 8) // Converts days to years | |
{ | |
} | |
Status Deadline::OnDailyCheck() const | |
{ | |
if (gDate > _deadline) | |
return Status::Failed; | |
if (gDate == _deadline || gEarlyScenarioCompletion) | |
return Status::Complete; | |
return Status::Incomplete; | |
} | |
} // namespace Objectives |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#pragma once | |
#include "Status.h" | |
using Date = int; | |
namespace Objectives | |
{ | |
class Deadline | |
{ | |
public: | |
Deadline(Date deadline); | |
Status OnDailyCheck() const; | |
private: | |
Date _deadline; | |
}; | |
} // namespace Objectives |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#include "GuestCount.h" | |
// Global - refactor to get through objective variable interface | |
int gGuestCount = 0; | |
namespace Objectives | |
{ | |
GuestCount::GuestCount(int parkValue) | |
: _requiredGuests(parkValue) | |
{ | |
} | |
Status GuestCount::OnDailyCheck() const | |
{ | |
return gGuestCount >= _requiredGuests ? Status::Complete : Status::Incomplete; | |
} | |
} // namespace Objectives |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#pragma once | |
#include "Status.h" | |
namespace Objectives | |
{ | |
class GuestCount | |
{ | |
public: | |
GuestCount(int parkValue); | |
Status OnDailyCheck() const; | |
private: | |
int _requiredGuests; | |
}; | |
} // namespace Objectives |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#pragma once | |
#include <list> | |
#include <variant> | |
namespace Objectives | |
{ | |
template <typename TCondition> | |
class Objective | |
{ | |
public: | |
Objective() | |
: _conditions({ | |
GuestCount(123), | |
ParkValue(700), | |
Deadline(4), | |
}) | |
{ | |
} | |
Status Evaluate() const | |
{ | |
auto onDailyCheck = [](const auto& condition) constexpr { | |
return condition.OnDailyCheck(); | |
}; | |
auto state = Status::Complete; | |
for (const auto& condition : _conditions) | |
{ | |
const auto result = std::visit(onDailyCheck, condition); | |
switch (result) | |
{ | |
case Status::Failed: | |
return Status::Failed; | |
case Status::Incomplete: | |
state = Status::Incomplete; | |
break; | |
} | |
} | |
return state; | |
} | |
private: | |
std::list<TCondition> _conditions; | |
}; | |
} // namespace Objectives |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#include "ParkValue.h" | |
// Global - refactor to get through objective variable interface | |
int gParkValue = 0; | |
namespace Objectives { | |
ParkValue::ParkValue(int parkValue) | |
: _desiredParkValue(parkValue) | |
{ | |
} | |
Status ParkValue::OnDailyCheck() const | |
{ | |
return gParkValue >= _desiredParkValue ? Status::Complete : Status::Incomplete; | |
} | |
} // namespace Objectives |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#pragma once | |
#include "Status.h" | |
namespace Objectives { | |
class ParkValue | |
{ | |
public: | |
ParkValue(int parkValue); | |
Status OnDailyCheck() const; | |
private: | |
int _desiredParkValue; | |
}; | |
} // namespace Objectives |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#include <cstdio> | |
#include "Condition.h" | |
#include "Objective.hpp" | |
class Scenario | |
{ | |
public: | |
void OnDailyTick() | |
{ | |
// Game tick... | |
//gDate++; | |
//gGuestCount++; | |
//gParkValue++; | |
auto state = _objective.Evaluate(); | |
if (state == Objectives::Status::Failed) | |
std::puts("Scenario failed"); | |
else if (state == Objectives::Status::Complete) | |
std::puts("Scenario finished"); | |
} | |
private: | |
Objectives::ScrenarioObjective _objective; | |
}; | |
int main() | |
{ | |
Scenario scenario; | |
while (true) | |
{ | |
scenario.OnDailyTick(); | |
} | |
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#pragma once | |
namespace Objectives | |
{ | |
enum class Status | |
{ | |
Failed, | |
Complete, | |
Incomplete, | |
}; | |
} // namespace Objectives |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment