Quake3World.com Forums
     Programming Discussion
        adding options on ui_preferences.c


Post new topicReply to topic
Login | Profile | | FAQ | Search | IRC




Print view Previous topic | Next topic 
Topic Starter Topic: adding options on ui_preferences.c

Warrior
Warrior
Joined: 13 May 2012
Posts: 90
PostPosted: 03-12-2013 01:40 PM           Profile Send private message  E-mail  Edit post Reply with quote


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?




Top
                 

Warrior
Warrior
Joined: 13 May 2012
Posts: 90
PostPosted: 03-14-2013 01:16 PM           Profile Send private message  E-mail  Edit post Reply with quote


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:

Code:
/*
===========================================================================
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 );
}




Top
                 

Cool #9
Cool #9
Joined: 01 Dec 2000
Posts: 44138
PostPosted: 03-15-2013 12:33 AM           Profile   Send private message  E-mail  Edit post Reply with quote


Two things. First of all, in Preferences_MenuInit() you have this bit of code:
Code:
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;


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:
Code:
s_preferences.oldRail.curvalue      = trap_Cvar_VariableValue( "cg_oldRail" ) != 1;


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.




Top
                 

Warrior
Warrior
Joined: 13 May 2012
Posts: 90
PostPosted: 03-15-2013 06:09 AM           Profile Send private message  E-mail  Edit post Reply with quote


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?




Top
                 

Cool #9
Cool #9
Joined: 01 Dec 2000
Posts: 44138
PostPosted: 03-15-2013 08:54 AM           Profile   Send private message  E-mail  Edit post Reply with quote


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....




Top
                 
Quake3World.com | Forum Index | Programming Discussion


Post new topic Reply to topic


cron
Quake3World.com
© ZeniMax. Zenimax, QUAKE III ARENA, Id Software and associated trademarks are trademarks of the ZeniMax group of companies. All rights reserved.
This is an unofficial fan website without any affiliation with or endorsement by ZeniMax.
All views and opinions expressed are those of the author.