Index: kart_menu.c
===================================================================
--- kart_menu.c	(revision 666)
+++ kart_menu.c	(revision 667)
@@ -0,0 +1,489 @@
+// Kartogony - Menu Items
+
+typedef struct MenuItem
+{
+char state;
+char text[RAYDIUM_MAX_NAME_LEN];
+char texture[RAYDIUM_MAX_NAME_LEN];
+void *OnClick; //event
+int  param;
+float px;
+float py;
+float sizex;
+float sizey;
+float text_size;
+float colors[9]; // 3 each, off, on, current
+} MenuItem;
+
+#define MAX_MENU_ITEMS 20
+MenuItem menus[MAX_MENU_ITEMS];
+char menu;
+char menu_server_ip[RAYDIUM_MAX_NAME_LEN];
+char menu_networked_game;;
+int  menu_team;
+
+void MenuItem_init(MenuItem *e)
+{
+e->state=0;
+e->OnClick=NULL;
+}
+
+void MenuItem_colors(MenuItem *e, float off_r, float off_g, float off_b, float on_r, float on_g, float on_b)
+{
+float f[9];
+f[0]=off_r;
+f[1]=off_g;
+f[2]=off_b;
+f[3]=on_r;
+f[4]=on_g;
+f[5]=on_b;
+// current color
+f[6]=off_r;
+f[7]=off_g;
+f[8]=off_b;
+memcpy(e->colors,f,sizeof(float)*9);
+}
+
+void MenuItem_init_all(void)
+{
+int i;
+for(i=0;i<MAX_MENU_ITEMS;i++)
+    MenuItem_init(&menus[i]);
+}
+
+void MenuItem_draw(void)
+{
+int i;
+void (*f)(int);
+float dec;
+
+float mx;
+float my;
+float inc;
+
+mx=(raydium_mouse_x/(raydium_window_tx+0.1))*100;
+my=100-(raydium_mouse_y/(raydium_window_ty+0.1))*100;
+inc=frame_time*4;
+
+for(i=0;i<MAX_MENU_ITEMS;i++)
+    if(menus[i].state)
+	{
+	f=menus[i].OnClick;
+	
+	if(mx>menus[i].px-(menus[i].sizex/2) && mx<menus[i].px+(menus[i].sizex/2) &&
+	   my>menus[i].py-(menus[i].sizey/2) && my<menus[i].py+(menus[i].sizey/2) )
+	   {
+	   // selected
+	   if(menus[i].colors[3]>menus[i].colors[0] && menus[i].colors[6]<menus[i].colors[3])
+		menus[i].colors[6]+=inc;
+	   if(menus[i].colors[0]>menus[i].colors[3] && menus[i].colors[6]>menus[i].colors[3])
+		menus[i].colors[6]-=inc;
+
+	   if(menus[i].colors[4]>menus[i].colors[1] && menus[i].colors[7]<menus[i].colors[4])
+		menus[i].colors[7]+=inc;
+	   if(menus[i].colors[1]>menus[i].colors[4] && menus[i].colors[7]>menus[i].colors[4])
+		menus[i].colors[7]-=inc;
+
+	   if(menus[i].colors[5]>menus[i].colors[2] && menus[i].colors[8]<menus[i].colors[5])
+		menus[i].colors[8]+=inc;
+	   if(menus[i].colors[2]>menus[i].colors[5] && menus[i].colors[8]>menus[i].colors[5])
+		menus[i].colors[8]-=inc;	   
+	   if(raydium_mouse_click==1 && f) 
+	    { 
+	    f(menus[i].param); 
+	    raydium_mouse_click=0;
+//	    return;
+	    }
+	   }
+	   else
+	   {
+	   // not selected
+	   if(menus[i].colors[3]>menus[i].colors[0] && menus[i].colors[6]>menus[i].colors[0])
+		menus[i].colors[6]-=inc;
+	   if(menus[i].colors[0]>menus[i].colors[3] && menus[i].colors[6]<menus[i].colors[0])
+		menus[i].colors[6]+=inc;
+
+	   if(menus[i].colors[4]>menus[i].colors[1] && menus[i].colors[7]>menus[i].colors[1])
+		menus[i].colors[7]-=inc;
+	   if(menus[i].colors[1]>menus[i].colors[4] && menus[i].colors[7]<menus[i].colors[1])
+		menus[i].colors[7]+=inc;
+
+	   if(menus[i].colors[5]>menus[i].colors[2] && menus[i].colors[8]>menus[i].colors[2])
+		menus[i].colors[8]-=inc;
+	   if(menus[i].colors[2]>menus[i].colors[5] && menus[i].colors[8]<menus[i].colors[2])
+		menus[i].colors[8]+=inc;	   
+
+	   }
+	   
+	raydium_osd_color_rgba(menus[i].colors[6],menus[i].colors[7],menus[i].colors[8],1);
+	raydium_osd_draw_name(menus[i].texture,
+			      menus[i].px-(menus[i].sizex/2),
+			      menus[i].py-(menus[i].sizey/2),
+			      menus[i].px+(menus[i].sizex/2),
+			      menus[i].py+(menus[i].sizey/2));
+	dec=strlen(menus[i].text)-2;
+	dec*=(menus[i].text_size/26);
+	raydium_osd_printf(menus[i].px-dec,menus[i].py,menus[i].text_size,0.5,"font2.tga","%s",menus[i].text);
+	}
+}
+
+
+
+/////////////////
+void menu_color(int);
+void menu_ip(int);
+void menu_main(int);
+void menu_game(int);
+void start_game(void);
+///
+
+void menu_number(int num)
+{
+int i;
+i=strlen(menu_server_ip);
+
+if(num==27)
+    {
+    if(i==0) return;
+    menu_server_ip[i-1]=0;
+    }
+else
+    if(i<15)
+    {
+    menu_server_ip[i]=num;
+    menu_server_ip[i+1]=0;
+    }
+sprintf(menus[13].text,"^f%s",menu_server_ip);
+}
+
+void menu_main(int dummy)
+{
+menu_networked_game=0;
+menu=1;
+
+MenuItem_init_all();
+
+// Training
+menus[0].state=1;
+strcpy(menus[0].text,"^fTraining");
+strcpy(menus[0].texture,"aqua.tga");
+menus[0].OnClick=menu_color;
+menus[0].px=50;
+menus[0].py=80;
+menus[0].sizex=30;
+menus[0].sizey=10;
+menus[0].text_size=20;
+MenuItem_colors(&menus[0],0.9,0.2,0.2, 0.2,0.2,0.9);
+
+// Play
+menus[1].state=1;
+strcpy(menus[1].text,"^fNetwork Play");
+strcpy(menus[1].texture,"aqua.tga");
+menus[1].OnClick=menu_ip;
+menus[1].px=50;
+menus[1].py=60;
+menus[1].sizex=30;
+menus[1].sizey=10;
+menus[1].text_size=20;
+MenuItem_colors(&menus[1],0.9,0.2,0.2,0.2,0.2,0.9);
+
+// Quit
+menus[2].state=1;
+strcpy(menus[2].text,"^fQuit");
+strcpy(menus[2].texture,"aqua.tga");
+menus[2].OnClick=exit;
+menus[2].param=0;
+menus[2].px=50;
+menus[2].py=20;
+menus[2].sizex=30;
+menus[2].sizey=10;
+menus[2].text_size=20;
+MenuItem_colors(&menus[2],0.9,0.9,0.9,0.1,0.1,0.1);
+
+}
+
+
+void menu_color(int dummy)
+{
+menu=1;
+
+MenuItem_init_all();
+
+menus[0].state=1;
+strcpy(menus[0].text,"^fRed Team");
+strcpy(menus[0].texture,"aqua.tga");
+menus[0].OnClick=menu_game;
+menus[0].param=0;
+menus[0].px=50;
+menus[0].py=90;
+menus[0].sizex=30;
+menus[0].sizey=10;
+menus[0].text_size=20;
+MenuItem_colors(&menus[0], TEAM_COL2(0), TEAM_COL(0));
+
+menus[1].state=1;
+strcpy(menus[1].text,"^fGreen Team");
+strcpy(menus[1].texture,"aqua.tga");
+menus[1].OnClick=menu_game;
+menus[1].param=1;
+menus[1].px=50;
+menus[1].py=70;
+menus[1].sizex=30;
+menus[1].sizey=10;
+menus[1].text_size=20;
+MenuItem_colors(&menus[1], TEAM_COL2(1), TEAM_COL(1));
+
+menus[2].state=1;
+strcpy(menus[2].text,"^fBlue Team");
+strcpy(menus[2].texture,"aqua.tga");
+menus[2].OnClick=menu_game;
+menus[2].param=2;
+menus[2].px=50;
+menus[2].py=50;
+menus[2].sizex=30;
+menus[2].sizey=10;
+menus[2].text_size=20;
+MenuItem_colors(&menus[2], TEAM_COL2(2), TEAM_COL(2));
+
+menus[3].state=1;
+strcpy(menus[3].text,"^fYellow Team");
+strcpy(menus[3].texture,"aqua.tga");
+menus[3].OnClick=menu_game;
+menus[3].param=3;
+menus[3].px=50;
+menus[3].py=30;
+menus[3].sizex=30;
+menus[3].sizey=10;
+menus[3].text_size=20;
+MenuItem_colors(&menus[3], TEAM_COL2(3), TEAM_COL(3));
+
+menus[4].state=1;
+strcpy(menus[4].text,"^fBACK");
+strcpy(menus[4].texture,"aqua.tga");
+menus[4].OnClick=menu_main;
+menus[4].px=50;
+menus[4].py=10;
+menus[4].sizex=30;
+menus[4].sizey=10;
+menus[4].text_size=25;
+MenuItem_colors(&menus[4],0.1,0.1,0.1, 0.9,0.9,0.9);
+}
+
+void menu_ip(int dummy)
+{
+FILE *fp;
+menu_networked_game=1;
+menu=1;
+
+
+menu_server_ip[0]=0;
+fp=fopen("server.last","rt");
+if(fp)
+    {
+    fgets(menu_server_ip,128,fp);
+    if(strlen(menu_server_ip) && menu_server_ip[strlen(menu_server_ip)-1]=='\n')
+	menu_server_ip[strlen(menu_server_ip)-1]=0;
+    fclose(fp);
+    }
+
+menu_team=dummy;
+
+MenuItem_init_all();
+
+menus[0].state=1;
+strcpy(menus[0].text,"^fServer IP");
+strcpy(menus[0].texture,"aqua.tga");
+menus[0].px=50;
+menus[0].py=90;
+menus[0].sizex=30;
+menus[0].sizey=10;
+menus[0].text_size=20;
+MenuItem_colors(&menus[0],0.6,0.2,0.2, 0.9,0.2,0.2);
+
+menus[1].state=1;
+strcpy(menus[1].text,"^fBACK");
+strcpy(menus[1].texture,"aqua.tga");
+menus[1].OnClick=menu_main;
+menus[1].px=50;
+menus[1].py=10;
+menus[1].sizex=30;
+menus[1].sizey=10;
+menus[1].text_size=25;
+MenuItem_colors(&menus[1],0.1,0.1,0.1, 0.2,0.9,0.2);
+
+menus[2].state=1;
+strcpy(menus[2].text,"^f7");
+strcpy(menus[2].texture,"aquab.tga");
+menus[2].OnClick=menu_number;
+menus[2].param='7';
+menus[2].px=40;
+menus[2].py=75;
+menus[2].sizex=10;
+menus[2].sizey=10;
+menus[2].text_size=20;
+MenuItem_colors(&menus[2],0.9,0.2,0.2, 0.2,0.9,0.2);
+
+menus[3].state=1;
+strcpy(menus[3].text,"^f8");
+strcpy(menus[3].texture,"aquab.tga");
+menus[3].OnClick=menu_number;
+menus[3].param='8';
+menus[3].px=50;
+menus[3].py=75;
+menus[3].sizex=10;
+menus[3].sizey=10;
+menus[3].text_size=20;
+MenuItem_colors(&menus[3],0.9,0.2,0.2, 0.2,0.9,0.2);
+
+menus[4].state=1;
+strcpy(menus[4].text,"^f9");
+strcpy(menus[4].texture,"aquab.tga");
+menus[4].OnClick=menu_number;
+menus[4].param='9';
+menus[4].px=60;
+menus[4].py=75;
+menus[4].sizex=10;
+menus[4].sizey=10;
+menus[4].text_size=20;
+MenuItem_colors(&menus[4],0.9,0.2,0.2, 0.2,0.9,0.2);
+
+menus[5].state=1;
+strcpy(menus[5].text,"^f4");
+strcpy(menus[5].texture,"aquab.tga");
+menus[5].OnClick=menu_number;
+menus[5].param='4';
+menus[5].px=40;
+menus[5].py=65;
+menus[5].sizex=10;
+menus[5].sizey=10;
+menus[5].text_size=20;
+MenuItem_colors(&menus[5],0.9,0.2,0.2, 0.2,0.9,0.2);
+
+menus[6].state=1;
+strcpy(menus[6].text,"^f5");
+strcpy(menus[6].texture,"aquab.tga");
+menus[6].OnClick=menu_number;
+menus[6].param='5';
+menus[6].px=50;
+menus[6].py=65;
+menus[6].sizex=10;
+menus[6].sizey=10;
+menus[6].text_size=20;
+MenuItem_colors(&menus[6],0.9,0.2,0.2, 0.2,0.9,0.2);
+
+menus[7].state=1;
+strcpy(menus[7].text,"^f6");
+strcpy(menus[7].texture,"aquab.tga");
+menus[7].OnClick=menu_number;
+menus[7].param='6';
+menus[7].px=60;
+menus[7].py=65;
+menus[7].sizex=10;
+menus[7].sizey=10;
+menus[7].text_size=20;
+MenuItem_colors(&menus[7],0.9,0.2,0.2, 0.2,0.9,0.2);
+
+menus[8].state=1;
+strcpy(menus[8].text,"^f1");
+strcpy(menus[8].texture,"aquab.tga");
+menus[8].OnClick=menu_number;
+menus[8].param='1';
+menus[8].px=40;
+menus[8].py=55;
+menus[8].sizex=10;
+menus[8].sizey=10;
+menus[8].text_size=20;
+MenuItem_colors(&menus[8],0.9,0.2,0.2, 0.2,0.9,0.2);
+
+menus[9].state=1;
+strcpy(menus[9].text,"^f2");
+strcpy(menus[9].texture,"aquab.tga");
+menus[9].OnClick=menu_number;
+menus[9].param='2';
+menus[9].px=50;
+menus[9].py=55;
+menus[9].sizex=10;
+menus[9].sizey=10;
+menus[9].text_size=20;
+MenuItem_colors(&menus[9],0.9,0.2,0.2, 0.2,0.9,0.2);
+
+menus[10].state=1;
+strcpy(menus[10].text,"^f3");
+strcpy(menus[10].texture,"aquab.tga");
+menus[10].OnClick=menu_number;
+menus[10].param='3';
+menus[10].px=60;
+menus[10].py=55;
+menus[10].sizex=10;
+menus[10].sizey=10;
+menus[10].text_size=20;
+MenuItem_colors(&menus[10],0.9,0.2,0.2, 0.2,0.9,0.2);
+
+menus[11].state=1;
+strcpy(menus[11].text,"^f0");
+strcpy(menus[11].texture,"aquab.tga");
+menus[11].OnClick=menu_number;
+menus[11].param='0';
+menus[11].px=40;
+menus[11].py=45;
+menus[11].sizex=10;
+menus[11].sizey=10;
+menus[11].text_size=20;
+MenuItem_colors(&menus[11],0.9,0.2,0.2, 0.2,0.9,0.2);
+
+
+menus[12].state=1;
+strcpy(menus[12].text,"^f.");
+strcpy(menus[12].texture,"aquab.tga");
+menus[12].OnClick=menu_number;
+menus[12].param='.';
+menus[12].px=60;
+menus[12].py=45;
+menus[12].sizex=10;
+menus[12].sizey=10;
+menus[12].text_size=20;
+MenuItem_colors(&menus[12],0.9,0.2,0.2, 0.2,0.9,0.2);
+
+// Displays IP address
+menus[13].state=1;
+sprintf(menus[13].text,"^f%s",menu_server_ip);
+strcpy(menus[13].texture,"aqua.tga");
+menus[13].px=30;
+menus[13].py=30;
+menus[13].sizex=40;
+menus[13].sizey=10;
+menus[13].text_size=20;
+MenuItem_colors(&menus[13],0.9,0.2,0.2, 0.9,0.2,0.2);
+
+menus[14].state=1;
+strcpy(menus[14].text,"^fdel");
+strcpy(menus[14].texture,"aquab.tga");
+menus[14].OnClick=menu_number;
+menus[14].param=27;
+menus[14].px=50;
+menus[14].py=45;
+menus[14].sizex=10;
+menus[14].sizey=10;
+menus[14].text_size=20;
+MenuItem_colors(&menus[14],0.9,0.2,0.2, 0.2,0.9,0.2);
+
+menus[15].state=1;
+strcpy(menus[15].text,"^fConnect");
+strcpy(menus[15].texture,"aqua.tga");
+menus[15].OnClick=menu_color;
+menus[15].param=dummy;
+menus[15].px=70;
+menus[15].py=30;
+menus[15].sizex=30;
+menus[15].sizey=10;
+menus[15].text_size=20;
+MenuItem_colors(&menus[15],0.9,0.2,0.2, 0.2,0.2,0.9);
+
+}
+
+void menu_game(int team)
+{
+menu_team=team;
+menu=0;
+start_game();
+}

