From 425decdf7e9284d15aa726e3ae96b9942fb0e3ea Mon Sep 17 00:00:00 2001 From: IronClawTrem Date: Sun, 16 Feb 2020 03:40:06 +0000 Subject: create tremded branch --- src/script/cvar.h | 146 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 146 insertions(+) create mode 100644 src/script/cvar.h (limited to 'src/script/cvar.h') diff --git a/src/script/cvar.h b/src/script/cvar.h new file mode 100644 index 0000000..a5eb90c --- /dev/null +++ b/src/script/cvar.h @@ -0,0 +1,146 @@ +// This file is part of Tremulous. +// Copyright © 2016 Victor Roemer (blowfish) +// Copyright (C) 2015-2019 GrangerHub +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation; either version 3 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, see . + +// It's quite possible this is _way over the top_ but I've been toying +// with several ideas. -Victor + +#ifndef __cplusplus +#error __file__ " is only available to C++" +#endif + +#ifndef SCRIPT_CVAR_H +#define SCRIPT_CVAR_H + +#include +#include + +#include "qcommon/cvar.h" +#include "qcommon/q_shared.h" +#include "qcommon/qcommon.h" + +namespace sol +{ + class state; +}; + +namespace script +{ + ////////////////////////////////////////////// Exceptions //////////// + class CvarInvalidName : public std::exception { + public: + virtual const char* what() const throw() + { return "cvar name is invalid"; } + }; + + class CvarNotFound : public std::exception { + public: + virtual const char* what() const throw() + { return "cvar does not exist"; } + }; + + class CvarReadOnly : public std::exception { + public: + virtual const char *what() const throw() + { return "cvar is readonly"; } + }; + + class CvarWriteProtected : public std::exception { + public: + virtual const char *what() const throw() + { return "cvar is write protected"; } + }; + + class CvarCheatProtected : public std::exception { + public: + virtual const char *what() const throw() + { return "cvar is cheat protected"; } + }; + + class CvarLatchedUnsupported : public std::exception { + public: + virtual const char *what() const throw() + { return "modifying latched cvars is unsupported"; } + }; + + extern "C" cvar_t *cvar_cheats; + ////////////////////////////////////////////// class Cvar //////////// + struct Cvar { + private: + cvar_s *my = nullptr; + + Cvar() = delete; + + public: + Cvar(cvar_s* var) + : my(var) + { } + + Cvar(std::string name) + { my = Cvar_Get(name.c_str(), "", 0); } + + Cvar(std::string name, std::string value) + { my = Cvar_Get(name.c_str(), value.c_str(), CVAR_ARCHIVE); } + + Cvar(std::string name, std::string value, int flags) + { my = Cvar_Get(name.c_str(), value.c_str(), flags); } + + void set_value(const char*value) + { + if ( !my ) + throw CvarNotFound(); + else if ( my->flags & CVAR_ROM ) + throw CvarReadOnly(); + else if ( my->flags & CVAR_INIT ) + throw CvarWriteProtected(); + else if ( my->flags & CVAR_CHEAT && !cvar_cheats->integer ) + throw CvarCheatProtected(); + else if ( (my->flags & CVAR_LATCH) ) + throw CvarLatchedUnsupported(); + else if ( !value ) + value = my->resetString; + value = Cvar_Validate(my, value, false); + + cvar_modifiedFlags |= my->flags; + + my->modified = true; + my->modificationCount++; + my->string = CopyString(value); + my->value = atof(my->string); + my->integer = atoi(my->string); + } + + std::string get_value() + { return my->string; } + + std::string get_key() + { return my->name; } + }; + + namespace cvar { + static inline void init(sol::state&& lua) + { + lua.new_usertype( + "cvar", sol::constructors, + sol::types, + sol::types>(), + "value", sol::property(&Cvar::get_value, &Cvar::set_value), + "key", sol::property(&Cvar::get_key) + ); + } + }; +}; +#endif -- cgit