i'm trying to add more options on ui_preferences.c
right about now i'm adding the option to turn off or on (1 or 0 on cvar) the cg_oldrail cvar
I think i do everything good, it compiles and build without problem but when i try to enter inside the menù i get this error message:
menu_init: unknown_type 0
any clues? what i forget?
adding options on ui_preferences.c
Re: adding options on ui_preferences.c
code of my ui_preferences.c
I just translate the first X defined position a little left and defined a new x2 position for the other future voices on the menù.
that's the code:
I just translate the first X defined position a little left and defined a new x2 position for the other future voices on the menù.
that's the code:
Code: Select all
/*
===========================================================================
Copyright (C) 1999-2005 Id Software, Inc.
This file is part of Quake III Arena source code.
Quake III Arena source code 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 2 of the License,
or (at your option) any later version.
Quake III Arena source code 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 Quake III Arena source code; if not, write to the Free Software
Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
===========================================================================
*/
//
/*
=======================================================================
GAME OPTIONS MENU
=======================================================================
*/
#include "ui_local.h"
#define ART_FRAMEL "menu/art/frame2_l"
#define ART_FRAMER "menu/art/frame1_r"
#define ART_BACK0 "menu/art/back_0"
#define ART_BACK1 "menu/art/back_1"
#define PREFERENCES_X_POS 190
#define PREFERENCES_X2_POS 320
#define ID_CROSSHAIR 127
#define ID_SIMPLEITEMS 128
#define ID_HIGHQUALITYSKY 129
#define ID_EJECTINGBRASS 130
#define ID_WALLMARKS 131
#define ID_DYNAMICLIGHTS 132
#define ID_IDENTIFYTARGET 133
#define ID_SYNCEVERYFRAME 134
#define ID_FORCEMODEL 135
#define ID_DRAWTEAMOVERLAY 136
#define ID_ALLOWDOWNLOAD 137
#define ID_OLDRAIL 139
#define ID_BACK 138
#define NUM_CROSSHAIRS 10
typedef struct {
menuframework_s menu;
menutext_s banner;
menubitmap_s framel;
menubitmap_s framer;
menulist_s crosshair;
menuradiobutton_s simpleitems;
menuradiobutton_s brass;
menuradiobutton_s wallmarks;
menuradiobutton_s dynamiclights;
menuradiobutton_s identifytarget;
menuradiobutton_s highqualitysky;
menuradiobutton_s synceveryframe;
menuradiobutton_s forcemodel;
menulist_s drawteamoverlay;
menuradiobutton_s allowdownload;
menuradiobutton_s oldRail;
menubitmap_s back;
qhandle_t crosshairShader[NUM_CROSSHAIRS];
} preferences_t;
static preferences_t s_preferences;
static const char *teamoverlay_names[] =
{
"off",
"upper right",
"lower right",
"lower left",
NULL
};
static void Preferences_SetMenuItems( void ) {
s_preferences.crosshair.curvalue = (int)trap_Cvar_VariableValue( "cg_drawCrosshair" ) % NUM_CROSSHAIRS;
s_preferences.simpleitems.curvalue = trap_Cvar_VariableValue( "cg_simpleItems" ) != 0;
s_preferences.brass.curvalue = trap_Cvar_VariableValue( "cg_brassTime" ) != 0;
s_preferences.wallmarks.curvalue = trap_Cvar_VariableValue( "cg_marks" ) != 0;
s_preferences.identifytarget.curvalue = trap_Cvar_VariableValue( "cg_drawCrosshairNames" ) != 0;
s_preferences.dynamiclights.curvalue = trap_Cvar_VariableValue( "r_dynamiclight" ) != 0;
s_preferences.highqualitysky.curvalue = trap_Cvar_VariableValue ( "r_fastsky" ) == 0;
s_preferences.synceveryframe.curvalue = trap_Cvar_VariableValue( "r_finish" ) != 0;
s_preferences.forcemodel.curvalue = trap_Cvar_VariableValue( "cg_forcemodel" ) != 0;
s_preferences.drawteamoverlay.curvalue = Com_Clamp( 0, 3, trap_Cvar_VariableValue( "cg_drawTeamOverlay" ) );
s_preferences.allowdownload.curvalue = trap_Cvar_VariableValue( "cl_allowDownload" ) != 0;
s_preferences.oldRail.curvalue = trap_Cvar_VariableValue( "cg_oldRail" ) != 1;
}
static void Preferences_Event( void* ptr, int notification ) {
if( notification != QM_ACTIVATED ) {
return;
}
switch( ((menucommon_s*)ptr)->id ) {
case ID_CROSSHAIR:
s_preferences.crosshair.curvalue++;
if( s_preferences.crosshair.curvalue == NUM_CROSSHAIRS ) {
s_preferences.crosshair.curvalue = 0;
}
trap_Cvar_SetValue( "cg_drawCrosshair", s_preferences.crosshair.curvalue );
break;
case ID_SIMPLEITEMS:
trap_Cvar_SetValue( "cg_simpleItems", s_preferences.simpleitems.curvalue );
break;
case ID_HIGHQUALITYSKY:
trap_Cvar_SetValue( "r_fastsky", !s_preferences.highqualitysky.curvalue );
break;
case ID_EJECTINGBRASS:
if ( s_preferences.brass.curvalue )
trap_Cvar_Reset( "cg_brassTime" );
else
trap_Cvar_SetValue( "cg_brassTime", 0 );
break;
case ID_WALLMARKS:
trap_Cvar_SetValue( "cg_marks", s_preferences.wallmarks.curvalue );
break;
case ID_DYNAMICLIGHTS:
trap_Cvar_SetValue( "r_dynamiclight", s_preferences.dynamiclights.curvalue );
break;
case ID_IDENTIFYTARGET:
trap_Cvar_SetValue( "cg_drawCrosshairNames", s_preferences.identifytarget.curvalue );
break;
case ID_SYNCEVERYFRAME:
trap_Cvar_SetValue( "r_finish", s_preferences.synceveryframe.curvalue );
break;
case ID_FORCEMODEL:
trap_Cvar_SetValue( "cg_forcemodel", s_preferences.forcemodel.curvalue );
break;
case ID_DRAWTEAMOVERLAY:
trap_Cvar_SetValue( "cg_drawTeamOverlay", s_preferences.drawteamoverlay.curvalue );
break;
case ID_ALLOWDOWNLOAD:
trap_Cvar_SetValue( "cl_allowDownload", s_preferences.allowdownload.curvalue );
trap_Cvar_SetValue( "sv_allowDownload", s_preferences.allowdownload.curvalue );
break;
case ID_OLDRAIL:
trap_Cvar_SetValue( "cg_oldRail", s_preferences.oldRail.curvalue );
case ID_BACK:
UI_PopMenu();
break;
}
}
/*
=================
Crosshair_Draw
=================
*/
static void Crosshair_Draw( void *self ) {
menulist_s *s;
float *color;
int x, y;
int style;
qboolean focus;
s = (menulist_s *)self;
x = s->generic.x;
y = s->generic.y;
style = UI_SMALLFONT;
focus = (s->generic.parent->cursor == s->generic.menuPosition);
if ( s->generic.flags & QMF_GRAYED )
color = text_color_disabled;
else if ( focus )
{
color = text_color_highlight;
style |= UI_PULSE;
}
else if ( s->generic.flags & QMF_BLINK )
{
color = text_color_highlight;
style |= UI_BLINK;
}
else
color = text_color_normal;
if ( focus )
{
// draw cursor
UI_FillRect( s->generic.left, s->generic.top, s->generic.right-s->generic.left+1, s->generic.bottom-s->generic.top+1, listbar_color );
UI_DrawChar( x, y, 13, UI_CENTER|UI_BLINK|UI_SMALLFONT, color);
}
UI_DrawString( x - SMALLCHAR_WIDTH, y, s->generic.name, style|UI_RIGHT, color );
if( !s->curvalue ) {
return;
}
UI_DrawHandlePic( x + SMALLCHAR_WIDTH, y - 4, 24, 24, s_preferences.crosshairShader[s->curvalue] );
}
static void Preferences_MenuInit( void ) {
int y;
memset( &s_preferences, 0 ,sizeof(preferences_t) );
Preferences_Cache();
s_preferences.menu.wrapAround = qtrue;
s_preferences.menu.fullscreen = qtrue;
s_preferences.banner.generic.type = MTYPE_BTEXT;
s_preferences.banner.generic.x = 320;
s_preferences.banner.generic.y = 16;
s_preferences.banner.string = "GAME OPTIONS";
s_preferences.banner.color = color_white;
s_preferences.banner.style = UI_CENTER;
s_preferences.framel.generic.type = MTYPE_BITMAP;
s_preferences.framel.generic.name = ART_FRAMEL;
s_preferences.framel.generic.flags = QMF_INACTIVE;
s_preferences.framel.generic.x = 0;
s_preferences.framel.generic.y = 78;
s_preferences.framel.width = 256;
s_preferences.framel.height = 329;
s_preferences.framer.generic.type = MTYPE_BITMAP;
s_preferences.framer.generic.name = ART_FRAMER;
s_preferences.framer.generic.flags = QMF_INACTIVE;
s_preferences.framer.generic.x = 376;
s_preferences.framer.generic.y = 76;
s_preferences.framer.width = 256;
s_preferences.framer.height = 334;
y = 144;
s_preferences.crosshair.generic.type = MTYPE_TEXT;
s_preferences.crosshair.generic.flags = QMF_PULSEIFFOCUS|QMF_SMALLFONT|QMF_NODEFAULTINIT|QMF_OWNERDRAW;
s_preferences.crosshair.generic.x = PREFERENCES_X_POS;
s_preferences.crosshair.generic.y = y;
s_preferences.crosshair.generic.name = "Crosshair:";
s_preferences.crosshair.generic.callback = Preferences_Event;
s_preferences.crosshair.generic.ownerdraw = Crosshair_Draw;
s_preferences.crosshair.generic.id = ID_CROSSHAIR;
s_preferences.crosshair.generic.top = y - 4;
s_preferences.crosshair.generic.bottom = y + 20;
s_preferences.crosshair.generic.left = PREFERENCES_X_POS - ( ( strlen(s_preferences.crosshair.generic.name) + 1 ) * SMALLCHAR_WIDTH );
s_preferences.crosshair.generic.right = PREFERENCES_X_POS + 48;
y += BIGCHAR_HEIGHT+2+4;
s_preferences.simpleitems.generic.type = MTYPE_RADIOBUTTON;
s_preferences.simpleitems.generic.name = "Simple Items:";
s_preferences.simpleitems.generic.flags = QMF_PULSEIFFOCUS|QMF_SMALLFONT;
s_preferences.simpleitems.generic.callback = Preferences_Event;
s_preferences.simpleitems.generic.id = ID_SIMPLEITEMS;
s_preferences.simpleitems.generic.x = PREFERENCES_X_POS;
s_preferences.simpleitems.generic.y = y;
y += BIGCHAR_HEIGHT;
s_preferences.wallmarks.generic.type = MTYPE_RADIOBUTTON;
s_preferences.wallmarks.generic.name = "Marks on Walls:";
s_preferences.wallmarks.generic.flags = QMF_PULSEIFFOCUS|QMF_SMALLFONT;
s_preferences.wallmarks.generic.callback = Preferences_Event;
s_preferences.wallmarks.generic.id = ID_WALLMARKS;
s_preferences.wallmarks.generic.x = PREFERENCES_X_POS;
s_preferences.wallmarks.generic.y = y;
y += BIGCHAR_HEIGHT+2;
s_preferences.brass.generic.type = MTYPE_RADIOBUTTON;
s_preferences.brass.generic.name = "Ejecting Brass:";
s_preferences.brass.generic.flags = QMF_PULSEIFFOCUS|QMF_SMALLFONT;
s_preferences.brass.generic.callback = Preferences_Event;
s_preferences.brass.generic.id = ID_EJECTINGBRASS;
s_preferences.brass.generic.x = PREFERENCES_X_POS;
s_preferences.brass.generic.y = y;
y += BIGCHAR_HEIGHT+2;
s_preferences.dynamiclights.generic.type = MTYPE_RADIOBUTTON;
s_preferences.dynamiclights.generic.name = "Dynamic Lights:";
s_preferences.dynamiclights.generic.flags = QMF_PULSEIFFOCUS|QMF_SMALLFONT;
s_preferences.dynamiclights.generic.callback = Preferences_Event;
s_preferences.dynamiclights.generic.id = ID_DYNAMICLIGHTS;
s_preferences.dynamiclights.generic.x = PREFERENCES_X_POS;
s_preferences.dynamiclights.generic.y = y;
y += BIGCHAR_HEIGHT+2;
s_preferences.identifytarget.generic.type = MTYPE_RADIOBUTTON;
s_preferences.identifytarget.generic.name = "Identify Target:";
s_preferences.identifytarget.generic.flags = QMF_PULSEIFFOCUS|QMF_SMALLFONT;
s_preferences.identifytarget.generic.callback = Preferences_Event;
s_preferences.identifytarget.generic.id = ID_IDENTIFYTARGET;
s_preferences.identifytarget.generic.x = PREFERENCES_X_POS;
s_preferences.identifytarget.generic.y = y;
y += BIGCHAR_HEIGHT+2;
s_preferences.highqualitysky.generic.type = MTYPE_RADIOBUTTON;
s_preferences.highqualitysky.generic.name = "High Quality Sky:";
s_preferences.highqualitysky.generic.flags = QMF_PULSEIFFOCUS|QMF_SMALLFONT;
s_preferences.highqualitysky.generic.callback = Preferences_Event;
s_preferences.highqualitysky.generic.id = ID_HIGHQUALITYSKY;
s_preferences.highqualitysky.generic.x = PREFERENCES_X_POS;
s_preferences.highqualitysky.generic.y = y;
y += BIGCHAR_HEIGHT+2;
s_preferences.synceveryframe.generic.type = MTYPE_RADIOBUTTON;
s_preferences.synceveryframe.generic.name = "Sync Every Frame:";
s_preferences.synceveryframe.generic.flags = QMF_PULSEIFFOCUS|QMF_SMALLFONT;
s_preferences.synceveryframe.generic.callback = Preferences_Event;
s_preferences.synceveryframe.generic.id = ID_SYNCEVERYFRAME;
s_preferences.synceveryframe.generic.x = PREFERENCES_X_POS;
s_preferences.synceveryframe.generic.y = y;
y += BIGCHAR_HEIGHT+2;
s_preferences.forcemodel.generic.type = MTYPE_RADIOBUTTON;
s_preferences.forcemodel.generic.name = "Force Player Models:";
s_preferences.forcemodel.generic.flags = QMF_PULSEIFFOCUS|QMF_SMALLFONT;
s_preferences.forcemodel.generic.callback = Preferences_Event;
s_preferences.forcemodel.generic.id = ID_FORCEMODEL;
s_preferences.forcemodel.generic.x = PREFERENCES_X_POS;
s_preferences.forcemodel.generic.y = y;
y += BIGCHAR_HEIGHT+2;
s_preferences.drawteamoverlay.generic.type = MTYPE_SPINCONTROL;
s_preferences.drawteamoverlay.generic.name = "Draw Team Overlay:";
s_preferences.drawteamoverlay.generic.flags = QMF_PULSEIFFOCUS|QMF_SMALLFONT;
s_preferences.drawteamoverlay.generic.callback = Preferences_Event;
s_preferences.drawteamoverlay.generic.id = ID_DRAWTEAMOVERLAY;
s_preferences.drawteamoverlay.generic.x = PREFERENCES_X_POS;
s_preferences.drawteamoverlay.generic.y = y;
s_preferences.drawteamoverlay.itemnames = teamoverlay_names;
y += BIGCHAR_HEIGHT+2;
s_preferences.allowdownload.generic.type = MTYPE_RADIOBUTTON;
s_preferences.allowdownload.generic.name = "Automatic Downloading:";
s_preferences.allowdownload.generic.flags = QMF_PULSEIFFOCUS|QMF_SMALLFONT;
s_preferences.allowdownload.generic.callback = Preferences_Event;
s_preferences.allowdownload.generic.id = ID_ALLOWDOWNLOAD;
s_preferences.allowdownload.generic.x = PREFERENCES_X_POS;
s_preferences.allowdownload.generic.y = y;
y += BIGCHAR_HEIGHT+2;
s_preferences.allowdownload.generic.type = MTYPE_RADIOBUTTON;
s_preferences.allowdownload.generic.name = "Old Railgun:";
s_preferences.allowdownload.generic.flags = QMF_PULSEIFFOCUS|QMF_SMALLFONT;
s_preferences.allowdownload.generic.callback = Preferences_Event;
s_preferences.allowdownload.generic.id = ID_OLDRAIL;
s_preferences.allowdownload.generic.x = PREFERENCES_X_POS;
s_preferences.allowdownload.generic.y = y;
y += BIGCHAR_HEIGHT+2;
s_preferences.back.generic.type = MTYPE_BITMAP;
s_preferences.back.generic.name = ART_BACK0;
s_preferences.back.generic.flags = QMF_LEFT_JUSTIFY|QMF_PULSEIFFOCUS;
s_preferences.back.generic.callback = Preferences_Event;
s_preferences.back.generic.id = ID_BACK;
s_preferences.back.generic.x = 0;
s_preferences.back.generic.y = 480-64;
s_preferences.back.width = 128;
s_preferences.back.height = 64;
s_preferences.back.focuspic = ART_BACK1;
Menu_AddItem( &s_preferences.menu, &s_preferences.banner );
Menu_AddItem( &s_preferences.menu, &s_preferences.framel );
Menu_AddItem( &s_preferences.menu, &s_preferences.framer );
Menu_AddItem( &s_preferences.menu, &s_preferences.crosshair );
Menu_AddItem( &s_preferences.menu, &s_preferences.simpleitems );
Menu_AddItem( &s_preferences.menu, &s_preferences.wallmarks );
Menu_AddItem( &s_preferences.menu, &s_preferences.brass );
Menu_AddItem( &s_preferences.menu, &s_preferences.dynamiclights );
Menu_AddItem( &s_preferences.menu, &s_preferences.identifytarget );
Menu_AddItem( &s_preferences.menu, &s_preferences.highqualitysky );
Menu_AddItem( &s_preferences.menu, &s_preferences.synceveryframe );
Menu_AddItem( &s_preferences.menu, &s_preferences.forcemodel );
Menu_AddItem( &s_preferences.menu, &s_preferences.drawteamoverlay );
Menu_AddItem( &s_preferences.menu, &s_preferences.allowdownload );
Menu_AddItem( &s_preferences.menu, &s_preferences.oldRail );
Menu_AddItem( &s_preferences.menu, &s_preferences.back );
Preferences_SetMenuItems();
}
/*
===============
Preferences_Cache
===============
*/
void Preferences_Cache( void ) {
int n;
trap_R_RegisterShaderNoMip( ART_FRAMEL );
trap_R_RegisterShaderNoMip( ART_FRAMER );
trap_R_RegisterShaderNoMip( ART_BACK0 );
trap_R_RegisterShaderNoMip( ART_BACK1 );
for( n = 0; n < NUM_CROSSHAIRS; n++ ) {
s_preferences.crosshairShader[n] = trap_R_RegisterShaderNoMip( va("gfx/2d/crosshair%c", 'a' + n ) );
}
}
/*
===============
UI_PreferencesMenu
===============
*/
void UI_PreferencesMenu( void ) {
Preferences_MenuInit();
UI_PushMenu( &s_preferences.menu );
}
Re: adding options on ui_preferences.c
Two things. First of all, in Preferences_MenuInit() you have this bit of code:
Seems to me that instead of assigning values to members of s_preferences.allowdownload, you should assign to s_preferences.oldRail. Looks like some sloppy copy-pasting work there 
I think things then break down when you try to add s_preferences.oldRail to the menu with the Menu_AddItem() line because s_preferences.oldRail is empty.
Second thing is that in Preferences_SetMenuItems() you do this:
Maybe my logic is abandoning me here, but why are you checking if the value of cg_oldRail is not equal to 1? Shouldn't that be not equal to 0, like the other settings? Now if cg_oldRail has the value 0, then your radiobutton for the setting will be checked. Shouldn't it be the other way around? Your menu item's description is "Old railgun", so I'd say that if cg_oldRail is anything other than 0, it should check the radiobutton.
Code: Select all
y += BIGCHAR_HEIGHT+2;
s_preferences.allowdownload.generic.type = MTYPE_RADIOBUTTON;
s_preferences.allowdownload.generic.name = "Old Railgun:";
s_preferences.allowdownload.generic.flags = QMF_PULSEIFFOCUS|QMF_SMALLFONT;
s_preferences.allowdownload.generic.callback = Preferences_Event;
s_preferences.allowdownload.generic.id = ID_OLDRAIL;
s_preferences.allowdownload.generic.x = PREFERENCES_X_POS;
s_preferences.allowdownload.generic.y = y;

I think things then break down when you try to add s_preferences.oldRail to the menu with the Menu_AddItem() line because s_preferences.oldRail is empty.
Second thing is that in Preferences_SetMenuItems() you do this:
Code: Select all
s_preferences.oldRail.curvalue = trap_Cvar_VariableValue( "cg_oldRail" ) != 1;
Re: adding options on ui_preferences.c
As Ever, thank you Eraser! I made a mess. I changed a lot of times some cvars and yes, i copied and pasted the code...but i forget to change s_preferences.allowdownload. to what i need to assign. I was getting mad for this distraction. and also for the != 0 you are right, also because the button will switch on, so old railgun: ON.
Btw, do you got any new maps for entity mod?
Btw, do you got any new maps for entity mod?
Re: adding options on ui_preferences.c
None that I know of. I was still working on one myself but never got around to finishing it. Maybe I should pick it up again....