Property changes on: kart_menu.c
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Index: kart_conf.c
===================================================================
--- kart_conf.c	(revision 666)
+++ kart_conf.c	(revision 667)
@@ -0,0 +1,55 @@
+// Kartagony - configuration defines
+
+#define DEFAULT_SCORE 		3
+#define BONUSBLINK_FACT		5
+#define JUMP_FORCE		700
+#define ROCKET_SPEED		70
+#define WHEELS_BREAK		0
+
+// all following vars defined in seconds :
+#define INVINCIBLE_TIME		3
+#define BOOST_TIME		5
+#define WEIGHT_TIME		5
+#define OIL_TIME		5
+#define SMOKE_TIME		5
+#define BONUS_TTL		20
+#define BONUSROLL_TIME		4
+#define BONUSBLINK_TIME		2
+#define REPLACE_TIME		3
+
+typedef struct Team
+{
+GLfloat color[3];
+char name[16];
+} Team;
+
+Team teams[4];
+
+#define TEAM_COL(n)  teams[n].color[0],teams[n].color[1],teams[n].color[2]
+#define TEAM_COL2(n) teams[n].color[0]-0.2,teams[n].color[1]-0.2,teams[n].color[2]-0.2
+
+void conf_init(void)
+{
+strcpy(teams[0].name,"Red Team");
+strcpy(teams[1].name,"Green Team");
+strcpy(teams[2].name,"Blue Team");
+strcpy(teams[3].name,"Yellow Team");
+
+teams[0].color[0]=0.9;
+teams[0].color[1]=0.2;
+teams[0].color[2]=0.2;
+
+teams[1].color[0]=0.2;
+teams[1].color[1]=0.9;
+teams[1].color[2]=0.2;
+
+teams[2].color[0]=0.2;
+teams[2].color[1]=0.2;
+teams[2].color[2]=0.9;
+
+teams[3].color[0]=0.9;
+teams[3].color[1]=0.9;
+teams[3].color[2]=0.2;
+
+in_game=0;
+}

