Commit 61f34be2 authored by Dark Zane's avatar Dark Zane Committed by GitHub

Merge branch 'fallenstardust:master' into master

parents a226e325 080df2c7
...@@ -390,36 +390,26 @@ uint32_t DataManager::CardReader(uint32_t code, card_data* pData) { ...@@ -390,36 +390,26 @@ uint32_t DataManager::CardReader(uint32_t code, card_data* pData) {
} }
unsigned char* DataManager::ScriptReaderEx(const char* script_name, int* slen) { unsigned char* DataManager::ScriptReaderEx(const char* script_name, int* slen) {
// default script name: ./script/c%d.lua // default script name: ./script/c%d.lua
char first[256]{}; if (std::strncmp(script_name, "./script", 8) != 0)
char second[256]{}; return DefaultScriptReader(script_name, slen);
char expansions_path[1024]{};
std::snprintf(expansions_path, sizeof expansions_path, "./expansions/%s", script_name + 2);
if(mainGame->gameConf.prefer_expansion_script) { if(mainGame->gameConf.prefer_expansion_script) {
snprintf(first, sizeof first, "expansions/%s", script_name + 2); if (DefaultScriptReader(expansions_path, slen))
snprintf(second, sizeof second, "%s", script_name + 2);
} else {
snprintf(first, sizeof first, "%s", script_name + 2);
snprintf(second, sizeof second, "expansions/%s", script_name + 2);
}
if(mainGame->gameConf.prefer_expansion_script) {
if(ScriptReader(first, slen))
return scriptBuffer; return scriptBuffer;
if(ScriptReader(second, slen)) else if (ScriptReaderZip(script_name + 2, slen))
return scriptBuffer; return scriptBuffer;
} else if (DefaultScriptReader(script_name, slen))
if(ScriptReaderZip(first, slen))
return scriptBuffer; return scriptBuffer;
else } else {
return ScriptReaderZip(second, slen); if (DefaultScriptReader(script_name, slen))
} return scriptBuffer;
unsigned char* DataManager::ScriptReader(const char* script_name, int* slen) { else if (DefaultScriptReader(expansions_path, slen))
FILE *fp = fopen(script_name, "rb"); return scriptBuffer;
if(!fp) else if (ScriptReaderZip(script_name + 2, slen))
return 0;
int len = fread(scriptBuffer, 1, sizeof(scriptBuffer), fp);
fclose(fp);
if(len >= sizeof(scriptBuffer))
return 0;
*slen = len;
return scriptBuffer; return scriptBuffer;
}
return nullptr;
} }
unsigned char* DataManager::ScriptReaderZip(const char* script_name, int* slen) { unsigned char* DataManager::ScriptReaderZip(const char* script_name, int* slen) {
IReadFile* reader = FileSystem->createAndOpenFile(script_name); IReadFile* reader = FileSystem->createAndOpenFile(script_name);
...@@ -435,5 +425,18 @@ unsigned char* DataManager::ScriptReaderZip(const char* script_name, int* slen) ...@@ -435,5 +425,18 @@ unsigned char* DataManager::ScriptReaderZip(const char* script_name, int* slen)
*slen = (int)size; *slen = (int)size;
return scriptBuffer; return scriptBuffer;
} }
unsigned char* DataManager::DefaultScriptReader(const char* script_name, int* slen) {
wchar_t fname[256]{};
BufferIO::DecodeUTF8(script_name, fname);
FILE* fp = myfopen(fname, "rb");
if (!fp)
return nullptr;
size_t len = std::fread(scriptBuffer, 1, sizeof scriptBuffer, fp);
std::fclose(fp);
if (len >= sizeof scriptBuffer)
return nullptr;
*slen = (int)len;
return scriptBuffer;
}
} }
...@@ -54,7 +54,11 @@ public: ...@@ -54,7 +54,11 @@ public:
static const wchar_t* unknown_string; static const wchar_t* unknown_string;
static uint32_t CardReader(uint32_t, card_data*); static uint32_t CardReader(uint32_t, card_data*);
static unsigned char* ScriptReaderEx(const char* script_name, int* slen); static unsigned char* ScriptReaderEx(const char* script_name, int* slen);
//read by IFileSystem
static unsigned char* ScriptReader(const char* script_name, int* slen); static unsigned char* ScriptReader(const char* script_name, int* slen);
//read by fread
static unsigned char* DefaultScriptReader(const char* script_name, int* slen);
static unsigned char* ScriptReaderZip(const char* script_name, int* slen); static unsigned char* ScriptReaderZip(const char* script_name, int* slen);
static IFileSystem* FileSystem; static IFileSystem* FileSystem;
......
#include "config.h"
#include "duelclient.h" #include "duelclient.h"
#include "client_card.h" #include "client_card.h"
#include "materials.h" #include "materials.h"
#include "image_manager.h" #include "image_manager.h"
#include "sound_manager.h"
#include "single_mode.h" #include "single_mode.h"
#include "../ocgcore/common.h"
#include "game.h" #include "game.h"
#include "deck_manager.h"
#include "replay.h" #include "replay.h"
#include "replay_mode.h"
#include <thread> #include <thread>
#ifdef _IRR_ANDROID_PLATFORM_ #ifdef _IRR_ANDROID_PLATFORM_
#include <android/android_tools.h> #include <android/android_tools.h>
...@@ -16,7 +17,7 @@ namespace ygo { ...@@ -16,7 +17,7 @@ namespace ygo {
unsigned DuelClient::connect_state = 0; unsigned DuelClient::connect_state = 0;
unsigned char DuelClient::response_buf[SIZE_RETURN_VALUE]; unsigned char DuelClient::response_buf[SIZE_RETURN_VALUE];
unsigned int DuelClient::response_len = 0; size_t DuelClient::response_len = 0;
unsigned int DuelClient::watching = 0; unsigned int DuelClient::watching = 0;
unsigned char DuelClient::selftype = 0; unsigned char DuelClient::selftype = 0;
bool DuelClient::is_host = false; bool DuelClient::is_host = false;
...@@ -29,7 +30,7 @@ int DuelClient::select_hint = 0; ...@@ -29,7 +30,7 @@ int DuelClient::select_hint = 0;
int DuelClient::select_unselect_hint = 0; int DuelClient::select_unselect_hint = 0;
int DuelClient::last_select_hint = 0; int DuelClient::last_select_hint = 0;
unsigned char DuelClient::last_successful_msg[0x2000]; unsigned char DuelClient::last_successful_msg[0x2000];
unsigned int DuelClient::last_successful_msg_length = 0; size_t DuelClient::last_successful_msg_length = 0;
wchar_t DuelClient::event_string[256]; wchar_t DuelClient::event_string[256];
mt19937 DuelClient::rnd; mt19937 DuelClient::rnd;
...@@ -51,7 +52,6 @@ bool DuelClient::StartClient(unsigned int ip, unsigned short port, bool create_g ...@@ -51,7 +52,6 @@ bool DuelClient::StartClient(unsigned int ip, unsigned short port, bool create_g
sin.sin_addr.s_addr = htonl(ip); sin.sin_addr.s_addr = htonl(ip);
sin.sin_port = htons(port); sin.sin_port = htons(port);
client_bev = bufferevent_socket_new(client_base, -1, BEV_OPT_CLOSE_ON_FREE); client_bev = bufferevent_socket_new(client_base, -1, BEV_OPT_CLOSE_ON_FREE);
bufferevent_setwatermark(client_bev, EV_READ, 3, 0);
bufferevent_setcb(client_bev, ClientRead, nullptr, ClientEvent, (void*)create_game); bufferevent_setcb(client_bev, ClientRead, nullptr, ClientEvent, (void*)create_game);
if (bufferevent_socket_connect(client_bev, (sockaddr*)&sin, sizeof(sin)) < 0) { if (bufferevent_socket_connect(client_bev, (sockaddr*)&sin, sizeof(sin)) < 0) {
bufferevent_free(client_bev); bufferevent_free(client_bev);
...@@ -102,19 +102,16 @@ void DuelClient::StopClient(bool is_exiting) { ...@@ -102,19 +102,16 @@ void DuelClient::StopClient(bool is_exiting) {
void DuelClient::ClientRead(bufferevent* bev, void* ctx) { void DuelClient::ClientRead(bufferevent* bev, void* ctx) {
evbuffer* input = bufferevent_get_input(bev); evbuffer* input = bufferevent_get_input(bev);
int len = evbuffer_get_length(input); int len = evbuffer_get_length(input);
if (len < 2)
return;
unsigned char* duel_client_read = new unsigned char[SIZE_NETWORK_BUFFER]; unsigned char* duel_client_read = new unsigned char[SIZE_NETWORK_BUFFER];
unsigned short packet_len; uint16_t packet_len = 0;
while (len >= 2) { while (len >= 2) {
evbuffer_copyout(input, &packet_len, sizeof packet_len); evbuffer_copyout(input, &packet_len, sizeof packet_len);
if (packet_len + 2 > SIZE_NETWORK_BUFFER) {
delete[] duel_client_read;
ClientEvent(bev, BEV_EVENT_ERROR, 0);
return;
}
if (len < packet_len + 2) if (len < packet_len + 2)
break; break;
int read_len = evbuffer_remove(input, duel_client_read, packet_len + 2); int read_len = evbuffer_remove(input, duel_client_read, packet_len + 2);
if (read_len >= 3) if (read_len > 2)
HandleSTOCPacketLan(&duel_client_read[2], read_len - 2); HandleSTOCPacketLan(&duel_client_read[2], read_len - 2);
len -= packet_len + 2; len -= packet_len + 2;
} }
...@@ -4110,11 +4107,11 @@ int DuelClient::ClientAnalyze(unsigned char* msg, unsigned int len) { ...@@ -4110,11 +4107,11 @@ int DuelClient::ClientAnalyze(unsigned char* msg, unsigned int len) {
void DuelClient::SwapField() { void DuelClient::SwapField() {
is_swapping = true; is_swapping = true;
} }
void DuelClient::SetResponseI(int respI) { void DuelClient::SetResponseI(int32_t respI) {
std::memcpy(response_buf, &respI, sizeof respI); std::memcpy(response_buf, &respI, sizeof respI);
response_len = 4; response_len = sizeof respI;
} }
void DuelClient::SetResponseB(void* respB, unsigned int len) { void DuelClient::SetResponseB(void* respB, size_t len) {
if (len > SIZE_RETURN_VALUE) if (len > SIZE_RETURN_VALUE)
len = SIZE_RETURN_VALUE; len = SIZE_RETURN_VALUE;
std::memcpy(response_buf, respB, len); std::memcpy(response_buf, respB, len);
...@@ -4286,7 +4283,7 @@ void DuelClient::BroadcastReply(evutil_socket_t fd, short events, void * arg) { ...@@ -4286,7 +4283,7 @@ void DuelClient::BroadcastReply(evutil_socket_t fd, short events, void * arg) {
else hoststr.append(dataManager.GetSysString(1248)); else hoststr.append(dataManager.GetSysString(1248));
hoststr.append(L"]"); hoststr.append(L"]");
wchar_t gamename[20]; wchar_t gamename[20];
BufferIO::CopyWStr(pHP->name, gamename, 20); BufferIO::CopyCharArray(pHP->name, gamename);
hoststr.append(gamename); hoststr.append(gamename);
mainGame->lstHostList->addItem(hoststr.c_str()); mainGame->lstHostList->addItem(hoststr.c_str());
mainGame->gMutex.unlock(); mainGame->gMutex.unlock();
......
#ifndef DUELCLIENT_H #ifndef DUELCLIENT_H
#define DUELCLIENT_H #define DUELCLIENT_H
#include "config.h"
#include <vector> #include <vector>
#include <set> #include <set>
#include <utility>
#include "network.h" #include "network.h"
#include "data_manager.h"
#include "deck_manager.h"
#include "../ocgcore/mtrandom.h" #include "../ocgcore/mtrandom.h"
namespace ygo { namespace ygo {
...@@ -16,7 +12,7 @@ class DuelClient { ...@@ -16,7 +12,7 @@ class DuelClient {
private: private:
static unsigned int connect_state; static unsigned int connect_state;
static unsigned char response_buf[SIZE_RETURN_VALUE]; static unsigned char response_buf[SIZE_RETURN_VALUE];
static unsigned int response_len; static size_t response_len;
static unsigned int watching; static unsigned int watching;
static bool is_host; static bool is_host;
static event_base* client_base; static event_base* client_base;
...@@ -28,7 +24,7 @@ private: ...@@ -28,7 +24,7 @@ private:
static int select_unselect_hint; static int select_unselect_hint;
static int last_select_hint; static int last_select_hint;
static unsigned char last_successful_msg[0x2000]; static unsigned char last_successful_msg[0x2000];
static unsigned int last_successful_msg_length; static size_t last_successful_msg_length;
static wchar_t event_string[256]; static wchar_t event_string[256];
static mt19937 rnd; static mt19937 rnd;
static bool is_refreshing; static bool is_refreshing;
...@@ -47,8 +43,8 @@ public: ...@@ -47,8 +43,8 @@ public:
static void HandleSTOCPacketLan(unsigned char* data, int len); static void HandleSTOCPacketLan(unsigned char* data, int len);
static int ClientAnalyze(unsigned char* msg, unsigned int len); static int ClientAnalyze(unsigned char* msg, unsigned int len);
static void SwapField(); static void SwapField();
static void SetResponseI(int respI); static void SetResponseI(int32_t respI);
static void SetResponseB(void* respB, unsigned int len); static void SetResponseB(void* respB, size_t len);
static void SendResponse(); static void SendResponse();
static void SendPacketToServer(unsigned char proto) { static void SendPacketToServer(unsigned char proto) {
auto p = duel_client_write; auto p = duel_client_write;
......
...@@ -6,6 +6,8 @@ ...@@ -6,6 +6,8 @@
#include "duelclient.h" #include "duelclient.h"
#include "data_manager.h" #include "data_manager.h"
#include "image_manager.h" #include "image_manager.h"
#include "sound_manager.h"
#include "deck_manager.h"
#include "replay_mode.h" #include "replay_mode.h"
#include "single_mode.h" #include "single_mode.h"
#include "materials.h" #include "materials.h"
......
#include "config.h"
#include "netserver.h" #include "netserver.h"
#include "single_duel.h" #include "single_duel.h"
#include "tag_duel.h" #include "tag_duel.h"
#include "deck_manager.h"
#include <thread> #include <thread>
namespace ygo { namespace ygo {
...@@ -108,7 +110,6 @@ void NetServer::ServerAccept(evconnlistener* listener, evutil_socket_t fd, socka ...@@ -108,7 +110,6 @@ void NetServer::ServerAccept(evconnlistener* listener, evutil_socket_t fd, socka
dp.type = 0xff; dp.type = 0xff;
dp.bev = bev; dp.bev = bev;
users[bev] = dp; users[bev] = dp;
bufferevent_setwatermark(bev, EV_READ, 3, 0);
bufferevent_setcb(bev, ServerEchoRead, nullptr, ServerEchoEvent, nullptr); bufferevent_setcb(bev, ServerEchoRead, nullptr, ServerEchoEvent, nullptr);
bufferevent_enable(bev, EV_READ); bufferevent_enable(bev, EV_READ);
} }
...@@ -123,19 +124,16 @@ void NetServer::ServerAcceptError(evconnlistener* listener, void* ctx) { ...@@ -123,19 +124,16 @@ void NetServer::ServerAcceptError(evconnlistener* listener, void* ctx) {
void NetServer::ServerEchoRead(bufferevent *bev, void *ctx) { void NetServer::ServerEchoRead(bufferevent *bev, void *ctx) {
evbuffer* input = bufferevent_get_input(bev); evbuffer* input = bufferevent_get_input(bev);
int len = evbuffer_get_length(input); int len = evbuffer_get_length(input);
if (len < 2)
return;
unsigned char* net_server_read = new unsigned char[SIZE_NETWORK_BUFFER]; unsigned char* net_server_read = new unsigned char[SIZE_NETWORK_BUFFER];
unsigned short packet_len; uint16_t packet_len = 0;
while (len >= 2) { while (len >= 2) {
evbuffer_copyout(input, &packet_len, sizeof packet_len); evbuffer_copyout(input, &packet_len, sizeof packet_len);
if (packet_len + 2 > SIZE_NETWORK_BUFFER) {
delete[] net_server_read;
ServerEchoEvent(bev, BEV_EVENT_ERROR, 0);
return;
}
if (len < packet_len + 2) if (len < packet_len + 2)
break; break;
int read_len = evbuffer_remove(input, net_server_read, packet_len + 2); int read_len = evbuffer_remove(input, net_server_read, packet_len + 2);
if (read_len >= 3) if (read_len > 2)
HandleCTOSPacket(&users[bev], &net_server_read[2], read_len - 2); HandleCTOSPacket(&users[bev], &net_server_read[2], read_len - 2);
len -= packet_len + 2; len -= packet_len + 2;
} }
......
#ifndef NETSERVER_H #ifndef NETSERVER_H
#define NETSERVER_H #define NETSERVER_H
#include "config.h"
#include "network.h" #include "network.h"
#include "data_manager.h"
#include "deck_manager.h"
#include <set>
#include <unordered_map> #include <unordered_map>
namespace ygo { namespace ygo {
......
#ifndef NETWORK_H #ifndef NETWORK_H
#define NETWORK_H #define NETWORK_H
#include "config.h" #include <cstdint>
#include "deck_manager.h" #include <cstring>
#include <event2/event.h> #include <event2/event.h>
#include <event2/listener.h> #include <event2/listener.h>
#include <event2/bufferevent.h> #include <event2/bufferevent.h>
...@@ -13,7 +13,7 @@ ...@@ -13,7 +13,7 @@
#define check_trivially_copyable(T) static_assert(std::is_trivially_copyable<T>::value == true && std::is_standard_layout<T>::value == true, "not trivially copyable") #define check_trivially_copyable(T) static_assert(std::is_trivially_copyable<T>::value == true && std::is_standard_layout<T>::value == true, "not trivially copyable")
namespace ygo { namespace ygo {
constexpr int SIZE_NETWORK_BUFFER = 0x2000; constexpr int SIZE_NETWORK_BUFFER = 0x20000;
constexpr int MAX_DATA_SIZE = SIZE_NETWORK_BUFFER - 3; constexpr int MAX_DATA_SIZE = SIZE_NETWORK_BUFFER - 3;
constexpr int MAINC_MAX = 250; // the limit of card_state constexpr int MAINC_MAX = 250; // the limit of card_state
constexpr int SIDEC_MAX = MAINC_MAX; constexpr int SIDEC_MAX = MAINC_MAX;
...@@ -191,7 +191,7 @@ struct DuelPlayer { ...@@ -191,7 +191,7 @@ struct DuelPlayer {
inline bool check_msg_size(int size) { inline bool check_msg_size(int size) {
// empty string is not allowed // empty string is not allowed
if (size < 2* sizeof(uint16_t)) if (size < 2 * sizeof(uint16_t))
return false; return false;
if (size > LEN_CHAT_MSG * sizeof(uint16_t)) if (size > LEN_CHAT_MSG * sizeof(uint16_t))
return false; return false;
......
#include "replay_mode.h" #include "replay_mode.h"
#include "duelclient.h" #include "duelclient.h"
#include "game.h" #include "game.h"
#include "../ocgcore/common.h" #include "data_manager.h"
#include "../ocgcore/mtrandom.h" #include "../ocgcore/mtrandom.h"
#include <thread> #include <thread>
......
#include "config.h"
#include "single_duel.h" #include "single_duel.h"
#include "netserver.h" #include "netserver.h"
#include "game.h" #include "game.h"
#include "../ocgcore/ocgapi.h" #include "data_manager.h"
#include "../ocgcore/common.h"
#include "../ocgcore/mtrandom.h" #include "../ocgcore/mtrandom.h"
namespace ygo { namespace ygo {
......
#ifndef SINGLE_DUEL_H #ifndef SINGLE_DUEL_H
#define SINGLE_DUEL_H #define SINGLE_DUEL_H
#include "config.h"
#include "network.h" #include "network.h"
#include "deck_manager.h"
#include "replay.h" #include "replay.h"
namespace ygo { namespace ygo {
......
#include "single_mode.h" #include "single_mode.h"
#include "duelclient.h" #include "duelclient.h"
#include "game.h" #include "game.h"
#include "../ocgcore/common.h" #include "data_manager.h"
#include "../ocgcore/mtrandom.h" #include "../ocgcore/mtrandom.h"
#include <thread> #include <thread>
......
#include "config.h"
#include "tag_duel.h" #include "tag_duel.h"
#include "netserver.h" #include "netserver.h"
#include "game.h" #include "game.h"
#include "../ocgcore/ocgapi.h" #include "data_manager.h"
#include "../ocgcore/common.h"
#include "../ocgcore/mtrandom.h" #include "../ocgcore/mtrandom.h"
namespace ygo { namespace ygo {
......
#ifndef TAG_DUEL_H #ifndef TAG_DUEL_H
#define TAG_DUEL_H #define TAG_DUEL_H
#include "config.h"
#include "network.h" #include "network.h"
#include "deck_manager.h"
#include "replay.h" #include "replay.h"
namespace ygo { namespace ygo {
......
...@@ -658,7 +658,7 @@ ...@@ -658,7 +658,7 @@
!counter 0x68 指示物(图腾柱) !counter 0x68 指示物(图腾柱)
!counter 0x69 指示物(吠陀-优婆尼沙昙) !counter 0x69 指示物(吠陀-优婆尼沙昙)
!counter 0x6a 响鸣指示物 !counter 0x6a 响鸣指示物
!counter 0x6b 狂爱指示物 !counter 0x106b 狂爱指示物
!counter 0x6c 访问指示物 !counter 0x6c 访问指示物
!counter 0x6d 祝台指示物 !counter 0x6d 祝台指示物
#setnames, using tab for comment #setnames, using tab for comment
...@@ -1219,7 +1219,7 @@ ...@@ -1219,7 +1219,7 @@
!setname 0x1a9 灿幻 燦幻 !setname 0x1a9 灿幻 燦幻
!setname 0x1aa 天杯龙 天盃龍 !setname 0x1aa 天杯龙 天盃龍
!setname 0x1ab 蕾祸 蕾禍 !setname 0x1ab 蕾祸 蕾禍
!setname 0x1ac 飞龙炎 !setname 0x1ac 飞龙炎 サラマンドラ
!setname 0x1ad 灰灭 灰滅 !setname 0x1ad 灰灭 灰滅
!setname 0x1ae 千年 千年/ミレニアム !setname 0x1ae 千年 千年/ミレニアム
!setname 0x1af 艾格佐德 エグゾード !setname 0x1af 艾格佐德 エグゾード
...@@ -1241,5 +1241,5 @@ ...@@ -1241,5 +1241,5 @@
!setname 0x1be 雷火沸动 ライゼオル !setname 0x1be 雷火沸动 ライゼオル
!setname 0x1bf 码丽丝 MLICE !setname 0x1bf 码丽丝 MLICE
!setname 0x1c0 龙华 竜華 !setname 0x1c0 龙华 竜華
!setname 0x1c1耳戈视☆将ARGS !setname 0x1c1尔戈☆群ARGS
!setname 0x1c2 喷水引擎 アクア・ジェット !setname 0x1c2 喷水引擎 アクア・ジェット
...@@ -658,7 +658,7 @@ ...@@ -658,7 +658,7 @@
!counter 0x68 Counter(Totem Pole) !counter 0x68 Counter(Totem Pole)
!counter 0x69 Counter(Veda Upanishad) !counter 0x69 Counter(Veda Upanishad)
!counter 0x6a Resonance Counter !counter 0x6a Resonance Counter
!counter 0x6b Deranged Counter !counter 0x106b Deranged Counter
!counter 0x6c Access Counter !counter 0x6c Access Counter
!counter 0x6d Success Counter !counter 0x6d Success Counter
#setnames, using tab for comment #setnames, using tab for comment
......
...@@ -662,7 +662,7 @@ ...@@ -662,7 +662,7 @@
!counter 0x68 Contador(Tótem Pole) !counter 0x68 Contador(Tótem Pole)
!counter 0x69 Contador(Vedas Kalarcanum) !counter 0x69 Contador(Vedas Kalarcanum)
!counter 0x6a Contador de Resonancia !counter 0x6a Contador de Resonancia
!counter 0x6b Contador Demente !counter 0x106b Contador Demente
!counter 0x6c Contador de Acceso !counter 0x6c Contador de Acceso
!counter 0x6d Contador de Deberes !counter 0x6d Contador de Deberes
#setnames, using tab for comment #setnames, using tab for comment
......
...@@ -658,7 +658,7 @@ ...@@ -658,7 +658,7 @@
!counter 0x68 カウンター(トーテムポール) !counter 0x68 カウンター(トーテムポール)
!counter 0x69 カウンター(ヴェーダ=ウパニシャッド) !counter 0x69 カウンター(ヴェーダ=ウパニシャッド)
!counter 0x6a 響鳴カウンター !counter 0x6a 響鳴カウンター
!counter 0x6b 狂愛カウンター !counter 0x106b 狂愛カウンター
!counter 0x6c アクセスカウンター !counter 0x6c アクセスカウンター
!counter 0x6d 祝台カウンター !counter 0x6d 祝台カウンター
#setnames, using tab for comment #setnames, using tab for comment
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment