../dpdefs/csprogsdefs.qh
../common/util-post.qh
+../lib/_all.inc
+
announcer.qc
bgmscript.qc
casings.qc
REGISTER_MUTATOR(damagetext, true);
-#ifdef CSQC
+#if defined(CSQC) || defined(MENUQC)
bool autocvar_cl_damagetext = false;
string autocvar_cl_damagetext_format = "-%3$d";
vector autocvar_cl_damagetext_color = '1 1 0';
vector autocvar_cl_damagetext_velocity = '0 0 20';
vector autocvar_cl_damagetext_offset = '0 -40 0';
float autocvar_cl_damagetext_accumulate_range = 30;
+
STATIC_INIT(cl_damagetext) {
CVAR_DESCRIBE(cl_damagetext, _("Draw damage dealt. 0: disabled, 1: enabled"));
CVAR_DESCRIBESTR(cl_damagetext_format, _("How to format the damage text. 1$ is health, 2$ is armor, 3$ is both"));
CVAR_DESCRIBEVEC(cl_damagetext_offset, _("Damage text offset"));
CVAR_DESCRIBE(cl_damagetext_accumulate_range, _("Damage text spawned within this range is accumulated"));
}
+#endif
+#ifdef CSQC
CLASS(DamageText, Object)
ATTRIB(DamageText, m_color, vector, autocvar_cl_damagetext_color)
ATTRIB(DamageText, m_size, float, autocvar_cl_damagetext_size)
return true;
}
#endif
+
+#ifdef MENUQC
+#include "../../../menu/xonotic/tab.qc"
+CLASS(XonoticDamageTextSettings, XonoticTab)
+ #include "../../../menu/gamesettings.qh"
+ REGISTER_SETTINGS(damagetext, NEW(XonoticDamageTextSettings));
+ ATTRIB(XonoticDamageTextSettings, title, string, _("Damage text"))
+ ATTRIB(XonoticDamageTextSettings, intendedWidth, float, 0.9)
+ ATTRIB(XonoticDamageTextSettings, rows, float, 13)
+ ATTRIB(XonoticDamageTextSettings, columns, float, 5)
+ INIT(XonoticDamageTextSettings) { this.configureDialog(this); }
+ METHOD(XonoticDamageTextSettings, showNotify, void(entity this)) { loadAllCvars(this); }
+ METHOD(XonoticDamageTextSettings, fill, void(entity this))
+ {
+ this.gotoRC(this, 0, 1); this.setFirstColumn(this, this.currentColumn);
+ this.TD(this, 1, 3, makeXonoticCheckBox(0, "cl_damagetext", _("Draw damage numbers")));
+ this.TR(this);
+ this.TD(this, 1, 1, makeXonoticTextLabel(0, _("Font size:")));
+ this.TD(this, 1, 2, makeXonoticSlider(0, 50, 1, "cl_damagetext_size"));
+ this.TR(this);
+ this.TD(this, 1, 1, makeXonoticTextLabel(0, _("Accumulate range:")));
+ this.TD(this, 1, 2, makeXonoticSlider(0, 500, 1, "cl_damagetext_accumulate_range"));
+ this.TR(this);
+ this.TD(this, 1, 1, makeXonoticTextLabel(0, _("Lifetime:")));
+ this.TD(this, 1, 2, makeXonoticSlider(0, 10, 1, "cl_damagetext_alpha_lifetime"));
+ this.TR(this);
+ this.TD(this, 1, 1, makeXonoticTextLabel(0, _("Color:")));
+ this.TD(this, 2, 2, makeXonoticColorpickerString("cl_damagetext_color", "cl_damagetext_color"));
+ }
+ENDCLASS(XonoticDamageTextSettings)
+#endif
--- /dev/null
+#ifndef LAZY_H
+#define LAZY_H
+CLASS(Lazy, Object)
+ ATTRIB(Lazy, m_get, entity(), func_null);
+ CONSTRUCTOR(Lazy, entity() _compute) { this.m_get = _compute; }
+ENDCLASS(Lazy)
+
+#define LAZY(id) __lazy_##id
+#define LAZY_NEW(id, compute) entity LAZY(id)() { \
+ static bool done; \
+ static entity it; \
+ if (!done) { it = compute; done = true; } \
+ return it; \
+}
+#endif
--- /dev/null
+#include "Lazy.qh"
--- /dev/null
+#ifdef MENUQC
+#ifndef GAMESETTINGS_H
+#define GAMESETTINGS_H
+
+void RegisterSettings();
+const int MAX_SETTINGS = 24;
+Lazy SETTINGS[MAX_SETTINGS], SETTINGS_first, SETTINGS_last;
+int SETTINGS_COUNT;
+#define REGISTER_SETTINGS(id, impl) \
+ LAZY_NEW(id, impl) \
+ REGISTER(RegisterSettings, MENU, SETTINGS, SETTINGS_COUNT, id, m_id, NEW(Lazy, LAZY(id)))
+REGISTER_REGISTRY(RegisterSettings)
+
+#endif
+#endif
METHOD(InputContainer, focusLeave, void(entity));
METHOD(InputContainer, resizeNotify, void(entity, vector, vector, vector, vector));
- METHOD(InputContainer, _changeFocusXY, float(entity, vector));
+ METHOD(InputContainer, _changeFocusXY, bool(entity this, vector pos));
ATTRIB(InputContainer, mouseFocusedChild, entity, NULL)
ATTRIB(InputContainer, isTabRoot, float, 0)
ENDCLASS(InputContainer)
return 0;
}
-float InputContainer__changeFocusXY(entity me, vector pos)
+bool InputContainer__changeFocusXY(entity this, vector pos)
{
- entity e, ne;
- e = me.mouseFocusedChild;
- ne = me.itemFromPoint(me, pos);
- if(ne)
- if (!ne.focusable)
- ne = NULL;
- me.mouseFocusedChild = ne;
- if(ne)
- if(ne != e)
- {
- me.setFocus(me, ne);
- if(ne.instanceOfInputContainer)
- {
- ne.focusedChild = NULL;
- ne._changeFocusXY(e, globalToBox(pos, ne.Container_origin, ne.Container_size));
- }
+ entity e = this.itemFromPoint(this, pos);
+ if (e && !e.focusable) e = NULL;
+ entity prev = this.mouseFocusedChild;
+ this.mouseFocusedChild = e;
+ if (!e) return false; // keep focus when hovering over non-focusable elements
+ if (e != prev) {
+ this.setFocus(this, e);
+ if (e.instanceOfInputContainer) {
+ e.focusedChild = NULL;
+ e._changeFocusXY(e, globalToBox(pos, e.Container_origin, e.Container_size));
}
- return (ne != NULL);
+ }
+ return true; // have focus
}
float InputContainer_mouseDrag(entity me, vector pos)
../dpdefs/keycodes.qh
../common/util-post.qh
+../lib/_all.inc
+
oo/classes.qc
draw.qc
../common/items/all.qc
../common/monsters/all.qc
+../common/mutators/all.qc
../common/vehicles/all.qc
../common/weapons/all.qc
me.TD(me, 1, 2, mc.makeTabButton(mc, _("Effects"), makeXonoticEffectsSettingsTab()));
me.TD(me, 1, 2, mc.makeTabButton(mc, _("Audio"), makeXonoticAudioSettingsTab()));
me.TR(me);
- me.TD(me, 1, 1.5, mc.makeTabButton(mc, _("Game"), makeXonoticGameSettingsTab()));
+ me.TD(me, 1, 1.5, mc.makeTabButton(mc, _("Game"), NEW(XonoticGameSettingsTab)));
me.TD(me, 1, 1.5, mc.makeTabButton(mc, _("Input"), makeXonoticInputSettingsTab()));
me.TD(me, 1, 1.5, mc.makeTabButton(mc, _("User"), makeXonoticUserSettingsTab()));
me.TD(me, 1, 1.5, mc.makeTabButton(mc, _("Misc"), makeXonoticMiscSettingsTab()));
#ifndef DIALOG_SETTINGS_GAME_H
#define DIALOG_SETTINGS_GAME_H
+
+#include "../gamesettings.qh"
+
+#include "datasource.qc"
+CLASS(SettingSource, DataSource)
+ METHOD(SettingSource, getEntry, entity(int i, void(string name, string icon) returns))
+ {
+ Lazy l = SETTINGS[i];
+ entity it = l.m_get();
+ if (returns) returns(it.title, string_null);
+ return it;
+ }
+ METHOD(SettingSource, reload, int(string filter)) { return SETTINGS_COUNT; }
+ENDCLASS(SettingSource)
+
+#include "listbox.qc"
+CLASS(XonoticRegisteredSettingsList, XonoticListBox)
+ ATTRIB(XonoticRegisteredSettingsList, alphaBG, float, 0)
+ ATTRIB(XonoticRegisteredSettingsList, itemAbsSize, vector, '0 0 0')
+ ATTRIB(XonoticRegisteredSettingsList, origin, vector, '0 0 0')
+ ATTRIB(XonoticRegisteredSettingsList, realFontSize, vector, '0 0 0')
+ ATTRIB(XonoticRegisteredSettingsList, realUpperMargin, float, 0)
+ ATTRIB(XonoticRegisteredSettingsList, rowsPerItem, float, 2)
+ ATTRIB(XonoticRegisteredSettingsList, stringFilterBox, entity, NULL)
+ ATTRIB(XonoticRegisteredSettingsList, stringFilter, string, string_null)
+ ATTRIB(XonoticRegisteredSettingsList, typeToSearchString, string, string_null)
+ ATTRIB(XonoticRegisteredSettingsList, typeToSearchTime, float, 0)
+ ATTRIB(XonoticRegisteredSettingsList, source, DataSource, NULL)
+ ATTRIB(XonoticRegisteredSettingsList, onChange, void(entity, entity), func_null)
+ ATTRIB(XonoticRegisteredSettingsList, onChangeEntity, entity, NULL)
+ string XonoticRegisteredSettingsList_cb_name;
+ void XonoticRegisteredSettingsList_cb(string _name, string _icon)
+ {
+ XonoticRegisteredSettingsList_cb_name = _name;
+ }
+ METHOD(XonoticRegisteredSettingsList, drawListBoxItem, void(entity this, int i, vector absSize, bool isSelected, bool isFocused))
+ {
+ if (!this.source) return;
+ if (!this.source.getEntry(i, XonoticRegisteredSettingsList_cb)) return;
+ string name = XonoticRegisteredSettingsList_cb_name;
+ if (isSelected) {
+ draw_Fill('0 0 0', '1 1 0', SKINCOLOR_LISTBOX_SELECTED, SKINALPHA_LISTBOX_SELECTED);
+ } else if (isFocused) {
+ this.focusedItemAlpha = getFadedAlpha(this.focusedItemAlpha, SKINALPHA_LISTBOX_FOCUSED, SKINFADEALPHA_LISTBOX_FOCUSED);
+ draw_Fill('0 0 0', '1 1 0', SKINCOLOR_LISTBOX_FOCUSED, this.focusedItemAlpha);
+ }
+ string s = draw_TextShortenToWidth(strdecolorize(name), 1, 0, this.realFontSize);
+ draw_Text(this.realUpperMargin * eY + (0.5 * this.realFontSize.x) * eX, s, this.realFontSize, '1 1 1', SKINALPHA_TEXT, 0);
+ }
+ METHOD(XonoticRegisteredSettingsList, refilter, void(entity this))
+ {
+ if (!this.source) {
+ this.nItems = 0;
+ return;
+ }
+ this.nItems = this.source.reload(this.stringFilter);
+ }
+ METHOD(XonoticRegisteredSettingsList, resizeNotify, void(entity this, vector relOrigin, vector relSize, vector absOrigin, vector absSize))
+ {
+ super.resizeNotify(this, relOrigin, relSize, absOrigin, absSize);
+
+ this.itemAbsSize = '0 0 0';
+ this.realFontSize_y = this.fontSize / (this.itemAbsSize_y = (absSize.y * this.itemHeight));
+ this.realFontSize_x = this.fontSize / (this.itemAbsSize_x = (absSize.x * (1 - this.controlWidth)));
+ this.realUpperMargin = 0.5 * (1 - this.realFontSize.y);
+ }
+ METHOD(XonoticRegisteredSettingsList, setSelected, void(entity this, int i))
+ {
+ super.setSelected(this, i);
+ this.onChange(this, this.onChangeEntity);
+ }
+ CONSTRUCTOR(XonoticRegisteredSettingsList, DataSource _source) {
+ CONSTRUCT(XonoticRegisteredSettingsList);
+ this.source = _source;
+ this.configureXonoticListBox(this);
+ this.refilter(this);
+ }
+ENDCLASS(XonoticRegisteredSettingsList)
+
#include "tab.qc"
CLASS(XonoticGameSettingsTab, XonoticTab)
- METHOD(XonoticGameSettingsTab, fill, void(entity));
ATTRIB(XonoticGameSettingsTab, intendedWidth, float, 0.9)
- ATTRIB(XonoticGameSettingsTab, rows, float, 15.5)
- ATTRIB(XonoticGameSettingsTab, columns, float, 6.5)
-ENDCLASS(XonoticGameSettingsTab)
-entity makeXonoticGameSettingsTab();
-#endif
+ ATTRIB(XonoticGameSettingsTab, rows, float, 15.5)
+ ATTRIB(XonoticGameSettingsTab, columns, float, 6.5)
+ ATTRIB(XonoticGameSettingsTab, topicList, entity, NEW(XonoticRegisteredSettingsList, NEW(SettingSource)))
+ ATTRIB(XonoticGameSettingsTab, currentPanel, entity, NEW(XonoticTab))
+ ATTRIB(XonoticGameSettingsTab, currentItem, entity, NULL)
+ METHOD(XonoticGameSettingsTab, topicChangeNotify, void(entity, entity this))
+ {
+ entity c = this.currentPanel;
+ entity removing = this.currentItem;
+ entity adding = this.topicList.source.getEntry(this.topicList.selectedItem, func_null);
+ if (removing == adding) return;
+ if (removing) {
+ this.currentItem = NULL;
+ c.removeItem(c, removing);
+ }
+ if (adding) {
+ this.currentItem = adding;
+ adding.resizeNotify(adding, '0 0 0', c.size, '0 0 0', c.size);
+ c.addItem(c, adding, '0 0 0', '1 1 0', 1);
+ }
+ }
+ METHOD(XonoticGameSettingsTab, fill, void(entity this))
+ {
+ entity topics = this.topicList;
+ topics.onChange = this.topicChangeNotify;
+ topics.onChangeEntity = this;
+
+ int
+ col = 0, width = 1.5;
+ this.gotoRC(this, 0, col);
+ this.TD(this, this.rows, width, topics);
-#ifdef IMPLEMENTATION
-entity makeXonoticGameSettingsTab()
-{
- entity me;
- me = NEW(XonoticGameSettingsTab);
- me.configureDialog(me);
- return me;
-}
-
-void XonoticGameSettingsTab_fill(entity me)
-{
- entity mc;
- mc = makeXonoticTabController(me.rows - 2.5);
-
- me.TR(me);
- me.TDempty(me, 0.25);
- me.TD(me, 1, 1, mc.makeTabButton(mc, _("View"), makeXonoticGameViewSettingsTab()));
- me.TD(me, 1, 1, mc.makeTabButton(mc, _("Crosshair"), makeXonoticGameCrosshairSettingsTab()));
- me.TD(me, 1, 1, mc.makeTabButton(mc, _("HUD"), makeXonoticGameHUDSettingsTab()));
- me.TD(me, 1, 1, mc.makeTabButton(mc, _("Messages"), makeXonoticGameMessageSettingsTab()));
- me.TD(me, 1, 1, mc.makeTabButton(mc, _("Weapons"), makeXonoticGameWeaponsSettingsTab()));
- me.TD(me, 1, 1, mc.makeTabButton(mc, _("Models"), makeXonoticGameModelSettingsTab()));
-
- me.gotoRC(me, 1.5, 0);
- me.TD(me, me.rows - 1.5, me.columns, mc);
-
- /*
-
- makeXonoticGameViewSettingsTab()));
- makeXonoticGameGeneralSettingsTab()));
- makeXonoticGameCrosshairSettingsTab()));
-
- makeXonoticGameWeaponSettingsTab()));
- l"), makeXonoticGamePlayermodelSettingsTab()));
- makeXonoticGameHUDSettingsTab()));
- on"), makeXonoticGameNotificationSettingsTab()));
-
-
- me.TR(me);
- me.TD(me, 1, 3, e = makeXonoticCheckBox(0, "cl_gentle", _("Disable gore effects and harsh language"))); // also set sv_gentle
- */
-}
+ col += width, width = this.columns - col;
+ this.gotoRC(this, 0, col); this.setFirstColumn(this, this.currentColumn);
+ this.TD(this, this.rows, width, this.currentPanel);
+
+ this.topicChangeNotify(topics, this);
+ }
+ INIT(XonoticGameSettingsTab)
+ {
+ this.configureDialog(this);
+ }
+ENDCLASS(XonoticGameSettingsTab)
#endif
CLASS(XonoticGameCrosshairSettingsTab, XonoticTab)
METHOD(XonoticGameCrosshairSettingsTab, fill, void(entity));
METHOD(XonoticGameCrosshairSettingsTab, showNotify, void(entity));
+ ATTRIB(XonoticGameCrosshairSettingsTab, title, string, _("Crosshair"))
ATTRIB(XonoticGameCrosshairSettingsTab, intendedWidth, float, 0.9)
ATTRIB(XonoticGameCrosshairSettingsTab, rows, float, 13)
ATTRIB(XonoticGameCrosshairSettingsTab, columns, float, 6.2)
ENDCLASS(XonoticGameCrosshairSettingsTab)
entity makeXonoticGameCrosshairSettingsTab();
+#include "../gamesettings.qh"
+REGISTER_SETTINGS(Crosshair, makeXonoticGameCrosshairSettingsTab());
#endif
#ifdef IMPLEMENTATION
CLASS(XonoticGameHUDSettingsTab, XonoticTab)
METHOD(XonoticGameHUDSettingsTab, fill, void(entity));
METHOD(XonoticGameHUDSettingsTab, showNotify, void(entity));
+ ATTRIB(XonoticGameHUDSettingsTab, title, string, _("HUD"))
ATTRIB(XonoticGameHUDSettingsTab, intendedWidth, float, 0.9)
ATTRIB(XonoticGameHUDSettingsTab, rows, float, 13)
ATTRIB(XonoticGameHUDSettingsTab, columns, float, 6.2)
ENDCLASS(XonoticGameHUDSettingsTab)
entity makeXonoticGameHUDSettingsTab();
void HUDSetup_Start(entity me, entity btn);
+#include "../gamesettings.qh"
+REGISTER_SETTINGS(HUD, makeXonoticGameHUDSettingsTab());
#endif
#ifdef IMPLEMENTATION
CLASS(XonoticGameMessageSettingsTab, XonoticTab)
METHOD(XonoticGameMessageSettingsTab, fill, void(entity));
METHOD(XonoticGameMessageSettingsTab, showNotify, void(entity));
+ ATTRIB(XonoticGameMessageSettingsTab, title, string, _("Messages"))
ATTRIB(XonoticGameMessageSettingsTab, intendedWidth, float, 0.9)
ATTRIB(XonoticGameMessageSettingsTab, rows, float, 13)
ATTRIB(XonoticGameMessageSettingsTab, columns, float, 6)
ATTRIB(XonoticGameMessageSettingsTab, weaponsList, entity, NULL)
ENDCLASS(XonoticGameMessageSettingsTab)
entity makeXonoticGameMessageSettingsTab();
+#include "../gamesettings.qh"
+REGISTER_SETTINGS(Messages, makeXonoticGameMessageSettingsTab());
#endif
#ifdef IMPLEMENTATION
CLASS(XonoticGameModelSettingsTab, XonoticTab)
METHOD(XonoticGameModelSettingsTab, fill, void(entity));
METHOD(XonoticGameModelSettingsTab, showNotify, void(entity));
+ ATTRIB(XonoticGameModelSettingsTab, title, string, _("Models"))
ATTRIB(XonoticGameModelSettingsTab, intendedWidth, float, 0.9)
ATTRIB(XonoticGameModelSettingsTab, rows, float, 13)
ATTRIB(XonoticGameModelSettingsTab, columns, float, 5)
ENDCLASS(XonoticGameModelSettingsTab)
entity makeXonoticGameModelSettingsTab();
+#include "../gamesettings.qh"
+REGISTER_SETTINGS(Models, makeXonoticGameModelSettingsTab());
#endif
#ifdef IMPLEMENTATION
CLASS(XonoticGameViewSettingsTab, XonoticTab)
METHOD(XonoticGameViewSettingsTab, fill, void(entity));
METHOD(XonoticGameViewSettingsTab, showNotify, void(entity));
+ ATTRIB(XonoticGameViewSettingsTab, title, string, _("View"))
ATTRIB(XonoticGameViewSettingsTab, intendedWidth, float, 0.9)
ATTRIB(XonoticGameViewSettingsTab, rows, float, 13)
ATTRIB(XonoticGameViewSettingsTab, columns, float, 6.2)
ENDCLASS(XonoticGameViewSettingsTab)
entity makeXonoticGameViewSettingsTab();
+#include "../gamesettings.qh"
+REGISTER_SETTINGS(View, makeXonoticGameViewSettingsTab());
#endif
#ifdef IMPLEMENTATION
CLASS(XonoticGameWeaponsSettingsTab, XonoticTab)
METHOD(XonoticGameWeaponsSettingsTab, fill, void(entity));
METHOD(XonoticGameWeaponsSettingsTab, showNotify, void(entity));
+ ATTRIB(XonoticGameWeaponsSettingsTab, title, string, _("Weapons"))
ATTRIB(XonoticGameWeaponsSettingsTab, intendedWidth, float, 0.9)
ATTRIB(XonoticGameWeaponsSettingsTab, rows, float, 13)
ATTRIB(XonoticGameWeaponsSettingsTab, columns, float, 6)
ATTRIB(XonoticGameWeaponsSettingsTab, weaponsList, entity, NULL)
ENDCLASS(XonoticGameWeaponsSettingsTab)
entity makeXonoticGameWeaponsSettingsTab();
+#include "../gamesettings.qh"
+REGISTER_SETTINGS(Weapons, makeXonoticGameWeaponsSettingsTab());
#endif
#ifdef IMPLEMENTATION
sys-post.qh
../common/util-post.qh
+../lib/_all.inc
+
anticheat.qc
antilag.qc
campaign.qc