0.0.2 part 1

(don’t look)
This commit is contained in:
moganda12 2024-08-10 05:41:29 +00:00
parent 2440c561f2
commit 59ba3d7377
5 changed files with 459 additions and 45 deletions

2
.gitignore vendored
View File

@ -3,3 +3,5 @@
clicker
moneymaker
log.txt
a.out
💣.c

View File

@ -1,2 +1,2 @@
g++ $1 -o $2 -O3 -std=c++23 -pthread -lgmp -lgmpxx
g++ $1 -o $2 -O3 -std=c++23 -pthread -lgmp -lgmpxx -s
#./$2

View File

@ -1,9 +1,8 @@
{ pkgs }: {
deps = [
pkgs.fuse-emulator
pkgs.kmod
pkgs.sshfs
pkgs.openssh
pkgs.neofetch
pkgs.sshfs
pkgs.openssh
pkgs.clang
pkgs.ccls
pkgs.gdb

View File

@ -5,14 +5,14 @@
#include <sstream>
namespace GRP {
mpq_class pow(mpq_class base, mpz_class exp) {
mpq_class result = 1;
for (mpz_class i = 0; i < exp; i++)
result *= base;
return result;
}
mpz_class precision;
mpz_class kilo = 1'000;
std::vector<std::string> formatLong = {" thousand"," million"," billion"," trillion"," quadrillion"," quintillion"," sextillion"," septillion"," octillion"," nonillion"};
@ -23,7 +23,11 @@ namespace GRP {
return x.get_num() / x.get_den();
}
std::string toString(mpq_class x) {
mpz_class operator%(mpz_class a, mpz_class b) {
return a - (a / b) * b;
}
std::string toString(mpq_class x, mpz_class precision = 1) {
std::stringstream result;
if (x >= 1'000'000) {
size_t suffix = 1;
@ -57,10 +61,20 @@ namespace GRP {
return result.str();
} else {
x *= 10;
mpz_class big = round(x/10);
mpz_class big = round(x);
mpz_class small = round(x - big * 10);
std::string small = "";
std::string smallBuf = "";
bool smallHasDigits = false;
for(mpz_class i = 1; i <= precision; i++) {
mpz_class digit = round(x * pow(10, i)) % 10;
smallBuf.append(digit.get_str());
if(digit != 0) {
smallHasDigits = true;
small.append(smallBuf);
}
}
mpz_class kilos = big / kilo;
mpz_class ones = big - kilos * kilo;
@ -73,7 +87,7 @@ namespace GRP {
result << kilos << ',' << onesf;
} else {
if(small != 0) result << ones << '.' << small;
if(smallHasDigits) result << ones << '.' << small;
else result << ones;
}
@ -83,9 +97,7 @@ namespace GRP {
return "error: HOW!";
}
void init(mpz_class precision = 1) {
precision = pow(precision, 10);
void init() {
for(int i = 0; i < suffixes.size(); i++) {
for(int j = 0; j < prefixes.size(); j++) {
formatLong.push_back(' ' + prefixes[j] + suffixes[i]);

View File

@ -5,7 +5,7 @@
#include "./lib/CMD.hpp"
#include "./lib/GRP.hpp"
#define RESET "\033[0m"
#define RESET "\033[0m" /* Reset */
#define BLACK "\033[30m" /* Black */
#define RED "\033[31m" /* Red */
#define GREEN "\033[32m" /* Green */
@ -46,6 +46,23 @@ enum Buildings {
oaktree = 6580827420282859339
};
struct Upgrade {
str name;
str description;
str effect;
str flavortext;
number cost;
bool unlocked;
bool purchased;
};
struct Acheivement {
str name;
str description;
str flavortext;
bool completed;
};
struct TclickerSave {
number transistorBalance;
number totalTransistors;
@ -57,16 +74,83 @@ struct TclickerSave {
//integer i860s, startups, oakTrees;
bool cursorUnlocked, mossUnlocked, smallFABUnlocked, mediumFABUnlocked, largeFABUnlocked;
//bool i860Unlocked, startupUnlocked, oakTreeUnlocked;
std::vector<Upgrade> upgrades;
std::vector<Acheivement> acheivements;
};
class UpgradeGroup {
private:
std::vector<size_t> upgradeIndices;
std::vector<Upgrade>* upgradeList;
public:
UpgradeGroup(std::vector<Upgrade>* upgradeList) {
this->upgradeList = upgradeList;
}
Upgrade& operator[] (size_t index) {
std::vector<Upgrade>& Ulist = *upgradeList;
return Ulist[upgradeIndices[index]];
}
void append(size_t index) {
upgradeIndices.push_back(index);
}
size_t size() {
return upgradeIndices.size();
}
class Iterator {
private:
size_t index;
UpgradeGroup& group;
public:
Iterator(size_t index, UpgradeGroup& group) : index(index), group(group) {}
void operator++() {
index++;
}
Upgrade& operator*() {
return this->group[this->index];
}
bool operator!=(const Iterator& other) {
return this->index != other.index;
}
};
Iterator begin() {
return Iterator(0, *this);
}
Iterator end() {
return Iterator(this->upgradeIndices.size(), *this);
}
};
str tolower(str s) {
str ret = "";
for(int i = 0; i < s.length(); i++) {
ret += tolower(s[i]);
}
return ret;
}
struct Trigger {
CMD::Condition condition;
CMD::Result result;
bool selfdelete = true;
};
std::vector<Trigger> triggers;
TclickerSave save = {0, 0, 0, 0, 0, 0, 0, 0, false, false, false, false, false};
std::unordered_map<str, size_t> upgradeIndex;
std::unordered_map<str, size_t> acheivementIndex;
TclickerSave save = {0, 0, 0, 0, 0, 0, 0, 0, false, false, false, false, false, {}, {}};
const str name = "Transistor Clicker";
const str version = "0.0.1_2";
@ -75,16 +159,38 @@ const number cursorPrice = 15, mossPrice = 100, smallFABPrice = 1'000, mediumFAB
const number cursorYeild = 0.1, mossYeild = 1, smallFABYeild = 10, mediumFABYeild = 60, largeFABYeild = 260, intelI860Yeild = 1'700, startupYeild = 10'000, oakTreeYeild = 120'000;
const number expantionFactor = number(23, 20);
integer toInt(number x) {
return integer(x);
UpgradeGroup cursorUpgrades(&save.upgrades);
UpgradeGroup mossUpgrades(&save.upgrades);
UpgradeGroup smallFABUpgrades(&save.upgrades);
UpgradeGroup mediumFABUpgrades(&save.upgrades);
UpgradeGroup largeFABUpgrades(&save.upgrades);
void createUpgrade(str Uname, str description, str effect, str flavortext, number cost) {
save.upgrades.push_back({Uname, description, effect, flavortext, cost, false, false});
upgradeIndex[Uname] = save.upgrades.size() - 1;
}
str tolower(str s) {
str ret = "";
for(int i = 0; i < s.length(); i++) {
ret += tolower(s[i]);
}
return ret;
void createUpgrade(str Uname, str description, str effect, str flavortext, number cost, UpgradeGroup& group) {
save.upgrades.push_back({Uname, description, effect, flavortext, cost, false, false});
upgradeIndex[Uname] = save.upgrades.size() - 1;
group.append(upgradeIndex[Uname]);
}
void createAcheivement(str achName, str description, str flavortext) {
save.acheivements.push_back({achName, description, flavortext, false});
acheivementIndex[achName] = save.acheivements.size() - 1;
}
size_t getUpgradeByName(str Uname) {
return upgradeIndex[tolower(Uname)];
}
size_t getAcheivementByHandle(str handle) {
return acheivementIndex[handle];
}
integer toInt(number x) {
return integer(x);
}
number pow(number base, integer exponent) {
@ -120,14 +226,20 @@ void clear(std::vector<str>&) {
printTitileCard();
}
str numString(number x, str thing, str plural = "s", bool round = true, str colA = BOLDGREEN, str colB = BOLDBLUE) {}
str numString(number x, str thing, str plural = "s", integer precision = 0, str colA = BOLDGREEN, str colB = BOLDBLUE) {
std::stringstream result;
str TransitorsString(number transistors, bool round = true, str colA = BOLDGREEN, str colB = BOLDBLUE) {
std::stringstream ss;
if(round) transistors = GRP::round(transistors);
str plural = GRP::round(transistors * 10) / 10 == 1 ? "transistor" : "transistors";
ss << colA << GRP::toString(transistors) << ' ' << colB << plural;
return ss.str();
str numStr = GRP::toString(x, precision);
thing.append(numStr == "1" ? "" : plural);
result << colA << numStr << ' ' << colB << thing;
return result.str();
}
str TransitorsString(number transistors, integer precision = 0, str colA = BOLDGREEN, str colB = BOLDBLUE) {
return numString(transistors, "transistor", "s", precision, colA, colB);
}
void unlockCursor(std::vector<str>& args) {
@ -175,24 +287,147 @@ void increaseTransistors(number by) {
save.totalTransistors += by;
}
bool canUnLockIntegratedMouse(std::vector<str>& args) {
return save.cusors >= 1;
}
bool canUnLockFastFing(std::vector<str>& args) {
return save.cusors >= 1;
}
bool canUnLockChippy(std::vector<str>& args) {
return save.cusors >= 10;
}
bool canUnLockMossyMossy(std::vector<str>& args) {
return save.moss >= 1;
}
bool canUnLockMossWalls(std::vector<str>& args) {
return save.moss >= 5;
}
bool canUnLockCheapMachines(std::vector<str>& args) {
return save.smallFABs >= 1;
}
bool canUnLockDenseChips(std::vector<str>& args) {
return save.smallFABs >= 5;
}
bool canUnLockMossyTech(std::vector<str>& args) {
return save.mediumFABs >= 1;
}
bool canUnLockEndgame(std::vector<str>& args) {
return save.largeFABs >= 1;
}
void unLockIntegratedMouse(std::vector<str>& args) {
Upgrade& FasterFingers = save.upgrades[getUpgradeByName("integrated mouse")];
FasterFingers.unlocked = true;
}
void unLockFastFing(std::vector<str>& args) {
Upgrade& FasterFingers = save.upgrades[getUpgradeByName("faster fingers")];
FasterFingers.unlocked = true;
}
void unLockChippy(std::vector<str>& args) {
Upgrade& Chippy = save.upgrades[getUpgradeByName("chippy")];
Chippy.unlocked = true;
}
void unLockMossyMossy(std::vector<str>& args) {
Upgrade& MossyMossy = save.upgrades[getUpgradeByName("mossy mossy")];
MossyMossy.unlocked = true;
}
void unLockMossWalls(std::vector<str>& args) {
Upgrade& MossyMossy = save.upgrades[getUpgradeByName("moss walls")];
MossyMossy.unlocked = true;
}
void unLockCheapMachines(std::vector<str>& args) {
Upgrade& CheapMachines = save.upgrades[getUpgradeByName("cheap lithography machines")];
CheapMachines.unlocked = true;
}
void unLockDenseChips(std::vector<str>& args) {
Upgrade& DenseChips = save.upgrades[getUpgradeByName("denser chips")];
DenseChips.unlocked = true;
}
void unLockMossyTech(std::vector<str>& args) {
Upgrade& MossyTech = save.upgrades[getUpgradeByName("mossier tech")];
MossyTech.unlocked = true;
}
void unLockEndgame(std::vector<str>& args) {
Upgrade& Endgame = save.upgrades[getUpgradeByName("endgame")];
Endgame.unlocked = true;
}
number calcCursorYeild() {
return save.cusors * cursorYeild;
number yeild = cursorYeild;
for(Upgrade& upgrade : cursorUpgrades) {
if(upgrade.purchased) yeild *= 2;
}
return yeild * save.cusors;
}
number calcMossYeild() {
return save.moss * mossYeild;
number yeild = mossYeild;
for(Upgrade& upgrade : mossUpgrades) {
if(upgrade.purchased) yeild *= 2;
}
return yeild * save.moss;
}
number calcSmallFABYeild() {
return save.smallFABs * smallFABYeild;
number yeild = smallFABYeild;
for(Upgrade& upgrade : smallFABUpgrades) {
if(upgrade.purchased) yeild *= 2;
}
for(Upgrade& upgrade : mediumFABUpgrades) {
if(upgrade.purchased) yeild *= 2;
}
for(Upgrade& upgrade : largeFABUpgrades) {
if(upgrade.purchased) yeild *= 2;
}
return yeild *= save.smallFABs;
}
number calcMediumFABYeild() {
return save.mediumFABs * mediumFABYeild;
number yeild = mediumFABYeild;
for(Upgrade& upgrade : mediumFABUpgrades) {
if(upgrade.purchased) yeild *= 2;
}
for(Upgrade& upgrade : largeFABUpgrades) {
if(upgrade.purchased) yeild *= 2;
}
return yeild * save.mediumFABs;
}
number calcLargeFABYeild() {
return save.largeFABs * largeFABYeild;
number yeild = largeFABYeild;
for(Upgrade& upgrade : largeFABUpgrades) {
if(upgrade.purchased) yeild *= 2;
}
return yeild * save.largeFABs;
}
number calcTPS() {
@ -217,8 +452,18 @@ void onExit(std::vector<str>&) {
CMD::log("Terminating...");
}
number calcClickYeild() {
number yeild = 1;
for(size_t i = 0; i < cursorUpgrades.size(); i++) {
if(cursorUpgrades[i].purchased) yeild *= 2;
}
return yeild;
}
void click() {
number clickValue = 1;
number clickValue = calcClickYeild();
increaseTransistors(clickValue);
save.clicks++;
std::cout << BOLDWHITE << "Click! " << BOLDBLUE << "You made " << TransitorsString(clickValue) << RESET << '\n';
@ -294,8 +539,8 @@ void balance(std::vector<str>& args) {
number percent = producing / TPS * 100;
std::cout << BOLDBLUE << "You have " << BOLDGREEN << count << BOLDBLUE << ' ' << buildingName << "s, each producing " << TransitorsString(yeild) << " per second.\n";
std::cout << "which produces " << TransitorsString(producing, false) << " per second in total which accounts for " << BOLDGREEN << GRP::toString(percent) << "%" << BOLDBLUE << " of your total TPS.\n";
std::cout << BOLDBLUE << "You have " << numString(count, buildingName) <<", each producing " << TransitorsString(yeild, 1) << " per second.\n";
std::cout << "which produces " << TransitorsString(producing, 1) << " per second in total which accounts for " << BOLDGREEN << GRP::toString(percent, 2) << "%" << BOLDBLUE << " of your total TPS.\n";
std::cout << "One " << buildingName << " would cost " << TransitorsString(expandPrice(basePrice, count)) << ".\n";
return;
} else {
@ -307,12 +552,51 @@ void balance(std::vector<str>& args) {
}
std::cout << BOLDBLUE << "You have " << TransitorsString(save.transistorBalance) << ".\n";
std::cout << BOLDBLUE << "You have made " << TransitorsString(save.totalTransistors) << " in total.\n";
std::cout << BOLDBLUE << "You make " << TransitorsString(calcTPS(), false) << " per second.\n";
std::cout << BOLDBLUE << "You make " << TransitorsString(calcTPS(), 1) << " per second.\n";
CMD::log("They have" + TransitorsString(save.transistorBalance, "", "") + "!");
CMD::log("They have " + TransitorsString(save.transistorBalance, 0, "", "") + "!");
}
void buy(std::vector<str>& args) {
if(args.size() > 1) {
if(args[0] == "upgrade") {
str Uname = "";
for(size_t i = 1; i < args.size(); i++) {
Uname += args[i];
if(i != args.size() - 1) Uname += " ";
}
if(upgradeIndex.find(tolower(Uname)) == upgradeIndex.end()) {
std::cout << BOLDRED << "Unknown upgrade!\n";
return;
}
Upgrade& upgrade = save.upgrades[getUpgradeByName(Uname)];
if(!upgrade.unlocked) {
std::cout << BOLDRED << "Unkown upgrade!\n";
return;
}
if(upgrade.purchased) {
std::cout << BOLDRED << "You already have this upgrade!\n";
return;
}
if(save.transistorBalance >= upgrade.cost) {
save.transistorBalance -= upgrade.cost;
upgrade.purchased = true;
std::cout << BOLDBLUE << "You bought " << upgrade.name << " for " << TransitorsString(upgrade.cost) << ".\n";
return;
} else {
std::cout << BOLDRED << "You don't have enough transistors to buy " << upgrade.name;
return;
}
}
}
if(args.size() < 1) {
std::cout << BOLDRED << "You must specify somthing to buy!\n";
return;
@ -391,7 +675,7 @@ void buy(std::vector<str>& args) {
return;
}
std::cout << BOLDBLUE << "You bought " << totalBought << " " << buildingName << "s for " << TransitorsString(finalPrice) << "!\n";
std::cout << BOLDBLUE << "You bought " << numString(totalBought, buildingName) << " for " << TransitorsString(finalPrice) << "!\n";
return;
}
@ -407,20 +691,86 @@ void buy(std::vector<str>& args) {
save.transistorBalance -= totalPrice;
count += toPurchase;
std::cout << BOLDBLUE << "bought " << toPurchase << " " << buildingName << "s for " << TransitorsString(totalPrice) << "!\n";
std::cout << BOLDBLUE << "bought " << numString(toPurchase, buildingName) << " for " << TransitorsString(totalPrice) << "!\n";
} else {
std::cout << BOLDRED << "You don't have enough transistors to buy " << toPurchase << " for " << TransitorsString(totalPrice, BOLDRED, BOLDRED) << "!\n";
std::cout << BOLDRED << "You don't have enough transistors to buy " << toPurchase << " for " << TransitorsString(totalPrice, 0, BOLDRED, BOLDRED) << "!\n";
}
} else {
if(save.transistorBalance >= expandPrice(basePrice, count)) {
save.transistorBalance -= expandPrice(basePrice, count);
count++;
} else {
std::cout << BOLDRED << "You don't have enough transistors to buy a " << buildingName << "!\n";
return;
}
std::cout << BOLDBLUE << "bought a " << buildingName << " for " << TransitorsString(expandPrice(basePrice, count - 1)) << "!\n";
}
}
void info(std::vector<str>& args) {
if(args.size() < 1) {
std::cout << BOLDRED << "You must specify somthing to be informed about!\n";
return;
} else if(args.size() == 1) {
if(args[0] == "transistors" || args[0] == "transistor") {
std::cout << BOLDWHITE << "TRANSISTORS\n";
std::cout << BOLDCYAN << "Description:\n";
std::cout << RESET << "Transistors are the most common semiconductor, they\n";
std::cout << "are switched by electricity, because of this they are used to make\n";
std::cout << "most computer parts, they are also the main currency of the game!\n";
std::cout << BOLDCYAN << "Uses:\n";
std::cout << RESET << "Transistors, being the main currency, are used to buy\n";
std::cout << "most things in-game!\n\n";
std::cout << BOLDWHITE << "\"Moorgans law: the ammount of transistors in existance will double every hour\"\n";
}
} else if(args.size() > 1) {
if(args[0] == "building") {
args[1] = tolower(args[1]);
if(args[1] == "i860" || args[1] == "startup" || args[1] == "oaktree") {
std::cout << "coming soon!\n";
return;
}
if(args[1] == "cursor") {
std::cout << BOLDWHITE << "CURSOR\n";
std::cout << BOLDCYAN << "Description:\n";
std::cout << RESET << "Autoclicks once every 10 seconds\n";
std::cout << BOLDCYAN << "Effect:\n";
std::cout << RESET << "Makes " << TransitorsString(cursorYeild) << " every ten seconds\n\n";
std::cout << BOLDWHITE << "\"A nice cusor for your nice mouse\"\n";
} else if(args[1] == "moss") {}
} else if(args[0] == "upgrade") {
str Uname = "";
for(size_t i = 1; i < args.size(); i++) {
Uname += args[i];
if(i != args.size() - 1) Uname += " ";
}
if(upgradeIndex.find(tolower(Uname)) == upgradeIndex.end()) {
std::cout << BOLDRED << "Unknown upgrade!\n";
return;
}
Upgrade& upgrade = save.upgrades[getUpgradeByName(Uname)];
if(!upgrade.unlocked) {
std::cout << BOLDRED << "Unkown upgrade!\n";
return;
}
std::cout << BOLDWHITE << "UPGRADE: " << upgrade.name << '\n';
std::cout << BOLDCYAN << "Description:\n";
std::cout << RESET << upgrade.description << '\n';
std::cout << BOLDCYAN << "Effect:\n";
std::cout << RESET << upgrade.effect << "\n\n";
std::cout << BOLDWHITE << '"' << upgrade.flavortext << "\"\n";
}
}
}
void help(std::vector<str>& args) {
if(args.size() < 1) {
std::cout << BOLDBLUE << "Commands:\n";
@ -476,6 +826,27 @@ void help(std::vector<str>& args) {
std::cout << RESET << "Shows help for commands, if none is specified then gives help on all commands\n";
std::cout << BOLDCYAN << "\nUsage:\n";
std::cout << RESET << "help [command]\n";
} else if(args[0] == "info") {
std::cout << BOLDWHITE << "INFO\n";
std::cout << RESET << "Shows qualatative information about things in the game\n";
std::cout << BOLDCYAN << "\nUsage:\n";
std::cout << RESET << "info [thing]\n";
std::cout << BOLDCYAN << "\nThings:\n";
std::cout << RESET << "Inummerable\n";
std::cout << BOLDCYAN << "Subcommands:\n";
std::cout << BOLDBLUE << "buildings" << RESET << " - Shows info about selected building\n";
std::cout << BOLDBLUE << "upgrades" << RESET << " - Shows info about selected upgrade\n";
}
}
}
void list(std::vector<str>& args) {
args.swap(args);
for(Upgrade& upgrade : save.upgrades) {
if(upgrade.unlocked) {
std::cout << BOLDBLUE << upgrade.name << RESET << " - " << upgrade.description << "\n";
std::cout << "it will cost " << TransitorsString(upgrade.cost) << "\n\n";
}
}
}
@ -498,6 +869,36 @@ int main() {
CMD::addcommand("buy", buy);
CMD::addcommand("clear", clear);
CMD::addcommand("help", help);
CMD::addcommand("info", info);
CMD::addcommand("list", list);
createUpgrade("integrated mouse", "the mouse now integrates semiconductor technology into it's design", "doubles mouse and cursor output.", "Now with semiconductor technology!", 100, cursorUpgrades);
createUpgrade("faster fingers", "makes fingers faster", "doubles mouse and cursor output.", "Buy our finger speed pills today, double finger speed garauteed!", 500, cursorUpgrades);
createUpgrade("chippy", "an assistant to improve your clicking methods.", "doubles mouse and cursor output.", "do you want to click a button? how about writing a letter instead.", 10'000, cursorUpgrades);
addTrigger({canUnLockIntegratedMouse, unLockIntegratedMouse});
addTrigger({canUnLockFastFing, unLockFastFing});
addTrigger({canUnLockChippy, unLockChippy});
createUpgrade("mossy mossy", "Boosts moss production... somehow.", "doubles moss output.", "Mossy Mossy", 1'000, mossUpgrades);
createUpgrade("moss walls", "Add moss walls to the office space", "doubles moss output.", "Add moss walls to the halls so the moss has more space to grow.", 5'000, mossUpgrades);
addTrigger({canUnLockMossyMossy, unLockMossyMossy});
addTrigger({canUnLockMossWalls, unLockMossWalls});
createUpgrade("cheap lithography machines", "makes small FABs better!", "doubles small FAB output", "Cheaper lithography machines make small FABs more cost effective.", 10'000, smallFABUpgrades);
createUpgrade("denser chips", "more transistors fit on the same chip!", "doubles small FAB output.", "All new chipmaking process doubles chip density and performance!", 50'000, smallFABUpgrades);
addTrigger({canUnLockCheapMachines, unLockCheapMachines});
addTrigger({canUnLockDenseChips, unLockDenseChips});
createUpgrade("mossier tech", "includes moss in microchips.", "doubles small & meduim FAB output", "Whitness the pure power of all new MOSS transistors", 110'000, mediumFABUpgrades);
addTrigger({canUnLockMossyTech, unLockMossyTech});
createUpgrade("endgame", "the game is complete...\n\nfor now", "doubles all FABs output", "huh I thought there'd be more", 200'000, largeFABUpgrades);
addTrigger({canUnLockEndgame, unLockEndgame});
addTrigger({isCursorUnLocked, unlockCursor});
addTrigger({isMossUnLocked, unlockMoss});