Property changes on: kart_conf.c
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Index: kart_net.c
===================================================================
--- kart_net.c	(revision 666)
+++ kart_net.c	(revision 667)
@@ -0,0 +1,54 @@
+// Kartagony - network things :)
+
+#define NET_GAME_STATE_T1		(RAYDIUM_NETWORK_PACKET_BASE+1)
+#define NET_GAME_STATE_T2		(RAYDIUM_NETWORK_PACKET_BASE+2)
+#define NET_GAME_STATE_T3		(RAYDIUM_NETWORK_PACKET_BASE+3)
+#define NET_GAME_STATE_T4		(RAYDIUM_NETWORK_PACKET_BASE+4)
+#define NET_GAME_STATE_BASE		NET_GAME_STATE_T1
+
+#define NET_DEL_REQ			(RAYDIUM_NETWORK_PACKET_BASE+5)
+
+
+
+typedef struct GameState
+    {
+    short scores[4];
+    } GameState;
+    
+GameState game_state;
+
+
+void delete_request(int elem)
+{
+char buff[RAYDIUM_NETWORK_PACKET_SIZE];
+int nid;
+
+nid=raydium_ode_element[elem].nid;
+
+memcpy(buff+RAYDIUM_NETWORK_PACKET_OFFSET,&nid,sizeof(int));
+raydium_network_write(NULL,raydium_network_uid,NET_DEL_REQ,buff);
+}
+
+void delete_request_callback(int type, char *buff)
+{
+int nid;
+int elem;
+
+memcpy(&nid,buff+RAYDIUM_NETWORK_PACKET_OFFSET,sizeof(int));
+
+// let's look if this element is one of ours
+elem=raydium_network_nid_element_find(nid);
+
+if(elem>=0 && !raydium_ode_element[elem].distant)
+    raydium_ode_element_delete(elem,1);
+}
+
+void net_init(void)
+{
+raydium_network_propag_add(NET_GAME_STATE_T1,&game_state.scores[0],sizeof(short));
+raydium_network_propag_add(NET_GAME_STATE_T2,&game_state.scores[1],sizeof(short));
+raydium_network_propag_add(NET_GAME_STATE_T3,&game_state.scores[2],sizeof(short));
+raydium_network_propag_add(NET_GAME_STATE_T4,&game_state.scores[3],sizeof(short));
+
+raydium_network_netcall_add(delete_request_callback,NET_DEL_REQ,1);
+}

