diff options
Diffstat (limited to 'src/screen/world.c')
| -rw-r--r-- | src/screen/world.c | 609 |
1 files changed, 609 insertions, 0 deletions
diff --git a/src/screen/world.c b/src/screen/world.c new file mode 100644 index 0000000..5fa3ecd --- /dev/null +++ b/src/screen/world.c @@ -0,0 +1,609 @@ + +#include <stdio.h> +#include <assert.h> + +#include "main.h" +#include "list.h" +#include "tux.h" +#include "item.h" +#include "shot.h" +#include "gun.h" +#include "myTimer.h" +#include "net_multiplayer.h" +#include "arena.h" +#include "arenaFile.h" +#include "proto.h" +#include "modules.h" +#include "idManager.h" +#include "serverSendMsg.h" + +#include "interface.h" +#include "layer.h" +#include "image.h" +#include "font.h" + +#include "hotKey.h" +#include "panel.h" +#include "radar.h" +#include "chat.h" +#include "pauza.h" +#include "term.h" +#include "saveDialog.h" +#include "saveLoad.h" + +#ifndef NO_SOUND +# include "music.h" +# include "sound.h" +#endif + +#include "screen.h" +#include "world.h" +#include "analyze.h" +#include "setting.h" +#include "gameType.h" +#include "settingKeys.h" +#include "choiceArena.h" +#include "table.h" + + +static arena_t *arena; +static bool_t isScreenWorldInit = FALSE; +static bool_t isEndWorld; + +static tux_t *tuxWithControlRightKeyboard; +static tux_t *tuxWithControlLeftKeyboard; + +bool_t isScreenWorldInicialized() +{ + return isScreenWorldInit; +} + +void setGameType() +{ + int ret = 0; + + ret = initNetMuliplayer(getSettingGameType(), getSettingIP(), + getSettingPort(), getSettingProto()); + + if (ret != 0) { + fprintf(stderr, _("Network initialization error!\n")); + setWorldEnd(); + } +} + +void setWorldArena(arenaFile_t * arenaFile) +{ + arena = getArena(arenaFile); + +#ifndef NO_SOUND + playMusic(arena->music, MUSIC_GROUP_USER); +#endif +} + +void setWorldEnd() +{ + isEndWorld = TRUE; +} + +static void timer_endArena() +{ + if (getNetTypeGame() != NET_GAME_TYPE_CLIENT) { + setWorldEnd(); + return; + } +} + +void countRoundInc() +{ + if (arena->max_countRound == WORLD_COUNT_ROUND_UNLIMITED || + arena->countRound >= arena->max_countRound) { + return; + } + + arena->countRound++; + //printf("count %d/%d\n", count, max_count); + + if (arena->countRound >= arena->max_countRound) { + //printf("count %d ending\n", count); +#ifndef NO_SOUND + playSound("end", SOUND_GROUP_BASE); +#endif + addTaskToTimer(getCurrentArena()->listTimer, TIMER_ONE, timer_endArena, NULL, TIMER_END_ARENA); + } +} + +void prepareArena() +{ + tux_t *tux; + char name[STR_NAME_SIZE]; + + //printf("getSettingAI = %s\n", getSettingAI()); + setCurrentArena(NULL); + tuxWithControlRightKeyboard = NULL; + tuxWithControlLeftKeyboard = NULL; + + if (getGemeTypeLoadSession() != NULL) { + loadArena(getGemeTypeLoadSession()); + return; + } + + switch (getNetTypeGame()) { + case NET_GAME_TYPE_NONE: + setWorldArena(getChoiceArena()); + addNewItem(arena->spaceItem, ID_UNKNOWN); + getSettingCountRound(&arena->max_countRound); + + tux = newTux(); + tux->control = TUX_CONTROL_KEYBOARD_RIGHT; + tuxWithControlRightKeyboard = tux; + getSettingNameRight(name); + tuxSetName(tux, name); + addObjectToSpace(arena->spaceTux, tux); + + tux = newTux(); + tux->control = TUX_CONTROL_KEYBOARD_LEFT; + tuxWithControlLeftKeyboard = tux; + getSettingNameLeft(name); + tuxSetName(tux, name); + addObjectToSpace(arena->spaceTux, tux); + + if (isSettingAI()) { + tux->control = TUX_CONTROL_AI; + + if (loadModule("libmodAI") != 0) { + tux->control = TUX_CONTROL_KEYBOARD_LEFT; + } + } + //printf("getGemeTypeLoadSession = %s\n", getGemeTypeLoadSession()); + + break; + + case NET_GAME_TYPE_SERVER: + setWorldArena(getChoiceArena()); + addNewItem(arena->spaceItem, ID_UNKNOWN); + getSettingCountRound(&arena->max_countRound); + + tux = newTux(); + tux->control = TUX_CONTROL_KEYBOARD_RIGHT; + tuxWithControlRightKeyboard = tux; + getSettingNameRight(name); + tuxSetName(tux, name); + addObjectToSpace(arena->spaceTux, tux); + break; + + case NET_GAME_TYPE_CLIENT: + break; + } +} + +void drawWorld() +{ + if (arena != NULL) { + drawArena(arena); + drawPanel(tuxWithControlRightKeyboard, tuxWithControlLeftKeyboard); + + if (arena->w > WINDOW_SIZE_X || arena->h > WINDOW_SIZE_Y) { + drawRadar(arena); + } + } + + drawChat(); + drawPauza(); + drawTerm(); + drawSaveDialog(); +} + +static void netAction(tux_t * tux, int action) +{ + if (getSettingGameType() == NET_GAME_TYPE_SERVER) { + proto_send_event_server(PROTO_SEND_ALL_SEES_TUX, NULL, tux, action); + } + + if (getSettingGameType() == NET_GAME_TYPE_CLIENT) { + proto_send_event_client(action); + } +} + +static void control_keyboard_right(tux_t * tux) +{ + static int lastKey = 0; + int countKey; + Uint8 *mapa; + mapa = SDL_GetKeyState(NULL); + + assert(tux != NULL); + assert(mapa != NULL); + + countKey = 0; + + if (mapa[(SDLKey) getKey(KEY_TUX_RIGHT_MOVE_UP)] == SDL_PRESSED) + countKey++; + + if (mapa[(SDLKey) getKey(KEY_TUX_RIGHT_MOVE_RIGHT)] == SDL_PRESSED) + countKey++; + + if (mapa[(SDLKey) getKey(KEY_TUX_RIGHT_MOVE_LEFT)] == SDL_PRESSED) + countKey++; + + if (mapa[(SDLKey) getKey(KEY_TUX_RIGHT_MOVE_DOWN)] == SDL_PRESSED) + countKey++; + + if (mapa[(SDLKey) getKey(KEY_TUX_RIGHT_SWITCH_WEAPON)] == SDL_PRESSED + && tux->isCanSwitchGun == TRUE) { + netAction(tux, TUX_SWITCH_GUN); + actionTux(tux, TUX_SWITCH_GUN); + return; + } + + if (mapa[(SDLKey) getKey(KEY_TUX_RIGHT_SHOOT)] == SDL_PRESSED + && tux->isCanShot == TRUE) { + netAction(tux, TUX_SHOT); + actionTux(tux, TUX_SHOT); + return; + } + + if (mapa[(SDLKey) getKey(KEY_TUX_RIGHT_MOVE_UP)] == SDL_PRESSED) { + if (countKey > 1 && lastKey == getKey(KEY_TUX_RIGHT_MOVE_UP)) + goto tuUp; + + if (countKey == 1) + lastKey = getKey(KEY_TUX_RIGHT_MOVE_UP); + netAction(tux, TUX_UP); + actionTux(tux, TUX_UP); + return; + + tuUp:; + } + + if (mapa[(SDLKey) getKey(KEY_TUX_RIGHT_MOVE_RIGHT)] == SDL_PRESSED) { + if (countKey > 1 && lastKey == getKey(KEY_TUX_RIGHT_MOVE_RIGHT)) + goto tuRight; + + if (countKey == 1) + lastKey = getKey(KEY_TUX_RIGHT_MOVE_RIGHT); + netAction(tux, TUX_RIGHT); + actionTux(tux, TUX_RIGHT); + return; + + tuRight:; + + } + + if (mapa[(SDLKey) getKey(KEY_TUX_RIGHT_MOVE_LEFT)] == SDL_PRESSED) { + if (countKey > 1 && lastKey == getKey(KEY_TUX_RIGHT_MOVE_LEFT)) + goto tuLeft; + + if (countKey == 1) + lastKey = getKey(KEY_TUX_RIGHT_MOVE_LEFT); + netAction(tux, TUX_LEFT); + actionTux(tux, TUX_LEFT); + return; + + tuLeft:; + } + + if (mapa[(SDLKey) getKey(KEY_TUX_RIGHT_MOVE_DOWN)] == SDL_PRESSED) { + if (countKey > 1 && lastKey == getKey(KEY_TUX_RIGHT_MOVE_DOWN)) + goto tuDown; + + if (countKey == 1) + lastKey = getKey(KEY_TUX_RIGHT_MOVE_DOWN); + netAction(tux, TUX_DOWN); + actionTux(tux, TUX_DOWN); + return; + + tuDown:; + } +} + +static void control_keyboard_left(tux_t * tux) +{ + static int lastKey = 0; + int countKey; + Uint8 *mapa; + mapa = SDL_GetKeyState(NULL); + + assert(tux != NULL); + assert(mapa != NULL); + + countKey = 0; + + if (mapa[(SDLKey) getKey(KEY_TUX_LEFT_MOVE_UP)] == SDL_PRESSED) + countKey++; + + if (mapa[(SDLKey) getKey(KEY_TUX_LEFT_MOVE_RIGHT)] == SDL_PRESSED) + countKey++; + + if (mapa[(SDLKey) getKey(KEY_TUX_LEFT_MOVE_LEFT)] == SDL_PRESSED) + countKey++; + + if (mapa[(SDLKey) getKey(KEY_TUX_LEFT_MOVE_DOWN)] == SDL_PRESSED) + countKey++; + + if (mapa[(SDLKey) getKey(KEY_TUX_LEFT_SWITCH_WEAPON)] == SDL_PRESSED) { + if (tux->isCanSwitchGun == TRUE) { + actionTux(tux, TUX_SWITCH_GUN); + return; + } + } + + if (mapa[(SDLKey) getKey(KEY_TUX_LEFT_SHOOT)] == SDL_PRESSED + && tux->isCanShot == TRUE) { + actionTux(tux, TUX_SHOT); + return; + } + + if (mapa[(SDLKey) getKey(KEY_TUX_LEFT_MOVE_UP)] == SDL_PRESSED) { + if (countKey > 1 && lastKey == getKey(KEY_TUX_LEFT_MOVE_UP)) + goto tuUp; + + if (countKey == 1) + lastKey = getKey(KEY_TUX_LEFT_MOVE_UP); + actionTux(tux, TUX_UP); + return; + + tuUp:; + } + + if (mapa[(SDLKey) getKey(KEY_TUX_LEFT_MOVE_RIGHT)] == SDL_PRESSED) { + if (countKey > 1 && lastKey == getKey(KEY_TUX_LEFT_MOVE_RIGHT)) + goto tuRight; + + if (countKey == 1) + lastKey = getKey(KEY_TUX_LEFT_MOVE_RIGHT); + actionTux(tux, TUX_RIGHT); + return; + + tuRight:; + + } + + if (mapa[(SDLKey) getKey(KEY_TUX_LEFT_MOVE_LEFT)] == SDL_PRESSED) { + if (countKey > 1 && lastKey == getKey(KEY_TUX_LEFT_MOVE_LEFT)) + goto tuLeft; + + if (countKey == 1) + lastKey = getKey(KEY_TUX_LEFT_MOVE_LEFT); + actionTux(tux, TUX_LEFT); + return; + + tuLeft:; + } + + if (mapa[(SDLKey) getKey(KEY_TUX_LEFT_MOVE_DOWN)] == SDL_PRESSED) { + if (countKey > 1 && lastKey == getKey(KEY_TUX_LEFT_MOVE_DOWN)) + goto tuDown; + + if (countKey == 1) + lastKey = getKey(KEY_TUX_LEFT_MOVE_DOWN); + actionTux(tux, TUX_DOWN); + return; + + tuDown:; + } +} + +static void eventEnd() +{ + if (isEndWorld == TRUE) { + setScreen("analyze"); + return; + } +} + +tux_t *getControlTux(int control_type) +{ + switch (control_type) { + case TUX_CONTROL_KEYBOARD_RIGHT: + return tuxWithControlRightKeyboard; + break; + case TUX_CONTROL_KEYBOARD_LEFT: + return tuxWithControlLeftKeyboard; + break; + } + + return NULL; +} + +void setControlTux(tux_t * tux, int control_type) +{ + switch (control_type) { + case TUX_CONTROL_KEYBOARD_RIGHT: + tuxWithControlRightKeyboard = tux; + break; + case TUX_CONTROL_KEYBOARD_LEFT: + tuxWithControlLeftKeyboard = tux; + break; + } +} + +void tuxControl(tux_t * p) +{ + assert(p != NULL); + + if (p->status != TUX_STATUS_ALIVE) { + return; + } + + switch (p->control) { + case TUX_CONTROL_NONE: + assert(!_("Tux has not defined controls!")); + break; + + case TUX_CONTROL_KEYBOARD_LEFT: + if (isChatActive() == FALSE) { + control_keyboard_left(p); + } + break; + + case TUX_CONTROL_KEYBOARD_RIGHT: + if (isChatActive() == FALSE) { + control_keyboard_right(p); + } + break; + } +} + +void eventWorld() +{ + tux_t *thisTux; + + if (arena == NULL) { + eventNetMultiplayer(); + eventEnd(); + return; + } + + eventNetMultiplayer(); + + if (isPauzeActive() == FALSE && isSaveDialogActive() == FALSE) { + eventArena(arena); + //eventModule(); + } + + thisTux = getControlTux(TUX_CONTROL_KEYBOARD_RIGHT); + + addToRadar(thisTux->id, thisTux->x, thisTux->y, RADAR_TYPE_YOU); + + thisTux = getControlTux(TUX_CONTROL_KEYBOARD_LEFT); + + if (thisTux != NULL) { + addToRadar(thisTux->id, thisTux->x, thisTux->y, RADAR_TYPE_TUX); + } + + eventEnd(); + eventChat(); + eventPauza(); + eventTerm(); + eventSaveDialog(); + +} + +static void hotkey_escape() +{ + setWorldEnd(); +} + +void startWorld() +{ + arena = NULL; + isEndWorld = FALSE; + + registerHotKey(SDLK_ESCAPE, hotkey_escape); + initArena(); + initListID(); + initRadar(); + initPauza(); + initTerm(); + initSaveDialog(); + + initModule(); + setGameType(); + initChat(); + prepareArena(); +} + +static void action_analyze(space_t * space, tux_t * tux, void *p) +{ + addAnalyze(tux->name, tux->score); +} + +static void setAnalyze() +{ + restartAnalyze(); + + actionSpace(arena->spaceTux, action_analyze, NULL); + + endAnalyze(); +} + +static void setTable() +{ + tux_t *tuxRight; + tux_t *tuxLeft; + + if (getSettingGameType() != NET_GAME_TYPE_NONE) { + return; + } + + tuxRight = getControlTux(TUX_CONTROL_KEYBOARD_RIGHT); + tuxLeft = getControlTux(TUX_CONTROL_KEYBOARD_LEFT); + + if (tuxRight->score > tuxLeft->score) { + addPlayerInHighScore(tuxRight->name, tuxRight->score); + } + + if (tuxLeft->score > tuxRight->score) { + addPlayerInHighScore(tuxLeft->name, tuxLeft->score); + } +} + +void stoptWorld() +{ + if (arena != NULL) { + setTable(); + setAnalyze(); + } + + unregisterHotKey(SDLK_ESCAPE); + quitArena(); + + quitNetMultiplayer(); + + if (arena != NULL) { + destroyArena(arena); + } + + quitRadar(); + quitPauza(); + quitTerm(); + quitSaveDialog(); + + +#ifndef NO_SOUND + stopMusic(); +#endif + delAllImageInGroup(IMAGE_GROUP_USER); + +#ifndef NO_SOUND + delAllMusicInGroup(MUSIC_GROUP_USER); +#endif + quitModule(); + quitChat(); + quitListID(); +} + +void initWorld() +{ + assert(isImageInicialized() == TRUE); + assert(isTuxInicialized() == TRUE); + assert(isShotInicialized() == TRUE); + assert(isPanelInicialized() == TRUE); + assert(isScreenInicialized() == TRUE); + + registerScreen(newScreen + ("world", startWorld, eventWorld, drawWorld, stoptWorld)); + +#ifndef NO_SOUND + addSound("dead.ogg", "dead", SOUND_GROUP_BASE); + addSound("explozion.ogg", "explozion", SOUND_GROUP_BASE); + addSound("gun_lasser.ogg", "gun_lasser", SOUND_GROUP_BASE); + addSound("gun_revolver.ogg", "gun_revolver", SOUND_GROUP_BASE); + addSound("gun_scatter.ogg", "gun_scatter", SOUND_GROUP_BASE); + addSound("gun_tommy.ogg", "gun_tommy", SOUND_GROUP_BASE); + addSound("put_mine.ogg", "put_mine", SOUND_GROUP_BASE); + addSound("teleport.ogg", "teleport", SOUND_GROUP_BASE); + addSound("item_bonus.ogg", "item_bonus", SOUND_GROUP_BASE); + addSound("item_gun.ogg", "item_gun", SOUND_GROUP_BASE); + addSound("switch_gun.ogg", "switch_gun", SOUND_GROUP_BASE); + addSound("end.ogg", "end", SOUND_GROUP_BASE); +#endif + + isScreenWorldInit = TRUE; +} + +void quitWorld() +{ + DEBUG_MSG(_("Quitting screen world\n")); + isScreenWorldInit = FALSE; +} |