载入中...
搜索中...
未找到
Collector.cpp
浏览该文件的文档.
1#include "economy/Collector.h"
2
3#include "common/Assert.h"
6
7#include <algorithm>
8
9namespace eve::economy {
10
11Collector::Collector(int carryCapacity, int gatherRatePerTick, int travelTicks)
12 : carryCapacity_(carryCapacity), gatherRatePerTick_(gatherRatePerTick),
13 travelTicks_(travelTicks) {
14 EV_PARAM_CHECK(carryCapacity > 0, "carry capacity must be > 0");
15 EV_PARAM_CHECK(gatherRatePerTick > 0, "gather rate must be > 0");
16 EV_PARAM_CHECK(travelTicks >= 0, "travel ticks must be >= 0");
17}
18
20 if (node == node_) return true;
21 if (node_) {
22 node_->releaseSlot();
23 node_ = nullptr;
24 }
25 if (node == nullptr || !node->tryOccupySlot()) {
26 state_ = State::Idle;
27 return false;
28 }
29 node_ = node;
30 type_ = node->resourceType();
31 cargo_ = 0;
32 startMoveToNode();
33 return true;
34}
35
37 if (node_) node_->releaseSlot();
38 node_ = nullptr;
39 state_ = State::Idle;
40}
41
42void Collector::tick(int player) {
43 if (state_ == State::Idle) return;
44 if (node_ == nullptr) {
45 state_ = State::Idle;
46 return;
47 }
48 switch (state_) {
49 case State::Idle:
50 break;
52 if (--travelRemaining_ <= 0) state_ = State::Gathering;
53 break;
54 case State::Gathering: {
55 const int freeSpace = carryCapacity_ - cargo_;
56 const int take = std::min({freeSpace, node_->amount(), gatherRatePerTick_});
57 if (take > 0) cargo_ += node_->extract(take);
58 if (cargo_ >= carryCapacity_ || node_->depleted()) startMoveToDrop();
59 break;
60 }
62 if (--travelRemaining_ <= 0) state_ = State::Depositing;
63 break;
65 deposit(player);
66 break;
67 }
68}
69
70bool Collector::isIdle() const { return state_ == State::Idle; }
71
72Collector::State Collector::state() const { return state_; }
73
74std::string Collector::stateName() const {
75 switch (state_) {
76 case State::Idle:
77 return "idle";
79 return "moving_to_node";
81 return "gathering";
83 return "moving_to_drop";
85 return "depositing";
86 }
87 return "idle";
88}
89
90int Collector::cargo() const { return cargo_; }
91
92int Collector::carryCapacity() const { return carryCapacity_; }
93
94std::string Collector::resourceType() const { return type_; }
95
96int Collector::totalGathered() const { return totalGathered_; }
97
98int Collector::trips() const { return trips_; }
99
100void Collector::startMoveToNode() {
101 state_ = State::MovingToNode;
102 travelRemaining_ = travelTicks_;
103}
104
105void Collector::startMoveToDrop() {
106 state_ = State::MovingToDrop;
107 travelRemaining_ = travelTicks_;
108}
109
110void Collector::deposit(int player) {
111 if (cargo_ > 0) {
112 totalGathered_ += EconomySystem::credit(player, type_, cargo_);
113 ++trips_;
114 cargo_ = 0;
115 }
116 if (node_ && !node_->depleted()) {
117 startMoveToNode();
118 } else {
119 if (node_) {
120 node_->releaseSlot();
121 node_ = nullptr;
122 }
123 state_ = State::Idle;
124 }
125}
126
127void Collector::destroy() { delete this; }
128
129} // namespace eve::economy
EVEngine assertion entry point, backed by zeroerr.
#define EV_PARAM_CHECK(cond,...)
Validate a function parameter / public API precondition.
Definition Assert.h:30
const RoadNode * node
void tick(int player)
推进一个 tick;卸货时入账到指定玩家的账本。
Definition Collector.cpp:42
State
采集状态机的相位。
Definition Collector.h:18
void destroy()
脚本生命周期入口。
int carryCapacity() const
单次最大携带量。
Definition Collector.cpp:92
bool assign(GatherNode *node)
指派目标节点并占用其采集槽位;无空位时保持待命并返回 false。
Definition Collector.cpp:19
int cargo() const
当前携带量。
Definition Collector.cpp:90
State state() const
当前相位。
Definition Collector.cpp:72
std::string resourceType() const
正在采集的资源类型 id。
Definition Collector.cpp:94
Collector(int carryCapacity, int gatherRatePerTick, int travelTicks)
Definition Collector.cpp:11
int totalGathered() const
累计入账量(不含浪费)。
Definition Collector.cpp:96
int trips() const
完成的往返次数。
Definition Collector.cpp:98
void clearAssignment()
取消指派并释放槽位。
Definition Collector.cpp:36
std::string stateName() const
当前相位的字符串名(脚本友好)。
Definition Collector.cpp:74
bool isIdle() const
是否处于待命状态。
Definition Collector.cpp:70
static int credit(int player, const std::string &type, int amount)
入账并广播事件。
地图上的资源节点:储量、再生、采集槽位。
Definition GatherNode.h:12
int amount() const
当前储量。
int extract(int amount)
尝试取出 amount;返回实际取出量(不超过当前储量)。
void releaseSlot()
释放一个采集槽位。
bool depleted() const
是否已采空。