Property changes on: kart_net.c
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Index: kart_bonus.c
===================================================================
--- kart_bonus.c	(revision 666)
+++ kart_bonus.c	(revision 667)
@@ -0,0 +1,273 @@
+// Kartagony - Bonus management
+
+#define MAX_BONUS	7
+
+typedef struct Bonus
+{
+    int  id;
+    char icon[RAYDIUM_MAX_NAME_LEN];
+    char auto_fire;
+    int  priority;
+} Bonus;
+
+Bonus bonus[MAX_BONUS];
+
+
+void bonus_init(void)
+{
+int i;
+
+bonus_to_delete=-1;
+
+strcpy(bonus[0].icon,"BOXhud_boost.tga");
+bonus[0].auto_fire=0;
+bonus[0].priority=6;
+
+strcpy(bonus[1].icon,"BOXhud_oil.tga");
+bonus[1].auto_fire=0;
+bonus[1].priority=6;
+
+strcpy(bonus[2].icon,"BOXhud_jump.tga");
+bonus[2].auto_fire=0;
+bonus[2].priority=6;
+
+strcpy(bonus[3].icon,"BOXhud_life.tga");
+bonus[3].auto_fire=1;
+bonus[3].priority=1;
+
+strcpy(bonus[4].icon,"BOXhud_rocket.tga");
+bonus[4].auto_fire=0;
+bonus[4].priority=4;
+
+strcpy(bonus[5].icon,"BOXhud_weight.tga");
+bonus[5].auto_fire=1;
+bonus[5].priority=4;
+
+strcpy(bonus[6].icon,"BOXhud_mine.tga");
+bonus[6].auto_fire=0;
+bonus[6].priority=6;
+
+/*
+strcpy(bonus[7].icon,"BOXhud_smoke.tga");
+bonus[7].auto_fire=1;
+bonus[7].priority=4;
+*/
+
+for(i=0;i<MAX_BONUS;i++)
+    {
+    bonus[i].id=i;
+    raydium_texture_find_by_name(bonus[i].icon); // force loading
+    }
+}
+
+int explo_OnDelete(int explo)
+{
+dReal *pos;
+pos=raydium_ode_element_pos_get(explo);
+raydium_ode_explosion_blow(1,80,pos);
+return 1;
+}
+
+
+void drop_mine(void)
+{
+char name[RAYDIUM_MAX_NAME_LEN];
+int from;
+dReal *pos;
+
+raydium_ode_name_auto("mine",name);
+from=raydium_ode_object_find("KART");
+raydium_ode_object_box_add(name,from,0.05,RAYDIUM_ODE_AUTODETECT,0,0,RAYDIUM_ODE_STANDARD,TAG_MINE,"mine.tri");
+raydium_ode_element_moveto_name(name,"GLOBAL",1);
+pos=raydium_ode_element_pos_get_name("kart_corps");
+raydium_ode_element_move_name(name,pos);
+raydium_ode_element_OnDelete_name(name,explo_OnDelete);
+}
+
+void drop_oil(void)
+{
+char name[RAYDIUM_MAX_NAME_LEN];
+int from;
+dReal *pos;
+
+raydium_ode_name_auto("oil",name);
+from=raydium_ode_object_find("KART");
+raydium_ode_object_box_add(name,from,1,RAYDIUM_ODE_AUTODETECT,0,0,RAYDIUM_ODE_STANDARD,TAG_OIL,"oil.tri");
+raydium_ode_element_moveto_name(name,"GLOBAL",1);
+pos=raydium_ode_element_pos_get_name("kart_corps");
+raydium_ode_element_move_name(name,pos);
+}
+
+
+int drop_bonus(int dummy)
+{
+// get AABB from ground
+dReal aabb[6];
+dReal pos[3];
+dReal *get;
+char name[64];
+int a,i,tag;
+
+printf("****************\n");
+
+if(!in_game) return 1;
+
+// get "world" (all karts) AABB
+memset(aabb,0,sizeof(dReal)*6);
+for(i=0;i<RAYDIUM_ODE_MAX_ELEMENTS;i++)
+    if(raydium_ode_element_isvalid(i))
+	{	
+	tag=raydium_ode_element_tag_get(i);
+	if(!(tag>=TAG_KART && tag<TAG_KART_END))
+	    continue;
+	
+	get=raydium_ode_element_pos_get(i);
+//	raydium_log("%s: %f %f %f",raydium_ode_element[i].name,get[0],get[1],get[2]);
+	if(get[0]<aabb[0]) aabb[0]=get[0];
+	if(get[0]>aabb[1]) aabb[1]=get[0];
+
+	if(get[1]<aabb[2]) aabb[2]=get[1];
+	if(get[1]>aabb[3]) aabb[3]=get[1];
+
+	if(get[2]<aabb[4]) aabb[4]=get[2];
+	if(get[2]>aabb[5]) aabb[5]=get[2];
+	}
+
+//raydium_log("%f %f | %f %f | %f %f",aabb[0],aabb[1],aabb[2],aabb[3],aabb[4],aabb[5]);
+pos[0]=raydium_random_f(aabb[0],aabb[1]);
+pos[1]=raydium_random_f(aabb[2],aabb[3]);
+pos[2]=aabb[5]+5;
+//raydium_log("%f %f %f",pos[0],pos[1],pos[2]);
+//raydium_log("---");
+
+a=raydium_ode_object_find("GLOBAL");
+raydium_ode_name_auto("bonus",name);
+raydium_ode_object_sphere_add(name,a,0.1,RAYDIUM_ODE_AUTODETECT,RAYDIUM_ODE_STANDARD,TAG_BONUS,"bonus.tri");
+raydium_ode_element_ttl_set_name(name,raydium_ode_get_physics_freq()*BONUS_TTL);
+raydium_ode_element_OnDelete_name(name,drop_bonus);
+raydium_ode_element_move_name(name,pos);
+//printf("Bonus at: %f %f %f\n",pos[0],pos[1],pos[2]);
+return 1; // confirm delete
+}
+
+void get_bonus(void)
+{
+have_bonus=-1;
+bonusroll_time=BONUSROLL_TIME;
+}
+
+
+void bonus_fire(void)
+{
+
+if(have_bonus<=0) return;
+
+if(have_bonus==1) // boost
+    boost_time=BOOST_TIME;    
+
+if(have_bonus==2) // oil
+    drop_oil();
+
+if(have_bonus==3) // jump
+    raydium_ode_launcher_name_3f("kart_corps","kart_corps",0,0,0,JUMP_FORCE);    
+
+if(have_bonus==4) // life
+    {
+    game_state.scores[menu_team]++;
+    raydium_network_propag_refresh(NET_GAME_STATE_BASE+menu_team);
+    }
+
+if(have_bonus==5) // rocket
+    {
+    // launch projectile
+    int a;
+    char name[255];
+    a=raydium_ode_object_find("KART");
+    raydium_ode_name_auto("rocket",name);
+    raydium_ode_object_box_add(name,a,0.1,RAYDIUM_ODE_AUTODETECT,0,0,RAYDIUM_ODE_STANDARD,TAG_ROCKET,"rocket.tri");
+    if(raydium_key[GLUT_KEY_END])
+	raydium_ode_launcher_simple_name_3f(name,"kart_corps",0,-90,0,ROCKET_SPEED);
+    else
+	raydium_ode_launcher_simple_name_3f(name,"kart_corps",0,90,0,ROCKET_SPEED);
+    //raydium_ode_element_rotate_direction_name(name,0);
+    raydium_ode_element_gravity_name(name,0);
+    raydium_ode_element_OnDelete_name(name,explo_OnDelete);
+    raydium_ode_element_ttl_set_name(name,raydium_ode_get_physics_freq()*10); // 10 seconds
+//    raydium_sound_SourcePlay(son_rl);
+//    raydium_ode_element_sound_update_name("tank_tour",son_rl);
+    }
+
+if(have_bonus==6) // weight
+    weight_time=WEIGHT_TIME;    
+
+if(have_bonus==7) // mine
+    drop_mine();    
+
+have_bonus=0;
+}
+
+
+void draw_bonus(int n,float fact)
+{
+    raydium_osd_color_ega('f');
+    raydium_osd_draw_name(bonus[n].icon,50-(5*fact),90-(5*fact),50+(5*fact),90+(5*fact));
+}
+
+void manage_bonus(void)
+{
+
+// quiet a hack, I admit :)
+if(bonus_to_delete!=-1)
+    {
+    raydium_ode_element_delete(bonus_to_delete,1);
+    bonus_to_delete=-1;
+    }
+
+// we must "take" a bonus ?
+if(have_bonus==-1 && bonusroll_time<=0)
+    {
+    int *tableau;
+    int total=0;
+    int i,j,k;
+
+    for(i=0;i<MAX_BONUS;i++)
+	total+=bonus[i].priority;
+    
+    tableau=malloc(total*sizeof(int));
+
+    for(i=0,k=0;i<MAX_BONUS;i++)
+	for(j=0;j<bonus[i].priority;j++,k++)
+	    tableau[k]=i;
+    
+    // must moderate random
+    have_bonus=raydium_random_0_x(total);
+    have_bonus=tableau[have_bonus]+1;
+//    have_bonus=5;
+    free(tableau);
+    }
+
+if(have_bonus==-1)
+    draw_bonus( ((int)(bonusroll_time*10)) % MAX_BONUS ,1);
+
+if(have_bonus>0) 
+    {
+    static float s=1;
+    static char fact=BONUSBLINK_FACT;
+
+    s+=frame_time*fact;
+    if(s>2) fact=-BONUSBLINK_FACT;
+    if(s<1) fact= BONUSBLINK_FACT;
+
+    if(bonusroll_time<-BONUSBLINK_TIME) 
+	{
+	s=1;
+	if(bonus[have_bonus-1].auto_fire)
+	    {
+	    bonus_fire();
+	    return;
+	    }
+	}
+    
+    draw_bonus(have_bonus-1,s);
+    }
+}

