Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <random>
- #include "avz.h"
- #include "AvZDSL/AvZDSL.h"
- #include "fodder/fodder.h"
- using namespace std;
- #define _Concat_(a, b) a ## b
- #define _Concat(a, b) _Concat_(a, b)
- #define _AddStateHook(func_name, ...) \
- class : AStateHook { \
- void func_name() override { __VA_ARGS__; } \
- } _Concat(_StateHook, __COUNTER__);
- #define HookBeforeScript(...) _AddStateHook(_BeforeScript, __VA_ARGS__)
- #define HookAfterScript(...) _AddStateHook(_AfterScript, __VA_ARGS__)
- #define HookEnterFight(...) _AddStateHook(_EnterFight, __VA_ARGS__)
- #define HookExitFight(...) _AddStateHook(_ExitFight, __VA_ARGS__)
- APvzBase* pb;
- AMainObject* mo;
- mt19937 rnd;
- HookBeforeScript(
- pb = AGetPvzBase();
- mo = AGetMainObject();
- random_device rd;
- seed_seq ss{rd(), rd()};
- rnd.seed(ss);
- srand(rd());
- );
- template <typename... Args>
- void ACard(const vector<APlantType>& plants, Args... args) {
- for(auto p : plants)
- ACard(p, args...);
- }
- void ACard(const vector<APlantType>& plants, const vector<APosition>& arg) {
- for(auto p : plants)
- ACard(p, arg);
- }
- #define CardR(...) AMkRelOp(ACard(__VA_ARGS__))
- #define ShovelR(...) AMkRelOp(AShovel(__VA_ARGS__))
- RFunc IceDayR() {
- ARelTime t = 298 + rand() % 2;
- return -t[
- AMkRelOp(aIceFiller.Coffee()),
- AMkRelOp(AIce3(t))
- ];
- }
- RFunc IceNightR(int row, int col) {
- return -420_cs[AMkRelOp(
- if(AIsSeedUsable(AM_ICE_SHROOM)) {
- ARelTime t = 419 + rand() % 2;
- ANow(420 - t)[
- CardR(AM_ICE_SHROOM, row, col),
- AMkRelOp(AIce3(t))
- ];
- } else
- ANow(320)[CardR(AICE_SHROOM, row, col)];
- )];
- }
- RFunc p(int row, float col, bool wait_until_recover = false) {
- std::vector<int> rows;
- while(row) {
- rows.push_back(row % 10);
- row /= 10;
- }
- std::reverse(rows.begin(), rows.end());
- auto out = AMkRelOp();
- for(int r : rows) {
- int t = ARangeIn(mo->Scene(), {2, 3}) && ARangeIn(r, {3, 4}) ? 378 : 373;
- out += ARelTime(-t)[AMkRelOp(
- aCobManager.SetNext(1);
- if(wait_until_recover)
- aCobManager.RecoverFire(r, col);
- else
- aCobManager.Fire(r, col);
- )];
- }
- return out;
- }
- RFunc p(const vector<pair<int, float>>& rcs, bool wait_until_recover = false) {
- auto out = AMkRelOp();
- for(auto [r, c] : rcs)
- out += p(r, c);
- return out;
- }
- RFunc rp(int r1, int c1, int r2, float c2) {
- int t = ARangeIn(mo->Scene(), {2, 3}) && ARangeIn(r2, {3, 4}) ? 378 : 373;
- return ARelTime(-t)[AMkRelOp(aCobManager.RawFire(r1, c1, r2, c2))];
- }
- class AMaidCheatsR {
- public:
- RFunc static CallPartner() {
- return AMkRelOp(AMaidCheats::CallPartner());
- }
- RFunc static Dancing() {
- return AMkRelOp(AMaidCheats::Dancing());
- }
- RFunc static Move() {
- return AMkRelOp(AMaidCheats::Move());
- }
- RFunc static Stop() {
- return AMkRelOp(AMaidCheats::Stop());
- }
- };
- template <typename T>
- class Logger : public ALogger<T> {
- private:
- void _BeforeScript() override {
- this->_level = 0;
- ALogger<T>::_BeforeScript();
- this->_level = 0b1111;
- }
- public:
- template <typename... Args>
- Logger(Args... args) : ALogger<T>(args...) {}
- };
- Logger<APvzGui> _GUILogger;
- AAbstractLogger* logger = &_GUILogger;
- template <typename... Ts>
- RFunc InfoR(Ts... args) {
- return AMkRelOp(logger->Info(args...));
- }
- #define ExportLog(path) \
- Logger<AFile> _ExportLogLogger(path); \
- HookBeforeScript( \
- _ExportLogLogger.Clear(); \
- ASetInternalLogger(_ExportLogLogger); \
- logger = &_ExportLogLogger; \
- );
- // PropFilter(&AZombie::Hp, greater(), 3000)
- template <typename T, typename V>
- AAliveFilter<T> PropFilter(V (T::* prop)(), auto&& op, auto value) {
- return AAliveFilter<T>([=](T* x){ return op((x->*prop)(), value); });
- }
- // PropFilter(&AZombie::Type, AGIGA_GARGANTUAR)
- template <typename T, typename V>
- AAliveFilter<T> PropFilter(V (T::* prop)(), auto value) {
- return PropFilter(prop, equal_to(), value);
- }
- // from crescendo/avz-more
- void AverageSpawn(const vector<AZombieType>& types = {}) {
- int scene = AGetMainObject()->Scene();
- if(scene > 5)
- AGetInternalLogger()->Error("AverageSpawn 不支持该场地");
- auto default_rows = ARangeIn(scene, {2, 3}) ? vector<int>{0, 1, 4, 5} : vector<int>{0, 1, 2, 3, 4};
- int height = ARangeIn(scene, {0, 1}) ? 100 : 85;
- for(int wave = 1; wave <= 20; wave++)
- AConnect(ATime(wave, 0), [=]{
- vector<int> rows[33];
- int cur[33];
- for(int i = 0; i < 33; i++) {
- if(ARangeIn(i, {ADUCKY_TUBE_ZOMBIE, ASNORKEL_ZOMBIE, ADOLPHIN_RIDER_ZOMBIE}))
- rows[i] = {2, 3};
- else if(ARangeIn(scene, {0, 1}) && i == ADANCING_ZOMBIE)
- rows[i] = {1, 2, 3};
- else if(ARangeIn(scene, {2, 3}) && i == ABALLOON_ZOMBIE && wave > 5)
- rows[i] = {0, 1, 2, 3, 4, 5};
- else
- rows[i] = default_rows;
- shuffle(rows[i].begin(), rows[i].end(), rnd);
- cur[i] = 0;
- }
- for(auto& z : PropFilter(&AZombie::ExistTime, 0)) {
- int type = z.Type();
- if(type == ABUNGEE_ZOMBIE)
- continue;
- if(!types.empty() && find(types.begin(), types.end(), type) == types.end())
- continue;
- if(ARangeIn(scene, {2, 3}) && ARangeIn(z.Row(), {2, 3}) &&
- ARangeIn(type, {AZOMBIE, ACONEHEAD_ZOMBIE, ABUCKETHEAD_ZOMBIE}))
- type = ADUCKY_TUBE_ZOMBIE;
- int row = z.Row(), row2 = rows[type][cur[type]];
- z.Row() = row2;
- z.Ordinate() += height * (row2 - row);
- z.MRef<int>(0x20) += 10000 * (row2 - row);
- cur[type] = (cur[type] + 1) % rows[type].size();
- }
- });
- }
- // ----------------------------------------------------------------
- FodderR f({ACHOMPER, AFLOWER_POT, AFUME_SHROOM, AKERNEL_PULT});
- ACobManager tbs;
- void set_shovel(int r, int c) {
- vector<AGrid> lst;
- for(auto& p : PropFilter(&APlant::Type, ACOB_CANNON))
- if(p.Col() != 6 && (p.Row() != r - 1 || p.Col() != c - 1))
- lst.push_back({p.Row() + 1, p.Col() + 1});
- sort(lst.begin(), lst.end());
- lst.push_back({r, c});
- for(int r : {1, 2, 5, 6})
- lst.push_back({r, 7});
- aCobManager.SetList(lst);
- tbs.SetList({{r, c}});
- }
- // 炸炮
- RFunc SPROING(int row) {
- return -110_cs[AMkRelOp(
- auto z = AAsm::PutZombie(row - 1, 8, AJACK_IN_THE_BOX_ZOMBIE);
- z->Abscissa() = 690;
- z->StateCountdown() = 0;
- )];
- }
- /*
- 上F w7-w9、下f w17-w19:
- IPP-cccc-PP'DD 1679
- PDc/Bdcc
- IPP-ccc-PDD/PSD (1510/1300)
- */
- void AScript() {
- // 存档只读
- *(uint8_t*)0x482149 = 0x2e;
- *(uint8_t*)0x54b267 = 0x70;
- ASetReloadMode(AReloadMode::MAIN_UI);
- AConnect(AKey('Q'), []{ throw AException(""); });
- ASetZombies({APOLE_VAULTING_ZOMBIE, ADANCING_ZOMBIE, AZOMBONI, ADOLPHIN_RIDER_ZOMBIE, AJACK_IN_THE_BOX_ZOMBIE, ABALLOON_ZOMBIE, ADIGGER_ZOMBIE, APOGO_ZOMBIE, ABUNGEE_ZOMBIE, ALADDER_ZOMBIE, ACATAPULT_ZOMBIE, AGARGANTUAR, AGIGA_GARGANTUAR});
- ASelectCards({AICE_SHROOM, AM_ICE_SHROOM, ADOOM_SHROOM, ACHERRY_BOMB, ACOB_CANNON, ALILY_PAD, AFLOWER_POT, AFUME_SHROOM, AKERNEL_PULT, ACHOMPER});
- // 无限阳光
- *(uint8_t*)0x41ba72 = 0x70;
- *(uint8_t*)0x41ba74 = 0x3b;
- *(uint8_t*)0x41bac0 = 0x91;
- *(uint8_t*)0x427a92 = 0x80;
- *(uint8_t*)0x427dfd = 0x80;
- *(uint8_t*)0x42487f = 0xeb;
- // 关闭引信延迟
- *(uint16_t*)0x46d672 = 0x9700;
- // 锁定黄油
- "1 10"_wave[AMkRelOp(*(int*)0x45f1e1 = 1)];
- "9 19"_wave + 1000_cs[AMkRelOp(*(int*)0x45f1e1 = 4)];
- AverageSpawn({AGARGANTUAR, AGIGA_GARGANTUAR, ADOLPHIN_RIDER_ZOMBIE});
- set_shovel(6, 1);
- 1_wave - 599_cs[
- CardR({ALILY_PAD, AFUME_SHROOM}, 3, 1),
- 751_cs[CardR({ALILY_PAD, AFUME_SHROOM}, 4, 1)],
- 1502_cs[CardR(ALILY_PAD, 3, 7)],
- 2253_cs[CardR(ALILY_PAD, 4, 7)]
- ];
- 10_wave + 800_cs[CardR(AFUME_SHROOM, 4, 1)];
- 10_wave[
- -400_cs[AMaidCheatsR::Stop()],
- 240_cs[f({1, 2}, 20)],
- 225_cs[rp(6, 1, 6, 9)],
- 290_cs[rp(5, 7, 5, 9)],
- 400_cs - 100_cs[CardR({ALILY_PAD, ADOOM_SHROOM}, 3, 9)],
- 399_cs + 255_cs[rp(6, 7, 2, 3)]
- ].AssumeWaveLength(601);
- "1 11"_wave[
- 245_cs[p(1, 9)],
- 359_cs[p(15, 8.75), 107_cs[p(5, 7.8125)]]
- ].AssumeWaveLength(601);
- 1_wave + 245_cs[rp(6, 7, 2, 9)];
- 11_wave + 245_cs[p(2, 9)];
- "2 12"_wave[
- CardR({{AKERNEL_PULT, 1, 9}, {AFLOWER_POT, 2, 9}}),
- 121_cs[CardR(ACHOMPER, 2, 9)],
- 1_cs - 100_cs[CardR(AICE_SHROOM, 5, 9)],
- 104_cs[p(1, 9)],
- 433_cs[p(5, 7.4125)],
- 871_cs[
- ShovelR(1, 9),
- f({1}, -1),
- f({5, 6}),
- 751_cs[CardR({AFLOWER_POT, AFUME_SHROOM}, 6, 9)]
- ],
- 1287_cs[ShovelR({{1, 9}, {2, 9}, {2, 9}})],
- 1327_cs[p({{256, 9}, {5, 8.4}})],
- 1328_cs[CardR(ACHOMPER, 5, 9)]
- ].AssumeWaveLength(1527);
- "3 13"_wave[
- 11_cs[IceNightR(3, 7)],
- 971_cs[
- rp(6, 1, 1, 4),
- -373_cs + 205_cs[
- ShovelR(6, 1),
- CardR(AKERNEL_PULT, 6, 1),
- 751_cs[CardR({{AKERNEL_PULT, 6, 2}, {ACOB_CANNON, 6, 1}})]
- ]
- ],
- 809_cs[f({1}, 1144 - 809)],
- 927_cs[ShovelR(5, 9), f({2}), f({5}, -1)],
- 1278_cs[ShovelR({{5, 9}, {6, 9}, {6, 9}})],
- 1511_cs + 220_cs[p(1, 7.4125)],
- 809_cs + 751_cs[AMkRelOp(
- float min_x = 800;
- int row = 0;
- for(auto& z : PropFilter(&AZombie::Type, AGIGA_GARGANTUAR))
- if(z.Hp() > 3000 && z.Row() <= 1 && z.Abscissa() < min_x) {
- min_x = z.Abscissa();
- row = z.Row();
- }
- ANow[f({row + 1}, 1)];
- )]
- ].AssumeWaveLength(1711);
- 3_wave[
- 286_cs[p(5, 9)],
- 594_cs[rp(1, 7, 1, 8.625)],
- 1511_cs[rp(2, 7, 2, 8.75), rp(5, 7, 5, 8.75)],
- 1511_cs + 220_cs[rp(6, 7, 5, 8.4)]
- ];
- 13_wave[
- 286_cs[rp(1, 7, 5, 9)],
- 594_cs[rp(2, 7, 1, 8.625)],
- 1511_cs[rp(5, 7, 2, 8.75), rp(6, 7, 5, 8.75)],
- 1511_cs + 220_cs[p(5, 8.4)]
- ];
- "4 14"_wave[
- 240_cs[p(5, 8.75), 110_cs[p(5, 8.15)]],
- 362_cs[p(2, 9), 107_cs[p(1, 7.8125)]],
- 363_cs[f({1, 2}, 445 + 134 - 363)],
- 600_cs[AMkRelOp(
- float min_x[6] = {800, 800, 800, 800, 800, 800};
- for(auto& z : PropFilter(&AZombie::Type, AGIGA_GARGANTUAR))
- min_x[z.Row()] = min(min_x[z.Row()], z.Abscissa());
- float thres = 671 + 31.103; // 最快巨人走115cs
- if(min_x[0] < thres)
- ANow(720 - 600)[f({1}, 1)];
- if(min_x[1] < thres)
- ANow(720 - 600)[f({2}, 1)];
- int cnt = (min_x[0] >= thres) + (min_x[1] >= thres);
- int diff = 0;
- for(auto& z : PropFilter(&AZombie::Type, APOLE_VAULTING_ZOMBIE))
- if(z.Row() == 4)
- diff++;
- else if(z.Row() == 5)
- diff--;
- int r1 = diff > 0 ? 5 : 6, r2 = 5 ^ 6 ^ r1;
- if(cnt >= 1)
- ANow[f({r1}, 1)];
- if(cnt >= 2)
- ANow[f({r2}, 1)];
- )]
- ].AssumeWaveLength(601);
- "5 15"_wave[
- 240_cs[p(6, 9)],
- 241_cs - 100_cs[CardR(ACHERRY_BOMB, 5, 9)],
- 360_cs - 100_cs[CardR({ALILY_PAD, ADOOM_SHROOM}, {{3, 8}, {4, 9}})],
- 359_cs + 107_cs[p(1, 7.8125)],
- 513_cs[f({1, 2}, 134)]
- ].AssumeWaveLength(601);
- "6 16"_wave[
- 362_cs[p(25, 9), 107_cs[p(15, 7.8125)]],
- 445_cs[AMkRelOp(
- float min_x[6] = {800, 800, 0, 0, 800, 800};
- for(auto& z : PropFilter(&AZombie::Type, AGIGA_GARGANTUAR))
- if(z.Hp() > 3000)
- min_x[z.Row()] = min(min_x[z.Row()], z.Abscissa());
- int ignored_row = max_element(min_x, min_x + 6) - min_x + 1;
- if(ARangeIn(ignored_row, {1, 2}))
- AWave(ANowWave())[
- 445_cs[f({5, 6}, 134)],
- 502_cs[CardR(AICE_SHROOM, 1 ^ 2 ^ ignored_row, 9)],
- 601_cs + 293_cs[p(5, 7.85)],
- 601_cs + 555_cs[p(1, 7.4125)]
- ];
- else
- AWave(ANowWave())[
- 445_cs[f({1, 2}, 134)],
- 502_cs[CardR(AICE_SHROOM, 5 ^ 6 ^ ignored_row, 9)],
- 601_cs + 293_cs[p(1, 7.85)],
- 601_cs + 555_cs[p(5, 7.4125)]
- ];
- )]
- ].AssumeWaveLength(601);
- "7 17"_wave[
- 815_cs[f({1, 2}), f({5, 6})],
- 1479_cs[p(25, 9), 220_cs[p({{1, 7.4125}, {5, 8.4}})]]
- ].AssumeWaveLength(1679);
- 7_wave + 1400_cs[SPROING(5)];
- 17_wave + 1400_cs[SPROING(6)];
- "8 18"_wave[
- 240_cs[p(5, 8.75), 250_cs[p(5, 4)]],
- 359_cs[p(2, 9), 107_cs[p(1, 7.8125)]],
- 420_cs[f({2, 5, 6}, 445 + 134 - 420)]
- ].AssumeWaveLength(601);
- 8_wave + 436_cs[CardR(AKERNEL_PULT, 5, 7), 751_cs[CardR(AKERNEL_PULT, 5, 8)]];
- 18_wave + 436_cs[CardR(AKERNEL_PULT, 6, 7), 751_cs[CardR(AKERNEL_PULT, 6, 8)]];
- "9 19"_wave[
- AMaidCheatsR::Move(),
- 1_cs[IceNightR(3, 7)],
- 466_cs[p(15, 7.4125)],
- 847_cs[f({1, 2})],
- 1100_cs[p(56, 9), 220_cs[p(5, 8.75)]],
- 1310_cs[p(1, 8.4), 225_cs[p(1, 8.4)], 450_cs[p(1, 8.75)]],
- 1800_cs[-100_cs[CardR(ACHERRY_BOMB, 2, 9)], AMaidCheatsR::Dancing()],
- 1350_cs[f({5, 6}, 700)],
- 2250_cs[f({5, 6}, 134)],
- 2460_cs[f({5, 6}, 134)],
- 2900_cs[p(3, 5)]
- ];
- 9_wave[
- 761_cs[CardR(ACOB_CANNON, 5, 7)],
- 2800_cs[rp(2, 7, 5, 9)]
- ];
- 19_wave[
- 761_cs[CardR(ACOB_CANNON, 6, 7)],
- 2800_cs[p(5, 9)]
- ];
- 20_wave[
- -400_cs[AMaidCheatsR::Stop()],
- -1_cs[ShovelR({{3, 1}, {4, 1}, {3, 1}, {4, 1}, {3, 7}, {4, 7}})],
- 250_cs[p(4, 7.5)],
- 341_cs[p(25, 9)],
- 441_cs[p(25, 9), 110_cs[p(15, 9)]],
- 1000_cs[p(35, 9)],
- 3190_cs[p(1, 9)]
- ];
- for(int t = 1000; t < 3190 - 134; t += 208)
- 20_wave + ARelTime(t)[f({1}, 207)];
- }
Advertisement
Add Comment
Please, Sign In to add comment