summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authororoborus <oroborus@0ee4d065-81f0-4d1e-b06c-ff20ad07cc3e>2008-03-01 21:30:00 +0000
committeroroborus <oroborus@0ee4d065-81f0-4d1e-b06c-ff20ad07cc3e>2008-03-01 21:30:00 +0000
commit8a14d60d2078b4bcdfc789b1b9794e2008979f02 (patch)
treea6095da867303ec71fed55a952ecd45fc0835417 /src
parentf5258aed755575c1abf269348e4e335cdcb17a3b (diff)
- screen na vyberanie aren
- areny z povodnych tuxancov boli prescriptovane do tuxanci-ng, treba este dopisat teleporty a rury git-svn-id: http://opensvn.csie.org/tuxanci_ng@7 0ee4d065-81f0-4d1e-b06c-ff20ad07cc3e
Diffstat (limited to 'src')
-rwxr-xr-xsrc/Makefile12
-rw-r--r--src/arenaFile.c66
-rwxr-xr-xsrc/interface.c4
-rw-r--r--src/main.c7
-rw-r--r--src/net_multiplayer.c23
-rw-r--r--src/screen_choiceArena.c165
-rw-r--r--src/screen_gameType.c9
-rw-r--r--src/screen_world.c46
-rw-r--r--src/widget_button.c8
-rw-r--r--src/widget_buttonimage.c54
10 files changed, 376 insertions, 18 deletions
diff --git a/src/Makefile b/src/Makefile
index 224e70a..31f3393 100755
--- a/src/Makefile
+++ b/src/Makefile
@@ -1,14 +1,15 @@
CC = gcc
-CFLAGS = -g -O0 `sdl-config --cflags` -I../include -Wall
+CFLAGS = -g -O0 -DDISTDIR=\"$(DISTDIR)\" `sdl-config --cflags` -I../include -Wall
LIBS = `sdl-config --libs` -lSDL_image -lSDL_ttf -lSDL_mixer
FILES = interface.o font.o list.o image.o layer.o director.o configFile.o tux.o main.o \
screen.o screen_world.o wall.o shot.o myTimer.o panel.o net_multiplayer.o network.o \
buffer.o dynamicInt.o arena.o arenaFile.o textFile.o sound.o audio.o music.o gun.o \
item.o widget_label.o screen_mainMenu.o widget_button.o screen_analyze.o widget_textfield.o \
- widget_check.o widget_image.o screen_setting.o screen_gameType.o
+ widget_check.o widget_image.o screen_setting.o screen_gameType.o screen_choiceArena.o \
+ widget_buttonimage.o
tuxanci-ng: $(FILES)
@@ -107,12 +108,18 @@ screen_setting.o: screen_setting.c ../include/screen_setting.h
screen_gameType.o: screen_gameType.c ../include/screen_gameType.h
$(CC) $(CFLAGS) -o screen_gameType.o -c screen_gameType.c
+screen_choiceArena.o: screen_choiceArena.c ../include/screen_choiceArena.h
+ $(CC) $(CFLAGS) -o screen_choiceArena.o -c screen_choiceArena.c
+
widget_label.o: widget_label.c ../include/widget_label.h
$(CC) $(CFLAGS) -o widget_label.o -c widget_label.c
widget_button.o: widget_button.c ../include/widget_button.h
$(CC) $(CFLAGS) -o widget_button.o -c widget_button.c
+widget_buttonimage.o: widget_buttonimage.c ../include/widget_buttonimage.h
+ $(CC) $(CFLAGS) -o widget_buttonimage.o -c widget_buttonimage.c
+
widget_textfield.o: widget_textfield.c ../include/widget_textfield.h
$(CC) $(CFLAGS) -o widget_textfield.o -c widget_textfield.c
@@ -122,5 +129,6 @@ widget_check.o: widget_check.c ../include/widget_check.h
widget_image.o: widget_image.c ../include/widget_image.h
$(CC) $(CFLAGS) -o widget_image.o -c widget_image.c
+
clean:
rm -rf *.o *.c~ *.h~ tuxanci-ng
diff --git a/src/arenaFile.c b/src/arenaFile.c
index 34b3335..e1cc5b4 100644
--- a/src/arenaFile.c
+++ b/src/arenaFile.c
@@ -140,6 +140,72 @@ static void cmd_wall(arena_t *arena, char *line)
addList(arena->listWall, new);
}
+int getArenaCount()
+{
+ return listArenaFile->count;
+}
+
+static char *getArenaStatus(int id, char *s)
+{
+ textFile_t *ts;
+ int len;
+ int i;
+
+ ts = (textFile_t *) listArenaFile->list[id];
+ len = strlen(s);
+
+ for( i = 0 ; i < ts->text->count ; i++ )
+ {
+ char *line;
+ line = (char *) (ts->text->list[i]);
+
+ if( strncmp(line, s, len) == 0 )
+ {
+ return line+len+1;
+ }
+ }
+
+ return NULL;
+}
+
+char *getArenaName(int id)
+{
+ char *ret;
+
+ ret = getArenaStatus(id, "name");
+
+ return ( ret != NULL ? ret : "arena_no_name" );
+}
+
+char *getArenaNetName(int id)
+{
+ char *ret;
+
+ ret = getArenaStatus(id, "netName");
+
+ return ( ret != NULL ? ret : "arena_no_net_name" );
+}
+
+int getArenaIdFormNetName(char *s)
+{
+ int i;
+
+ for( i = 0 ; i < listArenaFile->count ; i++ )
+ {
+ if( strcmp(getArenaNetName(i), s) == 0 )
+ {
+ return i;
+ }
+ }
+
+ return -1;
+}
+
+char *getArenaImage(int id)
+{
+ return getArenaStatus(id, "screen");
+}
+
arena_t* getArena(int id)
{
textFile_t *ts;
diff --git a/src/interface.c b/src/interface.c
index 42ced59..fbc6dea 100755
--- a/src/interface.c
+++ b/src/interface.c
@@ -81,8 +81,8 @@ SDL_Surface* getSDL_Screen()
void interfaceRefresh()
{
//SDL_BlitSurface(fake_screen, NULL, screen, NULL);
- SDL_UpdateRect(screen, 0, 0, screen->w, screen->h);
- //SDL_Flip(screen);
+ //SDL_UpdateRect(screen, 0, 0, screen->w, screen->h);
+ SDL_Flip(screen);
}
int toggleFullscreen()
diff --git a/src/main.c b/src/main.c
index e6fb709..dad0ea4 100644
--- a/src/main.c
+++ b/src/main.c
@@ -13,6 +13,7 @@
#include "screen_analyze.h"
#include "screen_setting.h"
#include "screen_gameType.h"
+#include "screen_choiceArena.h"
#include "wall.h"
#include "shot.h"
#include "panel.h"
@@ -46,6 +47,7 @@ static void init()
initScreenAnalyze();
initScreenSetting();
initScreenGameType();
+ initScreenChoiceArena();
}
void quit()
@@ -68,6 +70,9 @@ void quit()
quitScreenAnalyze();
quitScreenSetting();
quitScreenGameType();
+ quitScreenChoiceArena();
+
+ printf("quit..\n");
exit(0);
}
@@ -126,6 +131,8 @@ int main(int argc, char *argv[])
{
srand( (unsigned) time(NULL) );
+ printf("dist dir = %s\n", DISTDIR);
+
my_argc = argc;
my_argv = argv;
diff --git a/src/net_multiplayer.c b/src/net_multiplayer.c
index 9080d26..786e1b9 100644
--- a/src/net_multiplayer.c
+++ b/src/net_multiplayer.c
@@ -14,6 +14,8 @@
#include "screen.h"
#include "screen_world.h"
#include "screen_setting.h"
+#include "screen_choiceArena.h"
+#include "arenaFile.h"
#include "net_multiplayer.h"
static int netGameType;
@@ -160,9 +162,13 @@ static void destroyClient(client_t *p)
void proto_send_init_server(client_t *client)
{
char msg[STR_SIZE];
+ int n;
- sprintf(msg, "init %d %d %d\n",
- client->tux->id, client->tux->x, client->tux->y);
+ getSettingCountRound(&n);
+
+ sprintf(msg, "init %d %d %d %d %s\n",
+ client->tux->id, client->tux->x, client->tux->y,
+ n, getArenaNetName( getChoiceArenaId() ));
sendClient(client, msg);
}
@@ -170,15 +176,22 @@ void proto_send_init_server(client_t *client)
void proto_recv_init_client(char *msg)
{
char cmd[STR_SIZE];
+ char arena_name[STR_SIZE];
tux_t *tux;
+ int id;
+ int n;
- tux = newTux();
+ sscanf(msg, "%s %d %d %d %d %s\n",
+ cmd, &id, &tux->x, &tux->y, &n, arena_name);
- sscanf(msg, "%s %d %d %d\n",
- cmd, &tux->id, &tux->x, &tux->y);
+ setWorldArena( getArenaIdFormNetName(arena_name) );
+ setMaxCountRound(n);
+ tux = newTux();
+ tux->id = id;
tux->control = TUX_CONTROL_KEYBOARD_RIGHT;
getSettingNameRight(tux->name);
+
proto_send_context_client(tux);
addList(arena->listTux, tux);
}
diff --git a/src/screen_choiceArena.c b/src/screen_choiceArena.c
new file mode 100644
index 0000000..c3637f1
--- /dev/null
+++ b/src/screen_choiceArena.c
@@ -0,0 +1,165 @@
+
+#include <stdio.h>
+#include <assert.h>
+
+#include "main.h"
+#include "interface.h"
+#include "list.h"
+#include "screen.h"
+#include "image.h"
+#include "music.h"
+#include "arenaFile.h"
+#include "screen_mainMenu.h"
+#include "screen_choiceArena.h"
+
+#include "widget_label.h"
+#include "widget_button.h"
+#include "widget_image.h"
+#include "widget_buttonimage.h"
+
+static widget_image_t *image_backgorund;
+
+static widget_button_t *button_play;
+static widget_button_t *button_back;
+
+static list_t *listWidgetButtonimage;
+static int choiceArenaId;
+
+void startScreenChoiceArena()
+{
+ playMusic("menu", MUSIC_GROUP_BASE);
+}
+
+void drawScreenChoiceArena()
+{
+ int i;
+
+ drawWidgetImage(image_backgorund);
+
+ drawWidgetButton(button_play);
+ drawWidgetButton(button_back);
+
+ for( i = 0 ; i < listWidgetButtonimage->count ; i++ )
+ {
+ widget_buttonimage_t *this;
+ this = (widget_buttonimage_t *) listWidgetButtonimage->list[i];
+ drawWidgetButtonimage(this);
+ }
+}
+
+void eventScreenChoiceArena()
+{
+ int i;
+
+ eventWidgetButton(button_play);
+ eventWidgetButton(button_back);
+
+ for( i = 0 ; i < listWidgetButtonimage->count ; i++ )
+ {
+ widget_buttonimage_t *this;
+ this = (widget_buttonimage_t *) listWidgetButtonimage->list[i];
+ eventWidgetButtonimage(this);
+ }
+}
+
+void stopScreenChoiceArena()
+{
+}
+
+static void eventWidgetButtonImage(void *p)
+{
+ widget_buttonimage_t *buttonimage;
+ int i;
+
+ buttonimage = (widget_buttonimage_t *)(p);
+
+ for( i = 0 ; i < listWidgetButtonimage->count ; i++ )
+ {
+ widget_buttonimage_t *this;
+
+ this = (widget_buttonimage_t *)(listWidgetButtonimage->list[i]);
+
+ if( buttonimage == this )
+ {
+ this->active = 1;
+ choiceArenaId = i;
+ }
+ else
+ {
+ this->active = 0;
+ }
+ }
+}
+
+int getChoiceArenaId()
+{
+ return choiceArenaId;
+}
+
+static void eventWidget(void *p)
+{
+ widget_button_t *button;
+
+ button = (widget_button_t *)(p);
+
+ if( button == button_play )
+ {
+ setScreen("world");
+ }
+
+ if( button == button_back )
+ {
+ setScreen("gameType");
+ }
+}
+
+void initScreenChoiceArena()
+{
+ SDL_Surface *image;
+ int i;
+
+ image = addImageData("screen_main.png", IMAGE_NO_ALPHA, "screen_main", IMAGE_GROUP_BASE);
+ image_backgorund = newWidgetImage(0, 0, image);
+
+ button_back = newWidgetButton("Back", 100, WINDOW_SIZE_Y-100, eventWidget);
+ button_play = newWidgetButton("Play", WINDOW_SIZE_X-200, WINDOW_SIZE_Y-100, eventWidget);
+
+ addMusic("menu.ogg", "menu", MUSIC_GROUP_BASE);
+
+ registerScreen( newScreen("chiceArena", startScreenChoiceArena, eventScreenChoiceArena,
+ drawScreenChoiceArena, stopScreenChoiceArena) );
+
+ listWidgetButtonimage = newList();
+ choiceArenaId = 0;
+
+ for( i = 0 ; i < getArenaCount() ; i++ )
+ {
+ SDL_Surface *image;
+ widget_buttonimage_t *widget_buttonimage;
+ int x, y;
+
+ image = addImageData(getArenaImage(i), IMAGE_NO_ALPHA, "none", IMAGE_GROUP_BASE);
+
+ x = 100 + 200 * ( i - 3 * ( i/3 ) );
+ y = 150 + 200*(i/3);
+
+ widget_buttonimage = newWidgetButtonimage(image,
+ x, y, eventWidgetButtonImage);
+
+ if( i == choiceArenaId )
+ {
+ widget_buttonimage->active = 1;
+ }
+
+ addList( listWidgetButtonimage, widget_buttonimage);
+ }
+}
+
+void quitScreenChoiceArena()
+{
+ destroyWidgetImage(image_backgorund);
+
+ destroyWidgetButton(button_play);
+ destroyWidgetButton(button_back);
+}
+
diff --git a/src/screen_gameType.c b/src/screen_gameType.c
index 6a04da6..cde03a3 100644
--- a/src/screen_gameType.c
+++ b/src/screen_gameType.c
@@ -129,7 +129,14 @@ static void eventWidget(void *p)
if( button == button_play )
{
- setScreen("world");
+ if( getSettingGameType() == NET_GAME_TYPE_CLIENT )
+ {
+ setScreen("world");
+ }
+ else
+ {
+ setScreen("chiceArena");
+ }
}
}
diff --git a/src/screen_world.c b/src/screen_world.c
index 8d0b87d..1f91cc6 100644
--- a/src/screen_world.c
+++ b/src/screen_world.c
@@ -10,6 +10,7 @@
#include "screen_analyze.h"
#include "screen_setting.h"
#include "screen_gameType.h"
+#include "screen_choiceArena.h"
#include "list.h"
#include "layer.h"
@@ -38,7 +39,7 @@ bool_t isScreenWorldInicialized()
return isScreenWorldInit;
}
-static void setGameType()
+void setGameType()
{
if( getSettingGameType() == NET_GAME_TYPE_SERVER )
{
@@ -56,6 +57,17 @@ arena_t* getWorldArena()
return arena;
}
+void setWorldArena(int id)
+{
+ arena = getArena(id);
+ netSetArena(arena);
+}
+
+void setMaxCountRound(int n)
+{
+ max_count = n;
+}
+
static void timer_endArena()
{
if( getNetTypeGame() != NET_GAME_TYPE_CLIENT )
@@ -99,13 +111,18 @@ static tux_t* getControlTux(int control_type)
return NULL;
}
-void createTux()
+void prepareArena()
{
tux_t *tux;
switch( getNetTypeGame() )
{
case NET_GAME_TYPE_NONE :
+ setWorldArena( getChoiceArenaId() );
+ addNewItem(arena->listItem);
+ playMusic(arena->music, MUSIC_GROUP_USER);
+ getSettingCountRound(&max_count);
+
tux = newTux();
tux->control = TUX_CONTROL_KEYBOARD_RIGHT;
getSettingNameRight(tux->name);
@@ -118,6 +135,11 @@ void createTux()
break;
case NET_GAME_TYPE_SERVER :
+ setWorldArena( getChoiceArenaId() );
+ addNewItem(arena->listItem);
+ playMusic(arena->music, MUSIC_GROUP_USER);
+ getSettingCountRound(&max_count);
+
tux = newTux();
tux->control = TUX_CONTROL_KEYBOARD_RIGHT;
getSettingNameRight(tux->name);
@@ -133,6 +155,11 @@ void drawWorld()
{
tux_t *tux = NULL;
+ if( arena == NULL )
+ {
+ return;
+ }
+
addLayer(arena->background, 0, 0, 0, 0, WINDOW_SIZE_X, WINDOW_SIZE_Y, -100);
drawListTux(arena->listTux);
@@ -306,6 +333,12 @@ void tuxControl(tux_t *p)
void eventWorld()
{
+ if( arena == NULL )
+ {
+ eventNetMultiplayer();
+ return;
+ }
+
eventListTux(arena->listTux);
eventConflictShotWithTux(arena->listTux, arena->listShot);
@@ -322,15 +355,12 @@ void eventWorld()
void startWorld()
{
- arena = getArena(0);
+ arena = NULL;
+
count = 0;
- getSettingCountRound(&max_count);
- netSetArena(arena);
setGameType();
- createTux();
- addNewItem(arena->listItem);
- playMusic(arena->music, MUSIC_GROUP_USER);
+ prepareArena();
initTimer();
}
diff --git a/src/widget_button.c b/src/widget_button.c
index 940b7bd..1024091 100644
--- a/src/widget_button.c
+++ b/src/widget_button.c
@@ -52,14 +52,22 @@ void drawWidgetButton(widget_button_t *p)
void eventWidgetButton(widget_button_t *p)
{
+ static int time = 0;
int x, y;
+ if( time > 0)
+ {
+ time--;
+ return;
+ }
+
getMousePosition(&x, &y);
if( x >= p->x && x <= p->x+WIDGET_BUTTON_WIDTH &&
y >= p->y && y <= p->y+WIDGET_BUTTON_HEIGHT &&
isMouseClicked() )
{
+ time = WIDGET_BUTTON_TIME;
p->fce_event(p);
}
}
diff --git a/src/widget_buttonimage.c b/src/widget_buttonimage.c
new file mode 100644
index 0000000..0b1cb97
--- /dev/null
+++ b/src/widget_buttonimage.c
@@ -0,0 +1,54 @@
+
+#include "main.h"
+#include "interface.h"
+#include "font.h"
+#include "widget_buttonimage.h"
+#include "image.h"
+
+widget_buttonimage_t* newWidgetButtonimage(SDL_Surface *image, int x, int y, void (*fce_event)(void *))
+{
+ widget_buttonimage_t *new;
+
+ new = malloc( sizeof(widget_buttonimage_t) );
+ new->image = image;
+ new->x = x;
+ new->y = y;
+ new->w = image->w/2;
+ new->h = image->h;
+ new->active = 0;
+ new->fce_event = fce_event;
+
+ return new;
+}
+
+void drawWidgetButtonimage(widget_buttonimage_t *p)
+{
+ drawImage(p->image, p->x, p->y, p->active*p->w, 0, p->w, p->h);
+}
+
+void eventWidgetButtonimage(widget_buttonimage_t *p)
+{
+ static int time = 0;
+ int x, y;
+
+ if( time > 0)
+ {
+ time--;
+ return;
+ }
+
+ getMousePosition(&x, &y);
+
+ if( x >= p->x && x <= p->x+p->w &&
+ y >= p->y && y <= p->y+p->h &&
+ isMouseClicked() )
+ {
+ time = WIDGET_BUTTONIMAGE_TIME;
+ p->fce_event(p);
+ }
+}
+
+void destroyWidgetButtonimage(widget_buttonimage_t *p)
+{
+ free(p);
+}