summaryrefslogtreecommitdiff
path: root/include/pso/TMenuList.h
diff options
context:
space:
mode:
authormrb0nk500 <b0nk@b0nk.xyz>2023-02-25 12:25:33 -0400
committermrb0nk500 <b0nk@b0nk.xyz>2023-02-25 12:25:33 -0400
commit25e3c303b8f47785a0056077a66b7a77449ff827 (patch)
treef19aedf782acf4c78c238e26f735e6f7b89163a9 /include/pso/TMenuList.h
parente4af5aabc6b9b70b514e8c124dd766aa44dcab7a (diff)
TMenuList: Add `TMenuList`, and everything else that's needed to get it
working I feel this is a good starting point for working on the protocol related code.
Diffstat (limited to 'include/pso/TMenuList.h')
-rw-r--r--include/pso/TMenuList.h130
1 files changed, 130 insertions, 0 deletions
diff --git a/include/pso/TMenuList.h b/include/pso/TMenuList.h
new file mode 100644
index 0000000..f792462
--- /dev/null
+++ b/include/pso/TMenuList.h
@@ -0,0 +1,130 @@
+#ifndef TMENULIST_H
+#define TMENULIST_H
+
+#include "pso/forward.h"
+#include "pso/protocol.h"
+#include "pso/macros.h"
+#include "pso/TPlyGuildCardTag.h"
+#include <global_types.h>
+
+template <typename T>
+class TMenuListEntry : public TPlyGuildCardTag {
+ public:
+ T entry;
+
+ void bswap();
+ TMenuListEntry &operator=(const TMenuListEntry &src);
+} __packed__;
+
+template <typename T, int num_entries, int num_pad_entries>
+class TMenuList {
+ public:
+ packet_header header;
+ TMenuListEntry<T> pad_entries[num_pad_entries];
+ TMenuListEntry<T> entries[num_entries];
+
+ void bswap();
+ TMenuList &operator=(const TMenuList &src);
+
+} __packed__;
+
+template <typename T, int num_entries>
+class TMenuList<T, num_entries, 0> {
+ public:
+ packet_header header;
+ TMenuListEntry<T> entries[num_entries];
+
+ void bswap();
+ TMenuList &operator=(const TMenuList &src);
+} __packed__;
+
+template <typename T, int num_pad_entries>
+class TMenuList<T, 0, num_pad_entries> {
+ public:
+ packet_header header;
+ TMenuListEntry<T> pad_entries[num_pad_entries];
+
+ void bswap();
+ TMenuList &operator=(const TMenuList &src);
+} __packed__;
+
+
+template <typename T, int num_entries>
+void TMenuList<T, num_entries, 0>::bswap() {
+ header.bswap();
+ for (int i = 0; i < num_entries; i++) {
+ entries[i].bswap();
+ }
+}
+
+template <typename T, int num_pad_entries>
+void TMenuList<T, 0, num_pad_entries>::bswap() {
+ header.bswap();
+ for (int i = 0; i < num_pad_entries; i++) {
+ pad_entries[i].bswap();
+ }
+}
+
+template <typename T, int num_entries, int num_pad_entries>
+void TMenuList<T, num_entries, num_pad_entries>::bswap() {
+ header.bswap();
+ if (num_pad_entries) {
+ for (int i = 0; i < num_pad_entries; i++) {
+ pad_entries[i].bswap();
+ }
+ }
+ if (num_entries) {
+ for (int i = 0; i < num_entries; i++) {
+ entries[i].bswap();
+ }
+ }
+}
+
+template <typename T>
+void TMenuListEntry<T>::bswap() {
+ TPlyGuildCardTag::bswap();
+ entry.bswap();
+}
+
+
+template <typename T, int num_entries>
+TMenuList<T, num_entries, 0> &TMenuList<T, num_entries, 0>::operator=(const TMenuList<T, num_entries, 0> &src) {
+ header = src.header;
+ for (int i = 0; i < num_entries; i++) {
+ entries[i] = src.entries[i];
+ }
+ return *this;
+}
+
+template <typename T, int num_pad_entries>
+TMenuList<T, 0, num_pad_entries> &TMenuList<T, 0, num_pad_entries>::operator=(const TMenuList<T, 0, num_pad_entries> &src) {
+ header = src.header;
+ for (int i = 0; i < num_pad_entries; i++) {
+ pad_entries[i] = src.pad_entries[i];
+ }
+ return *this;
+}
+
+template <typename T, int num_entries, int num_pad_entries>
+TMenuList<T, num_entries, num_pad_entries> &TMenuList<T, num_entries, num_pad_entries>::operator=(const TMenuList<T, num_entries, num_pad_entries> &src) {
+ header = src.header;
+ if (num_pad_entries) {
+ for (int i = 0; i < num_pad_entries; i++) {
+ pad_entries[i] = src.pad_entries[i];
+ }
+ }
+ if (num_entries) {
+ for (int i = 0; i < num_entries; i++) {
+ entries[i] = src.entries[i];
+ }
+ }
+ return *this;
+}
+
+template <typename T>
+TMenuListEntry<T> &TMenuListEntry<T>::operator=(const TMenuListEntry<T> &src) {
+ TPlyGuildCardTag::operator=(src);
+ entry = src.entry;
+ return *this;
+}
+#endif