// 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;
};
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<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;
}
void comparesides(float cd, int burn, bool ray){
boarditem compareitem = newitem(cd,burn,ray);
vector<boarditem> templeftItems = leftItems;
vector<boarditem> temprightItems = rightItems;
boarditem originalcore = core;
leftItems.push_back(compareitem);
vector<int> tbl = simulate(false); //tbl = total burn left
leftItems = templeftItems;
rightItems = temprightItems;
enemyburn = 0;
totaldamage = 0;
core = originalcore;
compareitem = newitem(cd,burn,ray);
rightItems.push_back(compareitem);
vector<int> tbr = simulate(false); //tbr = totalburnright
rightItems.pop_back();
bool leftbetter = true;
for (int index = 0; index < tbl.size(); index++){
int leftelem = tbl[index];
int rightelem = tbr[index];
if (rightelem>leftelem&&leftbetter){
leftbetter = false;
cout<<"Right does more damage here"<<endl;
}else if (rightelem<leftelem && !leftbetter){
leftbetter = true;
cout<<"Left does more damage here"<<endl;
}
float time = 0.5f * index;
cout<< "time = "<<time<<" \tLeft damage: "<<leftelem << " \tRight damage: "<<rightelem<<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, 3, false),
newitem(4.0f, 0, false)
};
bool compare = true;
if (compare){
comparesides(3.0f,4,false);
}else{
simulate(true);
}
return 0;
}