X-Git-Url: https://git.verplant.org/?a=blobdiff_plain;f=src%2Fobject%2Flevel_time.cpp;h=3244a46fd812635b4e47b519c3f7d832835e8359;hb=555d1b7bebb45326d82d934e07463209837309b0;hp=591176344f77259e4b2a73540392fe51444239cc;hpb=249ccffa03ded6f1ba06cce346f91d96d8ce3ed5;p=supertux.git diff --git a/src/object/level_time.cpp b/src/object/level_time.cpp index 591176344..3244a46fd 100644 --- a/src/object/level_time.cpp +++ b/src/object/level_time.cpp @@ -33,6 +33,8 @@ #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; @@ -40,20 +42,44 @@ static const float TIME_WARNING = 20; LevelTime::LevelTime(const lisp::Lisp& reader) : running(true), time_left(0) { + 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")); } 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::unexpose(HSQUIRRELVM vm, SQInteger table_idx) +{ + if (name.empty()) return; + Scripting::unexpose_object(vm, table_idx, name); +} + +void LevelTime::update(float elapsed_time) { if (!running) return; - time_left = std::max(time_left - elapsed_time, 0.0f); + int prev_time = (int) floor(time_left*5); + time_left -= elapsed_time; if(time_left <= 0) { - Sector::current()->player->kill(true); - stop(); + 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); + } } } @@ -70,9 +96,9 @@ LevelTime::draw(DrawingContext& context) Surface* time_surf = time_surface.get(); if (time_surf) { - float all_width = time_surf->get_width() + white_text->get_text_width(time_text); - context.draw_surface(time_surf, Vector((SCREEN_WIDTH - all_width)/2, BORDER_Y + 1), LAYER_FOREGROUND1); - context.draw_text(gold_text, time_text, Vector((SCREEN_WIDTH - all_width)/2 + time_surf->get_width(), BORDER_Y), LEFT_ALLIGN, LAYER_FOREGROUND1); + 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); } } @@ -80,9 +106,27 @@ LevelTime::draw(DrawingContext& context) } 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");