#include<iostream>
#include<iomanip>
#include<cmath>
#include<windows.h>
#include<conio.h>
using namespace std;
unsigned long long M=0, m=1, lm=0, K=0,a,sbcs;
void sanb(int as){
    if(!as)return;
    sanb(as/16);
    if(as%16<10)cout<<as%16;
    else cout<<char(as%16-10+'A');
    return;
}
int sans(char c) {
    if(c>='0' && c<='9') return c-'0';
    if(c>='A' && c<='F') return c-'A'+10;
    if(c>='a' && c<='f') return c-'a'+10;
    return 0;
}

struct Item {
    string name;   
    string desc;  
    unsigned long long base;       
    unsigned long long cnt;        
    unsigned long long add;       
    unsigned long long p;
};

int main(){
    Item items[10];
    items[1] = {"mouse", "+1 per click", 25, 0, 1, 25};
    items[2] = {"cow", "+5 per click", 1000, 0, 5, 1000};
    items[3] = {"farm", "+20 per click", 12000, 0, 20, 12000};
    items[4] = {"mine", "+100 per click", 90000, 0, 100, 90000};
    items[5] = {"factory", "+666 per click", 450000, 0, 666, 450000};
    items[6] = {"quantum cow", "+1650 per click", 2000000, 0, 1550, 2000000};
    items[7] = {"laboratory", "+5500 per click", 32000000, 0, 4444, 32000000};
    items[8] = {"recursion", "+19999 per click", 666666666, 0, 19999, 666666666};

    system("cls");
    cout << "Milky Clicker" << endl;
    cout << "1. 开始" << endl;
    cout << "2. 加载存档" << endl;
    cout << "3. 说明(已更新2.0)" << endl;
    char c=_getch();
    while(c!= '1'&&c!='2'&&c!='3')c=_getch();

    if(c=='3') {
        system("cls");
        cout<<"按任意键生产Milk"<<'\n'<<"按1~8购买建筑(需解锁)"<<'\n'<<"按'Q'获取存档代码(会退出游戏!)"<<'\n'<<"给吔生产尽量多的Milk吧!"<<'\n'<<'\n';
        cout<<"如何复制存档代码?"<<'\n';
        cout<<"右键窗顶部口边缘->编辑(E)->全选(S)->按Enter复制"<<'\n'<<'\n';
		cout<<"如何粘贴存档代码?"<<'\n';
        cout<<"右键窗顶部口边缘->编辑(E)->全选(S)->粘贴(P)"<<'\n'<<'\n';
        cout<<"想开挂就开挂吧,懒得管了"<<'\n'; 
        cout<<"游戏是给人玩的,而不是开挂狗玩的"; 
        Sleep(2000);
        return 0;
    }
    
    if(c=='2') {
        string h1,h2;
        system("cls");
        cout<<"输入存档代码:"<<endl;
        cin>>h1;
        if(h1.size()!=16) return 0;
        unsigned long long totalAdd = 0;
        for(int i=1;i<=8;i++){
            int high = sans(h1[2*(i-1)]);
            int low = sans(h1[2*(i-1)+1]);
            items[i].cnt = high*16 + low;
            totalAdd += items[i].cnt * items[i].add;
        }
        m = 1 + totalAdd;
        for(int i=1;i<=8;i++){
            items[i].p = (unsigned long long)(items[i].base * pow(1.2, items[i].cnt));
        }
        cin>>h2;
        if(h2.size()!=16) return 0;
        M=0;
        for(int i=0;i<16;i++){
            int val = sans(h2[i]);
            M = M*16 + val;
        }
        cin>>sbcs;
        if(sbcs!=(M+items[1].cnt)){
        	for(int i=1;i<=50;i++){
        		cout<<"臭cs开挂狗"<<endl;
			}
			return 0;
		}
        lm = M; 
    }

    system("cls");
    cout<<"游戏开始!"<< endl;
    Sleep(1000); 

    while(1) {
        system("cls");
        cout<<"Milk: " << M << endl;
        cout<<"=========================" << endl;
        for(int i=1; i<=8; i++) {
            if(lm>=items[i].base || items[i].cnt) {
                cout<<"________________________\n|"
                    <<items[i].name << setw(22 - items[i].name.length()) 
                    <<(int)items[i].p << "|\n|"
                    <<items[i].desc << setw(22 - items[i].desc.length()) 
                    <<items[i].cnt << "|\n|______________________|\n";
            }
        }

        DWORD inputStart=GetTickCount();
        a=1;
        while(GetTickCount()-inputStart < 100) {
            if(a && _kbhit()) {
                char c=_getch();
                if(c=='q' || c=='Q'){ 
                    system("cls");
                    for(int i=1;i<=8;i++){
                        unsigned long long cnt = items[i].cnt;
                        unsigned char high = (cnt >> 4) & 0xF;
                        unsigned char low = cnt & 0xF;
                        cout << char(high<10? high+'0': high-10+'A');
                        cout << char(low<10? low+'0': low-10+'A');
                    }
                    cout << endl;
                    for(int i=15; i>=0; i--){
                        unsigned char digit = (M >> (4*i)) & 0xF;
                        cout << char(digit<10? digit+'0': digit-10+'A');
                    }
                    cout << endl;
                    cout<<M+items[1].cnt;
                    Sleep(50000);
                    return 0;
                }
                if(c>='1' && c<='8') {
                    int i=c-'0';
                    if(M >= items[i].p) {
                        items[i].cnt++;
                        m += items[i].add;
                        M -= (unsigned long long)items[i].p;                      
                        items[i].p = (unsigned long long)(items[i].base * pow(1.2, items[i].cnt));
                    }
                }
                else {
                    M += m;
                    lm += m;
                    a=0;
                    cout<<"+"<<m;
                }
            }
            Sleep(1);
        }

        if(K==5){
            M += m;
            lm += m;
            K=0;
        } else K++; 

        while(_kbhit()) _getch();
        Sleep(5);
    }
    return 0;
}