// Online C++ compiler to run C++ program online
using namespace std;
#include <iostream>
#include <vector>
struct boarditem {
float cd;
int burn;
float remainingcd;
bool ray;
};
struct SimData {
vector<int> binaryval;
vector<int> damages;
string kek;
};
boarditem newitem (float cd, int burn, bool ray){
return {cd, burn, cd, ray};
}
boarditem core = newitem(7.0f, 10, true);
int enemyburn = 0;
int totaldamage = 0;
int firstburntick = 70;
int coreburninc = 3;
int omegarayvalue = 0;
vector<boarditem> leftItems;
vector<boarditem> rightItems;
void omegaray(){
for (auto& elem : leftItems){
if (elem.burn>0){
elem.burn+=omegarayvalue;
}
}
core.burn+=omegarayvalue;
for (auto& elem : rightItems){
if (elem.burn>0){
elem.burn+=omegarayvalue;
}
}
}
void activatecore(){
for (auto& elem : rightItems){
if (elem.burn>0){
elem.burn+=coreburninc;
}
}
}
bool tickitem(boarditem& elem, int i, bool iscore, bool print){
elem.remainingcd-=0.1f;
if (elem.remainingcd<=0){
elem.remainingcd = elem.cd-0.1f;
if (elem.ray == true){
omegaray();
}
if (iscore){
activatecore();
}
if (elem.burn>0){
if (enemyburn == 0){
firstburntick = i;
}
enemyburn += elem.burn;
float temptime = i;
temptime = temptime/10;
if(print){
cout<< "time: "<<temptime<<" burn applied: " <<elem.burn <<endl;
}
}
return true;
}
return false;
}
vector<SimData> everybinary(int length) {
if (length <= 0) {
return {};
}
std::vector<SimData> result;
result.reserve(1 << length);
for (int i = 0; i < (1 << length); ++i) {
SimData combo;
combo.binaryval.clear(); // Clear the vector before adding new values
int temp = i;
while (temp > 0) {
combo.binaryval.push_back(temp % 2);
temp /= 2;
}
// Add leading zeros if needed
while (combo.binaryval.size() < length) {
combo.binaryval.push_back(0);
}
string returnkek;
for (auto& elem:combo.binaryval){
if (elem == 0){
returnkek.append("Left");
}else{
returnkek.append("Right");
}
}
combo.kek = returnkek;
result.push_back(combo);
}
return result;
}
vector<int> simulate(bool print){
vector<int> returnval;
for (int i = 0; i<=300; i++){
if (enemyburn>0){
if ((i - firstburntick)%5 == 0){
totaldamage+=enemyburn;
float temptime = i;
temptime = temptime/10;
if(print){
cout<< " time passed: " <<temptime << " enemy burn: " <<enemyburn <<" total burn damage: " << totaldamage << endl;
}
enemyburn-=1;
}
}
for (auto& elem : leftItems){
bool temp = tickitem(elem, i, false, print);
if (temp){
core.remainingcd-=0.9;
tickitem(core,i, true, print);
}
}
bool coretriggercheck = tickitem(core,i, true, print);
for (auto& elem : rightItems){
bool temp = tickitem(elem, i, false, print);
}
if (i%5==0){
returnval.push_back(totaldamage);
}
}
return returnval;
}
vector<int> SimAndReset(){
vector<boarditem> templeftItems = leftItems;
vector<boarditem> temprightItems = rightItems;
boarditem originalcore = core;
vector<int> returnval = simulate(false); //tbl = total burn left
leftItems = templeftItems;
rightItems = temprightItems;
enemyburn = 0;
totaldamage = 0;
core = originalcore;
return returnval;
}
void comparesides(vector <boarditem> testitems){
vector <SimData> results = everybinary(testitems.size());
for (auto& col : results){
for (int i = 0; i<col.binaryval.size(); i++){
boarditem compareitem = testitems[i];
int left = 0;
int right = 0;
if (col.binaryval[i] == 0){
leftItems.push_back(compareitem);
left++;
}else{
rightItems.push_back(compareitem);
right++;
}
col.damages = SimAndReset(); //tbr = totalburnright
for (int i = 0; i < left; i++){
leftItems.pop_back();
}
for (int i = 0; i < left; i++){
rightItems.pop_back();
}
}
}
int maxdam;
string maxcol;
for (int i = 0; i < 61; i++){
maxdam = 0;
string tempmaxcol = "";
string printrow = "";
for (int c = 0; c<results.size(); c++){
SimData printcolumn = results[c];
int tempdamage = printcolumn.damages[i];
if (tempdamage>maxdam){
maxdam = tempdamage;
tempmaxcol = printcolumn.kek;
}
printrow.append("\t \t"+ printcolumn.kek + " damage: "+ to_string(tempdamage));
}
if (tempmaxcol!=maxcol){
maxcol = tempmaxcol;
cout<<maxcol<<" does most damage here"<<endl;
}
float time = 0.5f * i;
cout<<"time = "<<time<<printrow<<endl;
}
}
int main() {
int firstburn = 0;
leftItems = {
newitem(4.0f, 0, false),
newitem(4.0f, 0, false),
newitem(4.0f, 0, false)
};
rightItems = {
newitem(3.7f, 0, false),
newitem(4.0f, 0, false)
};
bool compare = true;
if (compare){
vector <boarditem> compareItems = {
newitem(5.5f, 4, false),
newitem(3.6f, 2, false)
};
comparesides(compareItems);
}else{
simulate(true);
}
return 0;
}