12using namespace Tempest;
18 fout.
write(uint32_t(overlay.size()));
20 fout.
write(i.skeleton->name(),i.time);
36 for(
size_t i=0;i<overlay.size();++i){
37 overlay[sz]=overlay[i];
38 if(overlay[i].skeleton!=
nullptr)
61 if(baseSk==
nullptr || sk->
nodes.size()!=baseSk->
nodes.size())
66 overlay.push_back(ov);
78 for(
size_t i=0;i<overlay.size();++i)
79 if(overlay[i].skeleton==sk){
80 overlay.erase(overlay.begin()+
int(i));
92 for(
size_t i=0;i<overlay.size();){
93 auto& ov = overlay[i];
94 if(ov.time!=0 && ov.time<tickCount) {
95 overlay.erase(overlay.begin()+
int(i));
105 auto& ptr = cache[a-1][int(st)][int(wlkMode)];
107 ptr = implSolveAnim(a,st,wlkMode,pose);
110 return implSolveAnim(a,st,wlkMode,pose);
118 return solveFrm(
"T_FISTATTACKMOVE");
128 return solveFrm(
"T_%sATTACKMOVE",st);
139 switch(std::rand()%3) {
140 case 0: s =
solveFrm(
"T_%sPARADE_0", st);
break;
141 case 1: s =
solveFrm(
"T_%sPARADE_0_A2",st);
break;
142 case 2: s =
solveFrm(
"T_%sPARADE_0_A3",st);
break;
218 return solveFrm(
"T_%sSNEAKSTRAFEL",st);
220 return solveFrm(
"T_%sWALKWSTRAFEL",st);
222 return solveFrm(
"T_%sWALKWSTRAFEL",st);
223 return solveFrm(
"T_%sRUNSTRAFEL",st);
231 return solveFrm(
"T_%sSNEAKSTRAFER",st);
233 return solveFrm(
"T_%sWALKWSTRAFER",st);
235 return solveFrm(
"T_%sWALKWSTRAFER",st);
236 return solveFrm(
"T_%sRUNSTRAFER",st);
262 return solveFrm(
"T_%sWALKTURNL",st);
264 return solveFrm(
"T_%sWALKWTURNL",st);
275 return solveFrm(
"T_%sWALKTURNR",st);
277 return solveFrm(
"T_%sWALKWTURNR",st);
320 if(
auto ret =
solveFrm(
"T_JUMPUP_2_HANG"))
363 return solveDead(
"T_WOUNDED_2_DEAD",
"T_WOUNDEDB_2_DEADB");
365 return solveDead(
"T_DEAD",
"T_DEADB");
367 return solveDead(
"T_DEAD",
"T_DEADB");
368 return solveDead(
"S_DEAD",
"S_DEADB");
373 return solveDead(
"T_WOUNDEDB_2_DEADB",
"T_WOUNDED_2_DEAD");
375 return solveDead(
"T_DEADB",
"T_DEAD");
else
376 return solveDead(
"S_DEADB",
"S_DEAD");
380 return solveFrm(
"T_STAND_2_WOUNDED");
382 return solveFrm(
"T_STAND_2_WOUNDEDB");
401 return solveFrm(
"T_%sMOVE_2_MOVE",cur);
402 return solveFrm(
"T_%sRUN_2_%s",cur);
410 return solveFrm(
"T_MOVE_2_%sMOVE",st);
421 name =
string_frm(
"T_MAGMOVE_2_",scheme,
"CAST");
423 name =
string_frm(
"T_MAGMOVE_2_",scheme,
"SHOOT");
425 name =
string_frm(
"T_MAGRUN_2_",scheme,
"CAST");
427 name =
string_frm(
"T_MAGRUN_2_",scheme,
"SHOOT");
454 char format[256] = {};
455 std::snprintf(format,
sizeof(format),
"%.*s",
int(fview.size()),fview.data());
457 static const char* weapon[] = {
467 std::snprintf(name,
sizeof(name),format,weapon[
int(st)],weapon[
int(st)]);
470 std::snprintf(name,
sizeof(name),format,
"",
"");
473 std::snprintf(name,
sizeof(name),format,
"FIST",
"");
477const Animation::Sequence* AnimationSolver::solveMag(std::string_view fview, std::string_view spell)
const {
478 char format[256] = {};
479 std::snprintf(format,
sizeof(format),
"%.*s",
int(fview.size()),fview.data());
482 std::snprintf(name,
sizeof(name),format,std::string(spell).c_str());
486const Animation::Sequence *AnimationSolver::solveDead(std::string_view format1, std::string_view format2)
const {
492void AnimationSolver::invalidateCache() {
493 std::memset(cache,0,
sizeof(cache));
499 std::string_view name = sq.
next;
500 for(
size_t i=overlay.size();i>0;){
502 if(overlay[i].skeleton->animation()==sq.
owner && sq.
nextPtr!=
nullptr)
504 if(
auto s = overlay[i].skeleton->sequence(name))
509 return baseSk ? baseSk->
sequence(name) :
nullptr;
516 for(
size_t i=overlay.size();i>0;){
518 if(
auto s = overlay[i].skeleton->sequence(name))
void addOverlay(const Skeleton *sk, uint64_t time)
const Animation::Sequence * solveNext(const Animation::Sequence &sq) const
const Animation::Sequence * solveFrm(std::string_view format) const
void load(Serialize &fin)
const Animation::Sequence * solveAnim(Anim a, WeaponState st, WalkBit wlk, const Pose &pose) const
void setSkeleton(const Skeleton *sk)
void delOverlay(std::string_view sk)
void update(uint64_t tickCount)
void save(Serialize &fout) const
bool hasOverlay(const Skeleton *sk) const
auto version() const -> const VersionInfo &
auto animNpc(const AnimationSolver &solver, Anim t) const -> const Animation::Sequence *
BodyState bodyState() const
bool isInAnim(std::string_view sq) const
bool hasState(BodyState s) const
static const Skeleton * loadSkeleton(std::string_view name)
void write(const Arg &... a)
const Animation * animation() const
const Animation::Sequence * sequence(std::string_view name) const
std::vector< Node > nodes
const Skeleton * skeleton