summaryrefslogtreecommitdiff
path: root/src/script/cvar.h
diff options
context:
space:
mode:
authorIronClawTrem <louie.nutman@gmail.com>2020-02-16 03:40:06 +0000
committerIronClawTrem <louie.nutman@gmail.com>2020-02-16 03:40:06 +0000
commit425decdf7e9284d15aa726e3ae96b9942fb0e3ea (patch)
tree6c0dd7edfefff1be7b9e75fe0b3a0a85fe1595f3 /src/script/cvar.h
parentccb0b2e4d6674a7a00c9bf491f08fc73b6898c54 (diff)
create tremded branch
Diffstat (limited to 'src/script/cvar.h')
-rw-r--r--src/script/cvar.h146
1 files changed, 146 insertions, 0 deletions
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) <victor@badsec.org>
+// 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 <http://www.gnu.org/licenses/>.
+
+// 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 <iostream>
+#include <exception>
+
+#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>(
+ "cvar", sol::constructors<sol::types<std::string>,
+ sol::types<std::string, std::string>,
+ sol::types<std::string, std::string, int>>(),
+ "value", sol::property(&Cvar::get_value, &Cvar::set_value),
+ "key", sol::property(&Cvar::get_key)
+ );
+ }
+ };
+};
+#endif