-
Notifications
You must be signed in to change notification settings - Fork 0
/
time.h
162 lines (137 loc) · 4.1 KB
/
time.h
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
#pragma once
#include "global.h"
#include "libavz.h"
struct Time {
enum class Type {
ABS, // 绝对时间
REL, // 相对时间
};
Type type;
int time;
bool fix_card_time_to_cob; // 是否将冰核樱辣窝修正至炮等效时机
Time(int _time)
: type(Type::ABS)
, time(_time)
, fix_card_time_to_cob(true)
{
}
Time(Type _type, int _time, bool _fix_card_time_to_cob)
: type(_type)
, time(_time)
, fix_card_time_to_cob(_fix_card_time_to_cob)
{
}
};
Time after(int t)
{
return {Time::Type::REL, t, true};
}
const auto now = after(0);
Time exact(Time t)
{
t.fix_card_time_to_cob = false;
return t;
}
struct ShovelTime {
enum class Type {
NONE, // 不指定
KEEP, // 指定铲除延迟
UNTIL, // 指定铲除时机
};
Type type;
int time;
ShovelTime()
: type(Type::NONE)
, time(-1)
{
}
ShovelTime(Type _type, int _time)
: type(_type)
, time(_time)
{
}
};
ShovelTime keep(int t)
{
return ShovelTime(ShovelTime::Type::KEEP, t);
}
ShovelTime until(int t)
{
return ShovelTime(ShovelTime::Type::UNTIL, t);
}
namespace _SimpleAvZInternal {
// 获得延迟时间, 并且更新[last_effect_time]
int get_delayed_time_and_update(int delay_time, const std::string& func_name)
{
if (!global.is_last_effect_time_initialized()) {
error(func_name + "-->after", "没有延迟的基准, 请先使用固定时间的用炮/用卡函数");
}
global.last_effect_time += delay_time;
return global.last_effect_time;
}
// 获得生效时间, 并且更新[last_effect_time]
// 不适用于卡片, 卡片应用[get_card_effect_time]
int get_effect_time_and_update(Time time, const std::string& func_name)
{
if (!global.is_last_effect_wave_initialized()) {
if (global.is_insert_op()) {
error(func_name, "请使用 At(), 而非 AvZ::InsertOperation()");
} else {
error(func_name, "没有设置波数, 请用以下方式调用本函数:\nfor (auto w : waves(...)){\n // 调用本函数\n}");
}
}
switch (time.type) {
case Time::Type::ABS:
global.last_effect_time = time.time;
return time.time;
case Time::Type::REL:
return get_delayed_time_and_update(time.time, func_name);
default:
assert(false);
}
}
// 在循环节内设定时间
void set_time_inside(int time, const std::string& func_name)
{
if (!global.is_last_effect_wave_initialized()) {
if (global.is_insert_op()) {
error(func_name, "请使用 At(), 而非 AvZ::InsertOperation()");
} else {
error(func_name, "没有设置波数, 请用以下方式调用本函数:\nfor (auto w : waves(...)){\n // 调用本函数\n}");
}
}
AvZ::SetTime(time, global.last_effect_wave);
}
void set_effect_time_and_update(Time time, const std::string& func_name)
{
set_time_inside(get_effect_time_and_update(time, func_name), func_name);
}
// 在循环节外设定时间
void set_time_outside(int time, int wave, const std::string& func_name)
{
if (global.is_last_effect_wave_initialized() || global.is_insert_op()) {
error(func_name, "若省略生效时间, 需在waves()循环节外使用");
}
AvZ::SetTime(time, wave);
}
} // namespace _SimpleAvZInternal
// 插入操作.
// *** 使用用例:
// At(0, [=]{ // 0cs处插入操作
// PP(after(373)); // 等价于立刻发炮
// });
template <class Op>
void At(Time time, Op&& operation, const std::string& func_name = "unknown")
{
_SimpleAvZInternal::set_effect_time_and_update(time, "At-->" + func_name);
auto wave = _SimpleAvZInternal::global.last_effect_wave;
AvZ::InsertOperation([=] {
AvZ::SetTime(AvZ::NowTime(wave), wave);
_SimpleAvZInternal::global.last_effect_wave = wave;
_SimpleAvZInternal::global.last_effect_time = AvZ::NowTime(wave);
operation();
_SimpleAvZInternal::global.reset_last_effect_wave();
_SimpleAvZInternal::global.reset_last_effect_time();
},
func_name);
}