Property changes on: kart_bonus.c
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Index: kart_ode.c
===================================================================
--- kart_ode.c	(revision 666)
+++ kart_ode.c	(revision 667)
@@ -0,0 +1,78 @@
+// Kartagony - ODE kart creation code
+
+void create_kart(void)
+{
+int a;
+
+#define BREAK_FORCE	150
+#define ROTFRICTION	0.0005
+#define SUSP		0.9,0.1
+
+#define WHEEL_H		-0.05
+#define WHEEL_FX	0.20
+#define WHEEL_FY	0.12
+
+a=raydium_ode_object_delete_name("KART");
+    
+  a=raydium_ode_object_create("KART");
+    raydium_ode_object_box_add("kart_corps",a,1,RAYDIUM_ODE_AUTODETECT,0,0,RAYDIUM_ODE_STANDARD,TAG_KART+menu_team,"kart_batcox.tri");
+    raydium_ode_element_slip_name("kart_corps",RAYDIUM_ODE_SLIP_ICE);
+
+    raydium_ode_element_OnBlow_name("kart_corps",blow_touched);
+
+    raydium_ode_object_sphere_add("kart_pneu_ag",a,0.5,RAYDIUM_ODE_AUTODETECT,RAYDIUM_ODE_STANDARD,TAG_KART+menu_team,"kart_batcox_wheel.tri");
+    raydium_ode_element_rotfriction_name("kart_pneu_ag",ROTFRICTION);
+    raydium_ode_element_move_name_3f("kart_pneu_ag",WHEEL_FX,WHEEL_FY,WHEEL_H);
+    raydium_ode_joint_attach_hinge2_name("kart_suspet_ag","kart_corps","kart_pneu_ag",RAYDIUM_ODE_JOINT_SUSP_DEFAULT_AXES);
+    if(WHEELS_BREAK)
+	raydium_ode_joint_break_force_name("kart_suspet_ag",BREAK_FORCE);
+    raydium_ode_joint_suspension_name("kart_suspet_ag",SUSP);
+
+    raydium_ode_object_sphere_add("kart_pneu_ad",a,0.5,RAYDIUM_ODE_AUTODETECT,RAYDIUM_ODE_STANDARD,TAG_KART+menu_team,"kart_batcox_wheel.tri");
+    raydium_ode_element_rotfriction_name("kart_pneu_ad",ROTFRICTION);
+    raydium_ode_element_move_name_3f("kart_pneu_ad",WHEEL_FX,-WHEEL_FY,WHEEL_H);
+    raydium_ode_joint_attach_hinge2_name("kart_suspet_ad","kart_corps","kart_pneu_ad",RAYDIUM_ODE_JOINT_SUSP_DEFAULT_AXES);
+    if(WHEELS_BREAK)
+	raydium_ode_joint_break_force_name("kart_suspet_ad",BREAK_FORCE);
+    raydium_ode_joint_suspension_name("kart_suspet_ad",SUSP);
+
+    raydium_ode_object_sphere_add("kart_pneu_rg",a,0.5,RAYDIUM_ODE_AUTODETECT,RAYDIUM_ODE_STANDARD,TAG_KART+menu_team,"kart_batcox_wheel.tri");
+    raydium_ode_element_rotfriction_name("kart_pneu_rg",ROTFRICTION);
+    raydium_ode_element_move_name_3f("kart_pneu_rg",-WHEEL_FX,WHEEL_FY,WHEEL_H);
+    raydium_ode_joint_attach_hinge2_name("kart_suspet_rg","kart_corps","kart_pneu_rg",RAYDIUM_ODE_JOINT_SUSP_DEFAULT_AXES);
+    raydium_ode_joint_hinge2_block_name("kart_suspet_rg",1);
+    if(WHEELS_BREAK)
+	raydium_ode_joint_break_force_name("kart_suspet_rg",BREAK_FORCE);
+    raydium_ode_joint_suspension_name("kart_suspet_rg",SUSP);
+
+    raydium_ode_object_sphere_add("kart_pneu_rd",a,0.5,RAYDIUM_ODE_AUTODETECT,RAYDIUM_ODE_STANDARD,TAG_KART+menu_team,"kart_batcox_wheel.tri");
+    raydium_ode_element_rotfriction_name("kart_pneu_rd",ROTFRICTION);
+    raydium_ode_element_move_name_3f("kart_pneu_rd",-WHEEL_FX,-WHEEL_FY,WHEEL_H);
+    raydium_ode_joint_attach_hinge2_name("kart_suspet_rd","kart_corps","kart_pneu_rd",RAYDIUM_ODE_JOINT_SUSP_DEFAULT_AXES);
+    raydium_ode_joint_hinge2_block_name("kart_suspet_rd",1);
+    if(WHEELS_BREAK)
+	raydium_ode_joint_break_force_name("kart_suspet_rd",BREAK_FORCE);
+    raydium_ode_joint_suspension_name("kart_suspet_rd",SUSP);
+    
+    raydium_ode_motor_create("kart_moteur",a,RAYDIUM_ODE_MOTOR_ENGINE);
+    raydium_ode_motor_attach_name("kart_moteur","kart_suspet_rg",1);
+    raydium_ode_motor_attach_name("kart_moteur","kart_suspet_rd",1);
+//    raydium_ode_motor_power_max_name("kart_moteur",0.03);
+//    raydium_ode_motor_gears_set_name("kart_moteur",gears,6);
+//    raydium_ode_motor_gear_change_name("kart_moteur",gear);
+
+    raydium_ode_motor_create("kart_frein",a,RAYDIUM_ODE_MOTOR_ENGINE);
+    raydium_ode_motor_attach_name("kart_frein","kart_suspet_ag",1);
+    raydium_ode_motor_attach_name("kart_frein","kart_suspet_ad",1);
+    
+    raydium_ode_motor_create("kart_direction",a,RAYDIUM_ODE_MOTOR_ANGULAR);
+    raydium_ode_motor_attach_name("kart_direction","kart_suspet_ag",0);
+    raydium_ode_motor_attach_name("kart_direction","kart_suspet_ad",0);
+    raydium_ode_motor_power_max_name("kart_direction",0.2);
+    
+    dReal pos[3]={0,0,1};
+    raydium_ode_object_move(a,pos);
+    
+    raydium_sound_SourcePlay(sounds[SOUND_ENGINE]);
+}
+

