X-Git-Url: https://git.verplant.org/?a=blobdiff_plain;f=src%2Fobject%2Flevel_time.cpp;h=3244a46fd812635b4e47b519c3f7d832835e8359;hb=555d1b7bebb45326d82d934e07463209837309b0;hp=ee123aaf8dfe18c4ff0d87301e41ebb068e6bdf7;hpb=5b7f9214cb929399f1a855ef5807018a9447d510;p=supertux.git diff --git a/src/object/level_time.cpp b/src/object/level_time.cpp index ee123aaf8..3244a46fd 100644 --- a/src/object/level_time.cpp +++ b/src/object/level_time.cpp @@ -1,8 +1,29 @@ +// $Id$ +// +// SuperTux +// Copyright (C) 2006 Matthias Braun +// +// This program 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. +// +// This program 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 this program; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + #include #include "level_time.hpp" #include +#include +#include #include "main.hpp" #include "resources.hpp" #include "sector.hpp" @@ -11,36 +32,54 @@ #include "object/player.hpp" #include "video/drawing_context.hpp" #include "lisp/list_iterator.hpp" +#include "log.hpp" +#include "scripting/level_time.hpp" +#include "scripting/squirrel_util.hpp" /** When to alert player they're low on time! */ static const float TIME_WARNING = 20; LevelTime::LevelTime(const lisp::Lisp& reader) +: running(true), time_left(0) { - float time = -1; - lisp::ListIterator iter(&reader); - while(iter.next()) { - if(iter.item() == "time") { - iter.value()->get(time); - break; - } else { - std::cerr << "Unknown token '" << iter.item() - << "' in LevelTime object.\n"; - } - } - if(time < 0) - throw std::runtime_error("Invalid leveltime specified"); - time_left.start(time); + reader.get("name", name); + reader.get("time", time_left); + if(time_left <= 0) throw std::runtime_error("No or invalid leveltime specified"); + time_surface.reset(new Surface("images/engine/hud/time-0.png")); } -LevelTime::~LevelTime() -{} +void +LevelTime::expose(HSQUIRRELVM vm, SQInteger table_idx) +{ + if (name.empty()) return; + Scripting::LevelTime* interface = new Scripting::LevelTime(this); + expose_object(vm, table_idx, interface, name, true); +} void -LevelTime::update(float ) +LevelTime::unexpose(HSQUIRRELVM vm, SQInteger table_idx) { - if(time_left.check()) { - Sector::current()->player->kill(Player::KILL); + if (name.empty()) return; + Scripting::unexpose_object(vm, table_idx, name); +} + +void +LevelTime::update(float elapsed_time) +{ + if (!running) return; + + int prev_time = (int) floor(time_left*5); + time_left -= elapsed_time; + if(time_left <= 0) { + if(time_left <= -5 || !Sector::current()->player->get_coins()) + { + Sector::current()->player->kill(true); + stop(); + } + if(prev_time != (int) floor(time_left*5)) + { + Sector::current()->player->add_coins(-1); + } } } @@ -50,21 +89,44 @@ LevelTime::draw(DrawingContext& context) context.push_transform(); context.set_translation(Vector(0, 0)); - char str[60]; - - if(time_left.get_timeleft() < 0) { - context.draw_text(white_text, _("TIME's UP"), Vector(SCREEN_WIDTH/2, 0), - CENTER_ALLIGN, LAYER_FOREGROUND1); - } else if (time_left.get_timeleft() > TIME_WARNING - || int(global_time * 2.5) % 2) { - snprintf(str, sizeof(str), " %d", int(time_left.get_timeleft())); - context.draw_text(white_text, _("TIME"), - Vector(SCREEN_WIDTH/2, 0), CENTER_ALLIGN, LAYER_FOREGROUND1); - context.draw_text(gold_text, str, Vector(SCREEN_WIDTH/2 + 4*16, 0), - CENTER_ALLIGN, LAYER_FOREGROUND1); + if ((time_left > TIME_WARNING) || (int(game_time * 2.5) % 2)) { + std::stringstream ss; + ss << int(time_left); + std::string time_text = ss.str(); + + Surface* time_surf = time_surface.get(); + if (time_surf) { + float all_width = time_surf->get_width() + normal_font->get_text_width(time_text); + context.draw_surface(time_surf, Vector((SCREEN_WIDTH - all_width)/2, BORDER_Y + 1), LAYER_FOREGROUND1); + context.draw_text(normal_font, time_text, Vector((SCREEN_WIDTH - all_width)/2 + time_surf->get_width(), BORDER_Y), ALIGN_LEFT, LAYER_FOREGROUND1, LevelTime::text_color); + } } context.pop_transform(); } +void +LevelTime::start() +{ + running = true; +} + +void +LevelTime::stop() +{ + running = false; +} + +float +LevelTime::get_time() +{ + return time_left; +} + +void +LevelTime::set_time(float time_left) +{ + this->time_left = std::min(std::max(time_left, 0.0f), 999.0f); +} + IMPLEMENT_FACTORY(LevelTime, "leveltime");