diff options
Diffstat (limited to 'src')
| -rwxr-xr-x | src/Makefile | 12 | ||||
| -rw-r--r-- | src/arenaFile.c | 66 | ||||
| -rwxr-xr-x | src/interface.c | 4 | ||||
| -rw-r--r-- | src/main.c | 7 | ||||
| -rw-r--r-- | src/net_multiplayer.c | 23 | ||||
| -rw-r--r-- | src/screen_choiceArena.c | 165 | ||||
| -rw-r--r-- | src/screen_gameType.c | 9 | ||||
| -rw-r--r-- | src/screen_world.c | 46 | ||||
| -rw-r--r-- | src/widget_button.c | 8 | ||||
| -rw-r--r-- | src/widget_buttonimage.c | 54 |
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() @@ -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); +} |