Property changes on: kart_ode.c
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Index: kart_sound.c
===================================================================
--- kart_sound.c	(revision 666)
+++ kart_sound.c	(revision 667)
@@ -0,0 +1,17 @@
+// Kartagony - sound management
+
+#define SOUND_MAX  1
+
+#define SOUND_ENGINE 0
+
+int sounds[SOUND_MAX];
+
+void sound_init(void)
+{
+raydium_sound_DefaultReferenceDistance=4.f;
+
+//sounds[SOUND_ENGINE]=raydium_sound_LoadWav("scooter2.wav");
+sounds[SOUND_ENGINE]=raydium_sound_LoadWav("scooter2.wav");
+//sounds[SOUND_ENGINE]=raydium_sound_LoadWav("murcielago2.wav");
+raydium_sound_SetSourcePitch(sounds[SOUND_ENGINE],0);
+}

Property changes on: kart_sound.c
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Index: README.txt
===================================================================
--- README.txt	(revision 666)
+++ README.txt	(revision 667)
@@ -0,0 +1,9 @@
+Kartagony is a small unreleased, unfinished, multiplayer game, where players 
+drivers small karts and use bonus to kill each others (Team Deathmatch).
+
+The "main" file is kartagony.c (and will include all others).
+
+The game *should* (not tested since a long time) work with the regular
+generic Raydium server (tests.c).
+
+All data *should* be available on official repository, too.

Property changes on: README.txt
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Index: kart_obj.c
===================================================================
--- kart_obj.c	(revision 666)
+++ kart_obj.c	(revision 667)
@@ -0,0 +1,11 @@
+// Kartagony - Element tags
+
+#define TAG_KART	1
+//			2
+//			3
+//			4
+#define TAG_KART_END	5
+#define TAG_MINE	20
+#define TAG_OIL		30
+#define TAG_ROCKET	40
+#define TAG_BONUS	50

Property changes on: kart_obj.c
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Index: kartagony.jpg
===================================================================
Cannot display: file marked as a binary type.
svn:mime-type = image/jpeg
Index: kartagony.jpg
===================================================================
--- kartagony.jpg	(revision 666)
+++ kartagony.jpg	(revision 667)

Property changes on: kartagony.jpg
___________________________________________________________________
Added: svn:mime-type
## -0,0 +1 ##
+image/jpeg
\ No newline at end of property
Index: kart_player.c
===================================================================
--- kart_player.c	(revision 666)
+++ kart_player.c	(revision 667)
@@ -0,0 +1,14 @@
+// Kartagony - Player structures
+
+#define MAX_PLAYERS	32
+
+
+typedef struct Player
+{
+int uid;
+int team;
+    
+} Player;
+
+
+#error NOT USED !
\ No newline at end of file

