onilink_

Untitled

Nov 14th, 2019
493
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.02 KB | None | 0 0
  1. #pragma once
  2.  
  3. #include <onidev/math/vec2.h>
  4. #include <tuple>
  5. #include <fstream>
  6. #include <iostream>
  7. #include <typeinfo>
  8.  
  9. // index sequence only
  10. template <std::size_t ...>
  11. struct indexSequence { };
  12.  
  13. template <std::size_t N, std::size_t ... Next>
  14. struct indexSequenceHelper : public indexSequenceHelper<N-1U, N-1U, Next...> { };
  15.  
  16. template <std::size_t ... Next>
  17. struct indexSequenceHelper<0U, Next ... >
  18. { using type = indexSequence<Next ... >; };
  19.  
  20. template <std::size_t N>
  21. using makeIndexSequence = typename indexSequenceHelper<N>::type;
  22.  
  23.  
  24. namespace centauri
  25. {
  26.  
  27. template<int frames, unsigned... states>
  28. struct MonsterMountState
  29. {
  30.     std::array<od::Vec2, frames> offsets;
  31. };
  32.  
  33. template<typename Monster, typename... States>
  34. struct MonsterMount
  35. {
  36.     std::tuple<States...> states;
  37.     bool offsets_loaded = false;
  38.    
  39.     MonsterMount() {}
  40.    
  41.     od::Vec2 offset(unsigned state, int frame) const {
  42.         return offset(state, frame, makeIndexSequence<sizeof...(States)>{});
  43.     }
  44.    
  45.     template<std::size_t N>
  46.     void loadOffsets(const std::string& root, const std::array<std::string, N>& t) {
  47.         if(!offsets_loaded) {
  48.             setOffsets(root, t, makeIndexSequence<sizeof...(States)>{});
  49.             offsets_loaded = true;
  50.         }
  51.     }
  52.    
  53. private:
  54.     using expand = int[];
  55.    
  56.     template <std::size_t... StateIdx>
  57.     od::Vec2 offset(unsigned state, int frame, indexSequence<StateIdx...>) const
  58.     {
  59.         od::Vec2 offset{};
  60.         (void) expand {0, offsetFromState(
  61.                 std::get<StateIdx>(states), state, frame, offset)... };
  62.         return offset;
  63.     }
  64.    
  65.     template <int frames, unsigned... states>
  66.     int offsetFromState(
  67.             MonsterMountState<frames, states...> const &mms,
  68.             unsigned state, int frame, od::Vec2 &offset) const
  69.     {
  70.         (void) expand { 0, (state == states ?
  71.                 offset = mms.offsets[frame % mms.offsets.size()], 0 : 0)... };
  72.         return 0;
  73.     }
  74.    
  75.     // load offsets from txt files
  76.     template <std::size_t N, std::size_t... StateIdx>
  77.     void setOffsets(
  78.             const std::string& root,
  79.             const std::array<std::string, N>& t,
  80.             indexSequence<StateIdx...>)
  81.     {
  82.         (void) expand {0, loadOffsetsImpl(
  83.                 std::get<StateIdx>(states).offsets, root + t.at(StateIdx))... };
  84.     }
  85.    
  86.     template<std::size_t N>
  87.     int loadOffsetsImpl(
  88.                 std::array<od::Vec2,N>& t, const std::string& fname)
  89.     {
  90.         //std::cout << fname << std::endl;
  91.         std::ifstream f(fname);
  92.         if(!f.is_open()) {
  93.             return 0;
  94.         }
  95.         // read global offset
  96.         od::Vec2 w; {
  97.             char sep;
  98.             float x(0), y(0);
  99.             f >> x >> sep >> y;
  100.             w = od::Vec2(x, y);
  101.         }
  102.         for(std::size_t i=0; i<N; ++i) {
  103.             char sep;
  104.             float x(0), y(0);
  105.             f >> x >> sep >> y;
  106.             t[i] = w + od::Vec2(x, y);
  107.         }
  108.         return 0;
  109.     }
  110. };
  111.  
  112. }
  113.  
  114. using centauri::MonsterMount;
  115. using centauri::MonsterMountState;
Advertisement
Add Comment
Please, Sign In to add comment