Property changes on: kart_player.c
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Index: kartagony.c
===================================================================
--- kartagony.c	(revision 666)
+++ kartagony.c	(revision 667)
@@ -0,0 +1,427 @@
+// Kartagony - CQFD Corp.
+// Initial release: 2004/Apr/17
+// License: GPL - GNU General Public License, see "raydium/gpl.txt" file.
+
+char *version="version 0.2";
+
+#include "raydium/index.c"
+
+GLfloat sun[]={1.0,0.9,0.5,1.0};
+GLfloat amb[]={1.0,0.0,0.0,1.0};
+
+GLfloat frame_time;
+GLfloat invin_time;
+GLfloat bonusroll_time;
+GLfloat boost_time;
+GLfloat weight_time;
+GLfloat oil_time;
+GLfloat replace_time;
+GLfloat smoke_time;
+int bonus_to_delete;
+int have_bonus;
+char in_game;
+char game_over;
+
+void blow_touched(int elem, dReal force, dReal max_force);
+void rocket_del(int rocket);
+
+#include "kart_conf.c"
+#include "kart_obj.c"
+#include "kart_menu.c"
+#include "kart_sound.c"
+#include "kart_ode.c"
+#include "kart_net.c"
+#include "kart_bonus.c"
+
+void blow_touched(int elem, dReal force, dReal max_force)
+{
+if(invin_time>0) return;
+game_state.scores[menu_team]--;
+raydium_network_propag_refresh(NET_GAME_STATE_BASE+menu_team);
+invin_time=INVINCIBLE_TIME;
+}
+
+
+void explo(char type, dReal radius, dReal force_or_propag, dReal *pos)
+{
+int g1,g2;
+//int i;
+//i=raydium_random_i(0,SOUND_MAX_EXPLOS-1);
+
+// raydium_explosion_add(pos[0],pos[1],pos[2],0,0,0,0.6,3,6,0.1);
+g1=raydium_particle_generator_load("explosion.prt","explo");
+g2=raydium_particle_generator_load("explosmoke.prt","explo_smoke");
+
+raydium_particle_generator_move(g1,pos);
+raydium_particle_generator_move(g2,pos);
+
+//raydium_sound_SourcePlay(son_boom[i]);
+//raydium_sound_SetSourcePos(son_boom[i],pos);
+}
+
+void touch_mine(int mine, int kart)
+{
+dReal *pos;
+
+pos=raydium_ode_element_pos_get(mine);
+
+if(raydium_ode_network_element_isdistant(mine))
+	delete_request(mine);
+    else
+	raydium_ode_element_delete(mine,1);
+}
+
+
+void touch_oil(int oil, int kart)
+{
+oil_time=OIL_TIME;
+
+if(raydium_ode_network_element_isdistant(oil))
+	delete_request(oil);
+    else
+	raydium_ode_element_delete(oil,1);
+}
+
+
+void touch_bonus(int bonus, int kart)
+{
+get_bonus();
+
+if(raydium_ode_network_element_isdistant(bonus))
+	delete_request(bonus);
+    else
+//	raydium_ode_element_delete(bonus,1);
+	bonus_to_delete=bonus;
+}
+
+void rocket_del(int rocket)
+{
+if(raydium_ode_network_element_isdistant(rocket))
+	delete_request(rocket);
+    else
+	raydium_ode_element_delete(rocket,1);
+}
+
+char is_kart(int elem)
+{
+int tag;
+
+tag=raydium_ode_element_tag_get(elem);
+if(tag>=TAG_KART && tag<TAG_KART_END)
+    return 1;
+return 0;
+}
+
+char collide(int e1, int e2, dContact *c)
+{
+
+if( raydium_ode_element_tag_get(e1)==TAG_ROCKET &&
+    !raydium_ode_network_element_isdistant(e1) )
+	rocket_del(e1);
+if( raydium_ode_element_tag_get(e2)==TAG_ROCKET &&
+    !raydium_ode_network_element_isdistant(e2) )
+	rocket_del(e2);
+
+if( raydium_ode_element_tag_get(e1)==TAG_MINE &&
+    is_kart(e2) &&
+    !raydium_ode_network_element_isdistant(e2) )
+	    {
+	    touch_mine(e1,e2);
+	    return 0;
+	    }
+
+if( raydium_ode_element_tag_get(e2)==TAG_MINE &&
+    is_kart(e1) &&
+    !raydium_ode_network_element_isdistant(e1) )
+	    {
+	    touch_mine(e2,e1);
+	    return 0;
+	    }
+
+if( raydium_ode_element_tag_get(e1)==TAG_BONUS &&
+    is_kart(e2) &&
+    !have_bonus &&
+    !raydium_ode_network_element_isdistant(e2) )
+	    {
+	    touch_bonus(e1,e2);
+	    return 0;
+	    }
+
+if( raydium_ode_element_tag_get(e2)==TAG_BONUS &&
+    is_kart(e1) &&
+    !have_bonus &&
+    !raydium_ode_network_element_isdistant(e1) )
+	    {
+	    touch_bonus(e2,e1);
+	    return 0;
+	    }
+
+if( raydium_ode_element_tag_get(e1)==TAG_OIL &&
+    is_kart(e2) &&
+    !raydium_ode_network_element_isdistant(e2) )
+	    {
+	    touch_oil(e1,e2);
+	    return 0;
+	    }
+
+if( raydium_ode_element_tag_get(e2)==TAG_OIL &&
+    is_kart(e1) &&
+    !raydium_ode_network_element_isdistant(e1) )
+	    {
+	    touch_oil(e2,e1);
+	    return 0;
+	    }
+
+return 1;
+}
+
+void frame_step(GLfloat step)
+{
+// update timers here
+frame_time=step;
+if(invin_time>0) invin_time-=step;
+bonusroll_time-=step;
+boost_time-=step;
+weight_time-=step;
+oil_time-=step;
+if(raydium_key[GLUT_KEY_HOME])
+    replace_time+=step;
+else
+    replace_time=0;
+}
+
+void start_game(void)
+{
+int i;
+FILE *fp;
+
+if(menu_networked_game)
+    {
+    if(!raydium_network_client_connect_to(menu_server_ip))
+	{
+	menu_main(0);
+	return;
+	}
+    }
+
+fp=fopen("server.last","wt");
+if(fp)
+    {
+    fputs(menu_server_ip,fp);
+    fclose(fp);
+    }
+
+for(i=0;i<4;i++)
+    game_state.scores[i]=DEFAULT_SCORE;
+
+create_kart();
+invin_time=0;
+have_bonus=0;
+boost_time=0;
+weight_time=0;
+oil_time=0;
+replace_time=0;
+in_game=1;
+smoke_time=0;
+game_over=0;
+drop_bonus(0);
+}
+
+
+char draw_element_before(int elem)
+{
+int team;
+
+if(is_kart(elem))
+    {
+    team=raydium_ode_element_tag_get(elem)-TAG_KART;
+    raydium_rendering_rgb_force(TEAM_COL(team));
+    }
+
+return 1; // draw element
+}
+
+void draw_element_after(int elem)
+{
+raydium_rendering_rgb_normal();
+}
+
+
+void draw_game(void)
+{
+dReal speed,direct,accel,slip;
+int i;
+
+if(raydium_key_last==1027)
+    exit(0); // too "hard"
+
+if(raydium_ode_object_find("KART")<0)
+    {
+    in_game=0;
+    raydium_camera_look_at(0.1,0.1,0,0,1,0);
+    raydium_osd_color_ega('f');
+    raydium_osd_draw_name("BOXfront.tga",0,100,100,0);
+    }
+else
+    {
+    in_game=1;
+    
+    raydium_joy_key_emul();
+
+    if(game_over)
+	{
+	raydium_joy_x=raydium_joy_y=raydium_key_last=0;
+	}
+        
+    if(raydium_key_last==1032)
+	bonus_fire();
+
+    if(replace_time>REPLACE_TIME)
+	{
+	create_kart();
+	replace_time=0;
+	}
+
+    speed=direct=0;
+    accel=0.03;
+
+    if(oil_time>0)
+	slip=RAYDIUM_ODE_SLIP_ICE;
+    else
+	slip=RAYDIUM_ODE_SLIP_DEFAULT;
+
+    raydium_ode_element_slip_name("kart_pneu_ag",slip);
+    raydium_ode_element_slip_name("kart_pneu_ad",slip);
+    raydium_ode_element_slip_name("kart_pneu_rg",slip);
+    raydium_ode_element_slip_name("kart_pneu_rd",slip);
+    
+    if(raydium_joy_y>0.3 || raydium_key[GLUT_KEY_INSERT]) // "insert" is a hack
+	{
+        speed=raydium_joy_y*25;
+	if(boost_time>0) 
+	    {
+	    speed*=2;
+	    accel*=2;
+	    }
+
+	if(weight_time>0) 
+	    {
+	    speed/=2;
+	    accel/=2;
+	    }
+	raydium_ode_motor_power_max_name("kart_moteur",accel);
+	raydium_ode_motor_power_max_name("kart_frein",0);
+	}
+    else
+	{
+	raydium_ode_motor_power_max_name("kart_moteur",0);
+	raydium_ode_motor_power_max_name("kart_frein",0.1 * -raydium_joy_y);
+	}
+
+    direct=raydium_joy_x*0.3;
+    
+    if(raydium_key[GLUT_KEY_END])
+	raydium_ode_element_camera_inboard_name("kart_corps",-0.15,0,0.07,-2,0,0);
+    else
+	raydium_ode_element_camera_inboard_name("kart_corps",0,0,0.15,2,0,0);
+
+    raydium_ode_motor_speed_name("kart_moteur",-speed);
+    raydium_ode_motor_angle_name("kart_direction",direct);
+    speed=raydium_ode_motor_speed_get_name("kart_moteur",1);
+    speed*=0.1; // wheel radius
+    speed/=2;
+    speed+=0.5; // lower speed
+    speed=raydium_trigo_abs(speed);
+    if(speed>2) speed=2;
+    raydium_sound_SetSourcePitch(sounds[SOUND_ENGINE],speed);
+    raydium_ode_element_sound_update_name("kart_corps",sounds[SOUND_ENGINE]);
+    
+    raydium_ode_draw_all(0);
+    //raydium_ode_draw_all(1);
+    manage_bonus();
+    
+    // Here, we test scores <=0 !
+    for(i=0;i<4;i++)
+	{
+	raydium_osd_color_change(TEAM_COL(i));
+	if(game_state.scores[i]<=0)
+	    {
+	    raydium_osd_printf(30,60-(i*5),30,0.5,"font2.tga","%s looses !",teams[i].name);
+	    game_over=1;
+	    }
+	}	
+    }
+raydium_ode_network_element_send_iterative(RAYDIUM_ODE_NETWORK_OPTIMAL);
+}
+
+void display(void)
+{
+int i;
+
+raydium_background_color_change(sun[0],sun[1],sun[2],sun[3]);
+raydium_light_position[0][0]=50;
+raydium_light_position[0][1]=150;
+raydium_light_position[0][2]=200;
+raydium_light_position[0][3]=1.0;
+
+raydium_clear_frame();
+glLoadIdentity();
+
+draw_game();
+
+if(menu) MenuItem_draw();
+
+for(i=0;i<4;i++)
+    {
+    raydium_osd_color_change(TEAM_COL(i));
+    raydium_osd_printf(2,90-(i*5),20,0.5,"font2.tga","%s: %i",teams[i].name,game_state.scores[i]);
+    }    
+
+raydium_osd_printf(90,2,20,0.4,"font2.tga","^c%i FPS",raydium_render_fps);
+//raydium_osd_network_stat_draw(5,5,10);
+raydium_osd_logo("logo.tga");
+raydium_rendering_finish();
+}
+
+int main(int argc, char **argv)
+{
+raydium_init_args(argc,argv);
+raydium_window_create(800,600,RAYDIUM_RENDERING_WINDOW,version);
+raydium_texture_filter_change(RAYDIUM_TEXTURE_FILTER_TRILINEAR);
+raydium_projection_near=0.05;
+raydium_projection_far=1000;
+raydium_projection_fov=70;
+raydium_fog_disable();
+raydium_light_on(0);
+memcpy(raydium_light_color[0],sun,raydium_internal_size_vector_float_4);
+raydium_light_intensity[0]=1000000;
+raydium_light_update_all(0);
+
+memcpy(raydium_light_color[1],amb,raydium_internal_size_vector_float_4);
+raydium_light_intensity[1]=10000;
+raydium_light_update_all(1);
+raydium_window_view_update();
+
+strcpy(raydium_console_config_texture,"logo_console.tga");
+raydium_osd_cursor_set("BOXcursor.tga",4,4);
+raydium_sky_box_cache();
+
+conf_init();
+bonus_init();
+sound_init();
+menu_main(0);
+net_init();
+
+raydium_timecall_add(frame_step,-1);
+raydium_ode_ground_set_name("laby1.tri");
+raydium_ode_CollideCallback=collide;
+raydium_ode_ExplosionCallback=explo;
+raydium_ode_BeforeElementDrawCallback=draw_element_before;
+raydium_ode_AfterElementDrawCallback=draw_element_after;
+
+//raydium_ode_element_slip_name("ground",RAYDIUM_ODE_SLIP_ICE/5.f);
+
+raydium_callback(&display);
+return 0;
+}
+

Property changes on: kartagony.c
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property