From c7bbb024732ceb6ab76485ed077d6468b009035b Mon Sep 17 00:00:00 2001 From: CatWindow Date: Sat, 15 Aug 2026 16:17:37 +0300 Subject: [PATCH 1/5] viewport rotation --- binding-mri/viewport-binding.cpp | 16 +++--- src/sprite.cpp | 8 ++- src/transform.h | 93 +++++++++++++++++++++++--------- src/viewport.cpp | 17 +++++- src/viewport.h | 15 +++--- 5 files changed, 105 insertions(+), 44 deletions(-) diff --git a/binding-mri/viewport-binding.cpp b/binding-mri/viewport-binding.cpp index dd5901b..a82553d 100644 --- a/binding-mri/viewport-binding.cpp +++ b/binding-mri/viewport-binding.cpp @@ -80,6 +80,7 @@ DEF_PROP_I(Viewport, OY) DEF_PROP_F(Viewport, ScaleX) DEF_PROP_F(Viewport, ScaleY) +DEF_PROP_F(Viewport, Rotation) void viewportBindingInit(){ VALUE klass = rb_define_class("Viewport", rb_cObject); @@ -91,12 +92,13 @@ void viewportBindingInit(){ _rb_define_method(klass, "initialize", viewportInitialize); - INIT_PROP_BIND( Viewport, Rect, "rect" ); - INIT_PROP_BIND( Viewport, OX, "ox" ); - INIT_PROP_BIND( Viewport, OY, "oy" ); - INIT_PROP_BIND( Viewport, ScaleX, "scale_x"); - INIT_PROP_BIND( Viewport, ScaleY, "scale_y"); - INIT_PROP_BIND( Viewport, Color, "color" ); - INIT_PROP_BIND( Viewport, Tone, "tone" ); + INIT_PROP_BIND( Viewport, Rect, "rect" ); + INIT_PROP_BIND( Viewport, OX, "ox" ); + INIT_PROP_BIND( Viewport, OY, "oy" ); + INIT_PROP_BIND( Viewport, ScaleX, "scale_x" ); + INIT_PROP_BIND( Viewport, ScaleY, "scale_y" ); + INIT_PROP_BIND( Viewport, Rotation, "rotation"); + INIT_PROP_BIND( Viewport, Color, "color" ); + INIT_PROP_BIND( Viewport, Tone, "tone" ); } diff --git a/src/sprite.cpp b/src/sprite.cpp index 907ae13..cfbbeab 100644 --- a/src/sprite.cpp +++ b/src/sprite.cpp @@ -623,10 +623,14 @@ void Sprite::onGeometryChange(const Scene::Geometry &geo){ * relative to screen origin */ p->trans.setGlobalOffset(geo.offset()); Viewport* viewport = ViewportElement::getViewport(); - if (viewport) + if (viewport) { p->trans.setGlobalScale(Vec2(viewport->getScaleX(), viewport->getScaleY())); - else + p->trans.setGlobalRotation(viewport->getRotation()); + } + else { p->trans.setGlobalScale(Vec2(1.0, 1.0)); + p->trans.setGlobalRotation(0); + } p->sceneRect.setSize(geo.rect.size()); p->sceneOrig = geo.orig; diff --git a/src/transform.h b/src/transform.h index ee69416..8fb4f57 100644 --- a/src/transform.h +++ b/src/transform.h @@ -43,15 +43,17 @@ // //////////////////////////////////////////////////////////// +// added global rotation and global scale, modified updateMatrix(), using SDL funcs instead of math.h #ifndef TRANSFORM_H #define TRANSFORM_H #include "etc-internal.h" -#include #include +constexpr float PI = 3.14159265358979323846f; + class Transform{ public: Transform() @@ -65,10 +67,12 @@ public: matrix[15] = 1; } - Vec2 &getPosition() { return position; } - Vec2 &getOrigin() { return origin; } - Vec2 &getScale() { return scale; } - float getRotation() { return rotation; } + Vec2 &getPosition() { return position; } + Vec2 &getOrigin() { return origin; } + Vec2 &getScale() { return scale; } + Vec2 &getGlobalScale() { return globalScale; } + float getRotation() { return rotation; } + float getGlobalRotation() { return globalRotation; } Vec2i getPositionI() const{ return Vec2i(position.x, position.y); @@ -98,6 +102,11 @@ public: dirty = true; } + void setGlobalRotation(float value){ + globalRotation = value; + dirty = true; + } + void setGlobalOffset(const Vec2i &value){ offset = value; dirty = true; @@ -119,33 +128,65 @@ public: private: void updateMatrix(){ - if (rotation >= 360 || rotation < -360) - rotation = (float) SDL_fmod(rotation, 360); - if (rotation < 0) - rotation += 360; - - float angle = rotation * 3.141592654f / 180.0f; - float cosine = (float) SDL_cos(angle); - float sine = (float) SDL_sin(angle); - float sxc = scale.x * cosine; - float syc = scale.y * cosine; - float sxs = scale.x * sine; - float sys = scale.y * sine; - float tx = (-origin.x * sxc - origin.y * sys + position.x) * globalScale.x + offset.x; - float ty = ( origin.x * sxs - origin.y * syc + position.y) * globalScale.y + offset.y; - - matrix[0] = sxc * globalScale.x; - matrix[1] = -sxs * globalScale.y; - matrix[4] = sys * globalScale.x; - matrix[5] = syc * globalScale.y; - matrix[12] = tx; - matrix[13] = ty; + if (rotation >= 360 || rotation < -360) + rotation = (float)SDL_fmod(rotation, 360); + + if (globalRotation >= 360 || globalRotation < -360) + globalRotation = (float)SDL_fmod(globalRotation, 360); + + // object rotation cos and sin + float angle = rotation * PI / 180.0f; + float cosine = SDL_cos(angle); + float sine = SDL_sin(angle); + + float sxc = scale.x * cosine; + float syc = scale.y * cosine; + float sxs = scale.x * sine; + float sys = scale.y * sine; + + // object matrix + float a = sxc * globalScale.x; + float b = -sxs * globalScale.y; + float c = sys * globalScale.x; + float d = syc * globalScale.y; + + float tx = (-origin.x * sxc - origin.y * sys + position.x) + * globalScale.x; + + float ty = ( origin.x * sxs - origin.y * syc + position.y) + * globalScale.y; + + // viewport rotation cos and sin + float globalAngle = globalRotation * PI / 180.0f; + float gc = SDL_cos(globalAngle); + float gs = SDL_sin(globalAngle); + + // basis rotation + float na = a * gc - b * gs; + float nb = a * gs + b * gc; + float nc = c * gc - d * gs; + float nd = c * gs + d * gc; + + float dx = tx; + float dy = ty; + + // appling global rotation + tx = dx * gc - dy * gs + offset.x; + ty = dx * gs + dy * gc + offset.y; + + matrix[0] = na; + matrix[1] = nb; + matrix[4] = nc; + matrix[5] = nd; + matrix[12] = tx; + matrix[13] = ty; } Vec2 position; Vec2 origin; Vec2 scale; float rotation; + float globalRotation; /* Silently added to position */ Vec2i offset; diff --git a/src/viewport.cpp b/src/viewport.cpp index a273464..456b4dc 100644 --- a/src/viewport.cpp +++ b/src/viewport.cpp @@ -46,6 +46,7 @@ struct ViewportPrivate{ double scaleX; double scaleY; + double rotation; EtcTemps tmp; @@ -56,6 +57,7 @@ struct ViewportPrivate{ tone(&tmp.tone), scaleX(1.0), scaleY(1.0), + rotation(0.0), isOnScreen(false) { rect->set(x, y, width, height); @@ -139,8 +141,9 @@ void Viewport::update(){ DEF_ATTR_RD_SIMPLE(Viewport, OX, int, geometry.orig.x) DEF_ATTR_RD_SIMPLE(Viewport, OY, int, geometry.orig.y) -DEF_ATTR_RD_SIMPLE(Viewport, ScaleX, double, p->scaleX) -DEF_ATTR_RD_SIMPLE(Viewport, ScaleY, double, p->scaleY) +DEF_ATTR_RD_SIMPLE(Viewport, ScaleX, double, p->scaleX) +DEF_ATTR_RD_SIMPLE(Viewport, ScaleY, double, p->scaleY) +DEF_ATTR_RD_SIMPLE(Viewport, Rotation, double, p->rotation) DEF_ATTR_SIMPLE(Viewport, Rect, Rect&, *p->rect) DEF_ATTR_SIMPLE(Viewport, Color, Color&, *p->color) @@ -186,6 +189,16 @@ void Viewport::setScaleY(double value){ notifyGeometryChange(); } +void Viewport::setRotation(double value){ + guardDisposed(); + + if (p->rotation == value) + return; + + p->rotation = value; + notifyGeometryChange(); +} + void Viewport::initDynAttribs(){ p->rect = new Rect(*p->rect); p->color = new Color; diff --git a/src/viewport.h b/src/viewport.h index b45e7f8..6484f49 100644 --- a/src/viewport.h +++ b/src/viewport.h @@ -38,13 +38,14 @@ public: void update(); - DECL_ATTR( Rect, Rect& ) - DECL_ATTR( OX, int ) - DECL_ATTR( OY, int ) - DECL_ATTR( ScaleX, double ) - DECL_ATTR( ScaleY, double ) - DECL_ATTR( Color, Color& ) - DECL_ATTR( Tone, Tone& ) + DECL_ATTR( Rect, Rect& ) + DECL_ATTR( OX, int ) + DECL_ATTR( OY, int ) + DECL_ATTR( ScaleX, double ) + DECL_ATTR( ScaleY, double ) + DECL_ATTR( Rotation, double ) + DECL_ATTR( Color, Color& ) + DECL_ATTR( Tone, Tone& ) void initDynAttribs(); From 792c5552505a460b1fae289dbdcfc1c47d2d9393 Mon Sep 17 00:00:00 2001 From: CatWindow Date: Sat, 15 Aug 2026 17:36:01 +0300 Subject: [PATCH 2/5] rotaaaaaaaaaations sdfkljhsgdjklljshkgdjhkl --- scripts/Scene_OF.rb | 68 +++++++++++++++++++++++++++++++-------------- 1 file changed, 47 insertions(+), 21 deletions(-) diff --git a/scripts/Scene_OF.rb b/scripts/Scene_OF.rb index fd029ba..0430a02 100644 --- a/scripts/Scene_OF.rb +++ b/scripts/Scene_OF.rb @@ -21,7 +21,7 @@ class Scene_OF HP_WIDTH = 400 HP_HEIGHT = 16 - MISS_TIME = 90 + MISS_TIME = 60 SPRITES = { :cat_base_arrow_left => Rect.new(0, 0, 32, 32), :cat_base_arrow_down => Rect.new(32, 0, 32, 32), :cat_base_arrow_up => Rect.new(64, 0, 32, 32), :cat_base_arrow_right => Rect.new(96, 0, 32, 32), @@ -91,9 +91,8 @@ class Scene_OF @miss_sound = Audio.create_sound("Audio/SE/shatter") @viewport_ui = Viewport.new(0, 0, Graphics.width, Graphics.height) - @viewport_arrows = Viewport.new(0, 0, Graphics.width, Graphics.height) - @viewport_ui.ox = @viewport_arrows.ox = -Graphics.width / 2 - @viewport_ui.oy = @viewport_arrows.oy = -Graphics.height / 2 + @viewport_ui.ox = -Graphics.width / 2 + @viewport_ui.oy = -Graphics.height / 2 @spritesheet = RPG::Cache.misc(".cats") @cat_flying_arrows = [] @@ -104,6 +103,7 @@ class Scene_OF @player_tails_end = [] @cat_arrows = [] @player_arrows = [] + @events = [] for i in 0..3 cat_arrow = Sprite.new(@viewport_ui) cat_arrow.bitmap = Bitmap.new(ARROW_SIZE, ARROW_SIZE) @@ -157,6 +157,9 @@ class Scene_OF @hp_icons.y = Graphics.height / 2 - ARROWS_SIDES_MARGIN + HP_HEIGHT / 2 - 6 @hp_icons.z = @hp_white.z + 1 + @rotate_power = 0 + @reverse = false; + self.hp = 50 @bst_debug = Sprite.new(@viewport_ui) @@ -199,6 +202,13 @@ class Scene_OF @miss_timeout -= 1 @voice_niko.volume = @miss_timeout <= 0 ? 1.0 : 0.0 + @events.each do |event| + if @total_time * ARROWS_SPEED >= event[1] + instance_exec(&event[0]) + @events.delete(event) + end + end + # fl studio b:s:t :3 beat = (@total_time / BPM_TIME / 2).to_i + 1 step = (@total_time / BPM_TIME * 15 / 2).to_i % 15 + 1 @@ -211,16 +221,17 @@ class Scene_OF @icons_bump_timeout -= 1 if @bump_timeout <= 0 @bump_timeout += BPM_TIME - @viewport_arrows.scale_y = @viewport_ui.scale_y = - @viewport_arrows.scale_x = @viewport_ui.scale_x = BUMP_SCALE + @viewport_ui.scale_y = @viewport_ui.scale_x = BUMP_SCALE end if @icons_bump_timeout <= 0 @icons_bump_timeout += BPM_TIME / 2.0 @hp_icons.zoom_x = @hp_icons.zoom_y = ICONS_BUMP_SCALE + @viewport_ui.rotation = @reverse ? -@rotate_power : @rotate_power + @reverse = !@reverse end - @viewport_arrows.scale_x = @viewport_ui.scale_x = - @viewport_arrows.scale_y = @viewport_ui.scale_y = @viewport_ui.scale_x * (1.0 - BUMP_RETURN_SPEED) + BUMP_RETURN_SPEED + @viewport_ui.scale_x = @viewport_ui.scale_y = @viewport_ui.scale_x * (1.0 - BUMP_RETURN_SPEED) + BUMP_RETURN_SPEED @hp_icons.zoom_x = @hp_icons.zoom_y = @hp_icons.zoom_x * (1.0 - ICONS_BUMP_RETURN_SPEED) + ICONS_BUMP_RETURN_SPEED + @viewport_ui.rotation = @viewport_ui.rotation * (1.0 - BUMP_RETURN_SPEED) # Cat Arrows i = 0 @@ -273,10 +284,6 @@ class Scene_OF arrow[0].dispose @player_flying_arrows.delete(arrow) i -= 1 - #elsif arrow[0].y < ARROW_SIZE * ARROW_SCALE - # arrow[0].dispose - # @player_flying_arrows.delete(arrow) - # i -= 1 end i += 1 end @@ -375,7 +382,7 @@ class Scene_OF arrow[0].dispose @player_flying_arrows.delete(arrow) self.hp += 5 - @miss_sound.stop + @miss_sound.fade_out(0.2) @miss_timeout = 0 else miss @@ -451,7 +458,6 @@ class Scene_OF arrow = make_arrow(dir, true) arrow.x = cat_arrow_x arrow.y = ARROWS_TOP_MARGIN - Graphics.height / 2 + bst2time(beat, step, tick) - 32 - arrow.z += 1 @cat_flying_arrows << [arrow, dir] @@ -475,7 +481,6 @@ class Scene_OF arrow = make_arrow(dir, false) arrow.x = player_arrow_x arrow.y = ARROWS_TOP_MARGIN - Graphics.height / 2 + bst2time(beat, step, tick) - 32 - arrow.z += 1 @player_flying_arrows << [arrow, dir] @@ -496,6 +501,10 @@ class Scene_OF end end + if line_data[7] != nil + @events << [line_data[7], bst2time(beat, step, tick)] + end + i += 1 end end @@ -505,26 +514,29 @@ class Scene_OF end def make_arrow(direction, meow) - arrow = Sprite.new(@viewport_arrows) + arrow = Sprite.new(@viewport_ui) arrow.bitmap = Bitmap.new(ARROW_SIZE, ARROW_SIZE) arrow.bitmap.stretch_blt(Rect.new(0, 0, ARROW_SIZE, ARROW_SIZE), @spritesheet, SPRITES[(meow ? CAT_ARROWS_SPRITES : PLAYER_ARROWS_SPRITES)[:target][direction]]) arrow.zoom_x = arrow.zoom_y = ARROW_SCALE + arrow.z = 20 arrow end def make_tail(direction, meow) - arrow = Sprite.new(@viewport_arrows) + arrow = Sprite.new(@viewport_ui) arrow.bitmap = Bitmap.new(ARROW_SIZE, ARROW_SIZE / 2) arrow.bitmap.stretch_blt(Rect.new(0, 0, ARROW_SIZE, ARROW_SIZE / 2), @spritesheet, SPRITES[(meow ? CAT_ARROWS_SPRITES : PLAYER_ARROWS_SPRITES)[:tail][direction]]) arrow.zoom_x = arrow.zoom_y = ARROW_SCALE + arrow.z = 18 arrow end def make_tail_end(direction, meow) - arrow = Sprite.new(@viewport_arrows) + arrow = Sprite.new(@viewport_ui) arrow.bitmap = Bitmap.new(ARROW_SIZE, ARROW_SIZE / 2) arrow.bitmap.stretch_blt(Rect.new(0, 0, ARROW_SIZE, ARROW_SIZE / 2), @spritesheet, SPRITES[(meow ? CAT_ARROWS_SPRITES : PLAYER_ARROWS_SPRITES)[:tail_end][direction]]) arrow.zoom_x = arrow.zoom_y = ARROW_SCALE + arrow.z = 19 arrow end @@ -535,7 +547,7 @@ class Scene_OF end SONG_MAPPING = [ # Length - # arrows, B, S, T, | B, S, T + # arrows, B, S, T, | B, S, T | proc ["# | ", 5, 1, 0, 0, 1, 0], [" # | ", 5, 3, 0, 0, 1, 0], [" # | ", 5, 5, 0, 0, 1, 0], @@ -589,7 +601,7 @@ class Scene_OF #[" |# ", 12, 16, 12], #[" |# ", 13, 1, 0], - ["# | ", 13, 1, 0], + ["# | ", 13, 1, 0, 0, 0, 0, proc { @rotate_power = 1 }], [" # | ", 13, 2, 0], [" # | ", 13, 3, 0], [" # | ", 13, 4, 0], @@ -694,7 +706,7 @@ class Scene_OF [" | # ", 20, 12, 0], [" | #", 20, 13, 0, 0, 1, 0], - [" # | ", 21, 1, 0], + [" # | ", 21, 1, 0, 0, 0, 0, proc { @rotate_power = 0 }], [" # | ", 21, 2, 0], ["# | ", 21, 3, 0], ["# # | ", 21, 5, 0], @@ -807,6 +819,20 @@ class Scene_OF [" ##| ", 36, 9, 0, 0, 1, 0], [" | # ", 36, 11, 0, 0, 1, 0], ["# #| #", 36, 13, 0, 0, 1, 0], + + [" #| #", 37, 1, 0, 0, 0, 0, proc { @rotate_power = 1 }], + [" # | # ", 37, 2, 0], + ["# |# ", 37, 3, 0], + [" # | # ", 37, 4, 0], + [" #| #", 37, 6, 0], + [" # | # ", 37, 7, 0], + [" # | # ", 37, 8, 0], + [" # | # ", 37, 9, 0], + [" #| #", 37, 10, 0], + [" # | # ", 37, 11, 0], + [" # | # ", 37, 12, 0], + [" #| #", 37, 13, 0, 0, 1, 0], + [" # | # ", 37, 15, 0], ] end From 3bef7945ac21832fcec003e3b0547a9e18825584 Mon Sep 17 00:00:00 2001 From: AnmiTaliDev Date: Sat, 15 Aug 2026 21:08:45 +0500 Subject: [PATCH 3/5] Fix GNOME wallpaper not visually updating in dark theme (picture-uri-dark) --- binding-mri/wallpaper-binding.cpp | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/binding-mri/wallpaper-binding.cpp b/binding-mri/wallpaper-binding.cpp index 2745a19..8bbddea 100644 --- a/binding-mri/wallpaper-binding.cpp +++ b/binding-mri/wallpaper-binding.cpp @@ -45,6 +45,8 @@ // GNOME settings static GSettings *bgsetting; static std::string defPictureURI, defPictureOptions, defPrimaryColor, defColorShading; + static std::string defPictureURIDark; + static bool hasPictureURIDark = false; // XFCE settings static XfconfChannel* bgchannel; static int defPictureStyle; @@ -70,6 +72,16 @@ #endif #ifdef unix_like + static bool gsettingsHasKey(GSettings *settings, const char *key){ + GSettingsSchema *schema = NULL; + g_object_get(settings, "settings-schema", &schema, NULL); + if (!schema) + return false; + bool has = g_settings_schema_has_key(schema, key); + g_settings_schema_unref(schema); + return has; + } + void desktopEnvironmentInit(){ printf("[desktopEnvironmentInit] desktopEnvironmentInit()\n"); if (desktop != "uninitialized") @@ -165,6 +177,9 @@ else if (desktop == "deepin") bgsetting = g_settings_new("com.deepin.wrap.gnome.desktop.background"); else bgsetting = g_settings_new("org.gnome.desktop.background"); defPictureURI = g_settings_get_string(bgsetting, "picture-uri"); + hasPictureURIDark = gsettingsHasKey(bgsetting, "picture-uri-dark"); + if (hasPictureURIDark) + defPictureURIDark = g_settings_get_string(bgsetting, "picture-uri-dark"); } else { bgsetting = g_settings_new("org.mate.background"); defPictureURI = g_settings_get_string(bgsetting, "picture-filename"); @@ -428,6 +443,8 @@ end: g_settings_set_string(bgsetting, "color-shading-type", "solid"); if (desktop == "cinnamon" || desktop == "gnome" || desktop == "deepin" || desktop == "budgie" || desktop == "pantheon") { g_settings_set_string(bgsetting, "picture-uri", ("file://" + gameDirStr + path).c_str()); + if (hasPictureURIDark) + g_settings_set_string(bgsetting, "picture-uri-dark", ("file://" + gameDirStr + path).c_str()); } else { g_settings_set_string(bgsetting, "picture-filename", (gameDirStr + path).c_str()); } @@ -596,6 +613,8 @@ RB_METHOD(wallpaperReset){ if (desktop == "cinnamon" || desktop == "gnome" || desktop == "mate" || desktop == "deepin" || desktop == "budgie" || desktop == "pantheon") { if (desktop == "cinnamon" || desktop == "gnome" || desktop == "deepin" || desktop == "budgie" || desktop == "pantheon") { g_settings_set_string(bgsetting, "picture-uri", defPictureURI.c_str()); + if (hasPictureURIDark) + g_settings_set_string(bgsetting, "picture-uri-dark", defPictureURIDark.c_str()); } else { g_settings_set_string(bgsetting, "picture-filename", defPictureURI.c_str()); } From ed29fe7912f5c135fd7f9a820d7a8bde91999473 Mon Sep 17 00:00:00 2001 From: niko Date: Sat, 15 Aug 2026 19:12:29 +0300 Subject: [PATCH 4/5] Update changelogs/0.1.2.txt --- changelogs/0.1.2.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/changelogs/0.1.2.txt b/changelogs/0.1.2.txt index 42a4028..14ae757 100644 --- a/changelogs/0.1.2.txt +++ b/changelogs/0.1.2.txt @@ -59,4 +59,4 @@ Rewrited audio system from SDL3_sound and OpenAL to SDL_mixer Added Master Volume setting Added viewports scaling Build script for Windows MinGW - +GNOME support fixed From d4e72e13c0a5be46a21b6079ea06cbe5c7500523 Mon Sep 17 00:00:00 2001 From: CatWindow Date: Sat, 15 Aug 2026 19:50:08 +0300 Subject: [PATCH 5/5] OFM: full chart --- scripts/Scene_OF.rb | 328 ++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 315 insertions(+), 13 deletions(-) diff --git a/scripts/Scene_OF.rb b/scripts/Scene_OF.rb index 0430a02..c7eda35 100644 --- a/scripts/Scene_OF.rb +++ b/scripts/Scene_OF.rb @@ -2,7 +2,7 @@ class Scene_OF BPM = 100 BPM_TIME = 1.0 / (BPM / 60.0) * Graphics.frame_rate * 2 - BUMP_SCALE = 1.07 + BUMP_SCALE = 1.04 BUMP_RETURN_SPEED = 0.1 ICONS_BUMP_SCALE = 1.17 ICONS_BUMP_RETURN_SPEED = 0.2 @@ -166,7 +166,8 @@ class Scene_OF @bst_debug.bitmap = Bitmap.new(300, 40) @total_time = 0 - @bump_timeout = 0 + @bump_timeout = 999999 + @bump_time = 999999 @icons_bump_timeout = 0 @miss_timeout = 0 @@ -220,7 +221,7 @@ class Scene_OF @bump_timeout -= 1 @icons_bump_timeout -= 1 if @bump_timeout <= 0 - @bump_timeout += BPM_TIME + @bump_timeout += @bump_time @viewport_ui.scale_y = @viewport_ui.scale_x = BUMP_SCALE end if @icons_bump_timeout <= 0 @@ -457,7 +458,7 @@ class Scene_OF if line_data[0][dir] == '#' arrow = make_arrow(dir, true) arrow.x = cat_arrow_x - arrow.y = ARROWS_TOP_MARGIN - Graphics.height / 2 + bst2time(beat, step, tick) - 32 + arrow.y = ARROWS_TOP_MARGIN - Graphics.height / 2 + bst2time(beat, step, tick) - 16 @cat_flying_arrows << [arrow, dir] @@ -480,7 +481,7 @@ class Scene_OF if line_data[0][dir + 5] == '#' arrow = make_arrow(dir, false) arrow.x = player_arrow_x - arrow.y = ARROWS_TOP_MARGIN - Graphics.height / 2 + bst2time(beat, step, tick) - 32 + arrow.y = ARROWS_TOP_MARGIN - Graphics.height / 2 + bst2time(beat, step, tick) - 16 @player_flying_arrows << [arrow, dir] @@ -548,7 +549,7 @@ class Scene_OF SONG_MAPPING = [ # Length # arrows, B, S, T, | B, S, T | proc - ["# | ", 5, 1, 0, 0, 1, 0], + ["# | ", 5, 1, 0, 0, 1, 0, proc { @bump_time = BPM_TIME * 2; @bump_timeout = 0 }], [" # | ", 5, 3, 0, 0, 1, 0], [" # | ", 5, 5, 0, 0, 1, 0], [" #| ", 5, 9, 0, 0, 1, 0], @@ -583,7 +584,7 @@ class Scene_OF [" | # ", 11, 1, 0, 0, 1, 0], [" | #", 11, 3, 0, 0, 1, 0], [" | # ", 11, 5, 0, 0, 1, 0], - [" |# ", 11, 9, 0, 0, 1, 0], + [" |# ", 11, 9, 0, 0, 1, 0, proc { @bump_time = BPM_TIME / 2; @bump_timeout = 0 }], [" |# ", 11, 13, 0, 0, 1, 0], [" |# ", 12, 1, 0, 0, 1, 0], [" | # ", 12, 3, 0, 0, 1, 0], @@ -591,17 +592,17 @@ class Scene_OF [" | # ", 12, 6, 0], [" | # ", 12, 7, 0], [" | # ", 12, 8, 0], - [" | # ", 12, 9, 0], + [" | # ", 12, 9, 0, 0, 0, 0, proc { @bump_time = BPM_TIME / 4; @bump_timeout = 0 }], [" | #", 12, 10, 0], [" | # ", 12, 11, 0, 0, 1, 0], - [" |# ", 12, 13, 0], + [" |# ", 12, 13, 0, 0, 0, 0, proc { @bump_time = BPM_TIME / 8; @bump_timeout = 0 }], [" |# ", 12, 15, 0], #[" |# ", 12, 15, 12], [" |# ", 12, 16, 0], #[" |# ", 12, 16, 12], #[" |# ", 13, 1, 0], - ["# | ", 13, 1, 0, 0, 0, 0, proc { @rotate_power = 1 }], + ["# | ", 13, 1, 0, 0, 0, 0, proc { @rotate_power = 1; @bump_time = BPM_TIME / 2; @bump_timeout = 0 }], [" # | ", 13, 2, 0], [" # | ", 13, 3, 0], [" # | ", 13, 4, 0], @@ -706,7 +707,7 @@ class Scene_OF [" | # ", 20, 12, 0], [" | #", 20, 13, 0, 0, 1, 0], - [" # | ", 21, 1, 0, 0, 0, 0, proc { @rotate_power = 0 }], + [" # | ", 21, 1, 0, 0, 0, 0, proc { @rotate_power = 0; @bump_time = BPM_TIME; @bump_timeout = 0 }], [" # | ", 21, 2, 0], ["# | ", 21, 3, 0], ["# # | ", 21, 5, 0], @@ -774,7 +775,7 @@ class Scene_OF [" |# #", 28, 11, 0], [" | ## ", 28, 13, 0], - ["# | ", 29, 1, 0, 0, 1, 0], + ["# | ", 29, 1, 0, 0, 1, 0, proc { @rotate_power = 0; @bump_time = 999999; @bump_timeout = 999999}], [" # | ", 29, 3, 0, 0, 1, 0], [" # | ", 29, 5, 0, 0, 1, 0], [" #| ", 29, 9, 0, 0, 1, 0], @@ -820,7 +821,7 @@ class Scene_OF [" | # ", 36, 11, 0, 0, 1, 0], ["# #| #", 36, 13, 0, 0, 1, 0], - [" #| #", 37, 1, 0, 0, 0, 0, proc { @rotate_power = 1 }], + [" #| #", 37, 1, 0, 0, 0, 0, proc { @rotate_power = 1; @bump_time = BPM_TIME / 2; @bump_timeout = 0}], [" # | # ", 37, 2, 0], ["# |# ", 37, 3, 0], [" # | # ", 37, 4, 0], @@ -833,6 +834,307 @@ class Scene_OF [" # | # ", 37, 12, 0], [" #| #", 37, 13, 0, 0, 1, 0], [" # | # ", 37, 15, 0], + [" #| #", 38, 1, 0], + ["# |# ", 38, 2, 0], + [" #| #", 38, 3, 0], + [" # | # ", 38, 4, 0], + ["# |# ", 38, 6, 0], + [" # | # ", 38, 7, 0], + [" #| #", 38, 8, 0], + [" # | # ", 38, 9, 0], + ["# |# ", 38, 10, 0], + [" # | # ", 38, 11, 0], + [" # | # ", 38, 12, 0], + [" #| #", 38, 13, 0, 0, 1, 0], + [" # | # ", 38, 15, 0], + ["# |# ", 39, 1, 0], + [" # | # ", 39, 2, 0], + [" # | # ", 39, 3, 0], + [" #| #", 39, 4, 0], + [" # | # ", 39, 6, 0], + ["# |# ", 39, 7, 0], + [" #| #", 39, 8, 0], + [" # | # ", 39, 9, 0], + ["# |# ", 39, 10, 0], + [" #| #", 39, 11, 0], + [" # | # ", 39, 12, 0], + ["# |# ", 39, 13, 0, 0, 1, 0], + [" # | # ", 39, 15, 0], + ["# |# ", 40, 1, 0], + [" # | # ", 40, 2, 0], + [" #| #", 40, 3, 0], + ["# |# ", 40, 4, 0], + [" #| #", 40, 6, 0], + [" # | # ", 40, 7, 0], + [" #| #", 40, 8, 0], + [" # | # ", 40, 9, 0], + [" # | # ", 40, 10, 0], + ["# |# ", 40, 11, 0], + [" # | # ", 40, 12, 0], + ["# |# ", 40, 13, 0, 0, 1, 0], + [" #| #", 40, 15, 0], + + [" #| #", 41, 1, 0], + [" # | # ", 41, 2, 0], + [" # | # ", 41, 3, 0], + ["# |# ", 41, 4, 0], + ["# |# ", 41, 6, 0], + [" # | # ", 41, 7, 0], + [" # | # ", 41, 8, 0], + [" #| #", 41, 9, 0, 0, 1, 0], + [" # | # ", 41, 11, 0, 0, 1, 0], + [" #| #", 41, 13, 0, 0, 1, 0], + [" # | # ", 41, 15, 0, 0, 1, 0], + [" #| #", 42, 1, 0], + [" # | # ", 42, 2, 0], + [" # | # ", 42, 3, 0], + ["# |# ", 42, 4, 0], + [" #| #", 42, 6, 0], + [" # | # ", 42, 7, 0], + [" # | # ", 42, 8, 0], + [" # | # ", 42, 9, 0, 0, 1, 0], + ["# |# ", 42, 11, 0, 0, 1, 0], + [" # | # ", 42, 13, 0, 0, 1, 0], + ["# |# ", 42, 15, 0, 0, 1, 0], + [" # | # ", 43, 1, 0], + ["# |# ", 43, 2, 0], + [" #| #", 43, 3, 0], + [" # | # ", 43, 4, 0], + [" # | # ", 43, 6, 0], + [" # | # ", 43, 7, 0], + [" #| #", 43, 8, 0], + [" # | # ", 43, 9, 0, 0, 1, 0], + [" # | # ", 43, 11, 0, 0, 1, 0], + [" # | # ", 43, 13, 0, 0, 1, 0], + [" # | # ", 43, 15, 0, 0, 1, 0], + ["# |# ", 44, 1, 0], + [" # | # ", 44, 2, 0], + [" # | # ", 44, 3, 0], + [" #| #", 44, 4, 0], + [" # | # ", 44, 6, 0], + [" # | # ", 44, 7, 0], + [" # | # ", 44, 8, 0], + [" #| #", 44, 9, 0, 0, 1, 0], + ["# |# ", 44, 11, 0, 0, 1, 0], + [" #| #", 44, 13, 0, 0, 1, 0], + ["# |# ", 44, 15, 0, 0, 1, 0], + + [" #| #", 45, 1, 0, 0, 0, 0, proc { @rotate_power = 0; @bump_time = 9999999 }], + [" | # ", 45, 3, 0], + [" | # ", 45, 5, 0], + ["# |# ", 45, 9, 0], + [" | # ", 45, 11, 0], + [" # | # ", 45, 13, 0], + [" #| #", 46, 1, 0], + [" |# ", 46, 3, 0], + [" | # ", 46, 5, 0], + [" #| #", 46, 9, 0], + [" | # ", 46, 11, 0], + [" # | # ", 46, 13, 0], + [" # | # ", 47, 1, 0], + [" | # ", 47, 3, 0], + [" |# ", 47, 5, 0], + [" #| #", 47, 9, 0], + [" | # ", 47, 11, 0], + [" # | # ", 47, 13, 0], + [" # | # ", 48, 1, 0], + [" |# ", 48, 3, 0], + [" | # ", 48, 5, 0], + [" #| #", 48, 9, 0], + [" | # ", 48, 11, 0], + ["# |# ", 48, 13, 0], + + [" #| ", 49, 1, 0, 0, 0, 0, proc { @rotate_power = 0; @bump_time = BPM_TIME; @bump_timeout = 0 }], + [" # | ", 49, 3, 0], + ["# | ", 49, 5, 0], + [" # | ", 49, 7, 0], + ["# | ", 49, 9, 0], + [" # | ", 49, 11, 0], + ["# | ", 49, 13, 0], + [" #| ", 50, 1, 0], + [" # | ", 50, 3, 0], + [" # | ", 50, 5, 0], + [" #| ", 50, 7, 0], + [" # | ", 50, 9, 0], + ["# | ", 50, 11, 0], + [" # | ", 50, 13, 0], + ["# | ", 51, 1, 0], + [" # | ", 51, 3, 0], + [" # | ", 51, 5, 0], + [" #| ", 51, 7, 0], + [" # | ", 51, 9, 0], + [" #| ", 51, 11, 0], + ["# | ", 51, 13, 0], + [" #| ", 52, 1, 0], + ["# | ", 52, 3, 0], + [" # | ", 52, 5, 0], + ["# | ", 52, 7, 0], + [" # | ", 52, 9, 0], + [" # | ", 52, 11, 0], + ["# | ", 52, 13, 0], + + [" | #", 53, 1, 0], + [" | # ", 53, 3, 0], + [" |# ", 53, 5, 0], + [" | # ", 53, 7, 0], + [" |# ", 53, 9, 0], + [" | # ", 53, 11, 0], + [" |# ", 53, 13, 0], + [" | #", 54, 1, 0], + [" | # ", 54, 3, 0], + [" | # ", 54, 5, 0], + [" | #", 54, 7, 0], + [" | # ", 54, 9, 0], + [" |# ", 54, 11, 0], + [" | # ", 54, 13, 0], + [" |# ", 55, 1, 0], + [" | # ", 55, 3, 0], + [" | # ", 55, 5, 0], + [" | #", 55, 7, 0], + [" | # ", 55, 9, 0], + [" | #", 55, 11, 0], + [" |# ", 55, 13, 0], + [" | #", 56, 1, 0], + [" |# ", 56, 3, 0], + [" | # ", 56, 5, 0], + [" |# ", 56, 7, 0], + [" ## | ## ", 56, 9, 0, 0, 2, 0, proc {@bump_time = BPM_TIME / 8; @bump_timeout = 0 }], + ["# #|# #", 56, 13, 0, 0, 2, 0, proc {@bump_time = BPM_TIME / 4; @bump_timeout = 0 }], + + ["# | ", 57, 1, 0, 0, 0, 0, proc { @rotate_power = 1; @bump_time = BPM_TIME / 2; @bump_timeout = 0 }], + [" # | ", 57, 2, 0], + [" # | ", 57, 3, 0], + [" # | ", 57, 4, 0], + ["# | ", 57, 5, 0, 0, 1, 0], + [" #| ", 57, 7, 0], + ["# | ", 57, 8, 0], + [" # | ", 57, 9, 0], + ["# | ", 57, 10, 0], + [" # | ", 57, 11, 0], + [" #| ", 57, 12, 0], + [" # | ", 57, 13, 0, 0, 1, 0], + [" # | ", 57, 15, 0], + [" #| ", 58, 1, 0], + [" # | ", 58, 2, 0], + ["# | ", 58, 3, 0], + [" # | ", 58, 4, 0], + ["# | ", 58, 5, 0, 0, 1, 0], + [" # | ", 58, 7, 0], + ["# | ", 58, 8, 0], + [" # | ", 58, 9, 0], + [" #| ", 58, 10, 0], + [" # | ", 58, 11, 0], + [" #| ", 58, 12, 0], + [" # | ", 58, 13, 0, 0, 1, 0], + ["# | ", 58, 15, 0], + [" # | ", 59, 1, 0], + [" #| ", 59, 2, 0], + [" # | ", 59, 3, 0], + ["# | ", 59, 4, 0], + ["# | ", 59, 5, 0, 0, 1, 0], + [" # | ", 59, 7, 0], + [" #| ", 59, 8, 0], + [" # | ", 59, 9, 0], + [" # | ", 59, 10, 0], + [" # | ", 59, 11, 0], + [" # | ", 59, 12, 0], + [" #| ", 59, 13, 0, 0, 1, 0], + ["# | ", 59, 15, 0, 0, 1, 0], + [" #| ", 60, 1, 0], + [" # | ", 60, 2, 0], + [" # | ", 60, 3, 0], + ["# | ", 60, 4, 0], + [" # | ", 60, 5, 0], + [" # | ", 60, 7, 0], + [" # | ", 60, 8, 0], + ["# | ", 60, 9, 0], + [" #| ", 60, 10, 0], + [" # | ", 60, 11, 0], + [" # | ", 60, 12, 0], + [" #| ", 60, 13, 0, 0, 1, 0], + [" #| ", 60, 15, 0, 0, 1, 0], + + [" |# ", 61, 1, 0], + [" | # ", 61, 2, 0], + [" | # ", 61, 3, 0], + [" | # ", 61, 4, 0], + [" |# ", 61, 5, 0, 0, 1, 0], + [" | #", 61, 7, 0], + [" |# ", 61, 8, 0], + [" | # ", 61, 9, 0], + [" |# ", 61, 10, 0], + [" | # ", 61, 11, 0], + [" | #", 61, 12, 0], + [" | # ", 61, 13, 0, 0, 1, 0], + [" | # ", 61, 15, 0], + [" | #", 62, 1, 0], + [" | # ", 62, 2, 0], + [" |# ", 62, 3, 0], + [" | # ", 62, 4, 0], + [" |# ", 62, 5, 0, 0, 1, 0], + [" | # ", 62, 7, 0], + [" |# ", 62, 8, 0], + [" | # ", 62, 9, 0], + [" | #", 62, 10, 0], + [" | # ", 62, 11, 0], + [" | #", 62, 12, 0], + [" | # ", 62, 13, 0, 0, 1, 0], + [" |# ", 62, 15, 0], + [" | # ", 63, 1, 0], + [" | #", 63, 2, 0], + [" | # ", 63, 3, 0], + [" |# ", 63, 4, 0], + [" |# ", 63, 5, 0, 0, 1, 0], + [" | # ", 63, 7, 0], + [" | #", 63, 8, 0], + [" | # ", 63, 9, 0], + [" | # ", 63, 10, 0], + [" | # ", 63, 11, 0], + [" | # ", 63, 12, 0], + [" | #", 63, 13, 0, 0, 1, 0], + [" |# ", 63, 15, 0, 0, 1, 0], + [" | #", 64, 1, 0], + [" | # ", 64, 2, 0], + [" | # ", 64, 3, 0], + [" |# ", 64, 4, 0], + [" | # ", 64, 5, 0, 0, 1, 0], + [" | # ", 64, 7, 0], + [" | # ", 64, 8, 0], + [" |# ", 64, 9, 0], + [" | #", 64, 10, 0], + [" | # ", 64, 11, 0], + [" | # ", 64, 12, 0], + [" | #", 64, 13, 0, 0, 1, 0], + [" | #", 64, 15, 0, 0, 1, 0], + + [" # | # ", 65, 1, 0, 0, 1, 0, proc { @rotate_power = 0; @bump_time = 9999999; @bump_timeout = 9999999 }], + [" #| #", 65, 3, 0], + [" # | # ", 65, 6, 0], + [" # | # ", 65, 7, 0, 0, 1, 0], + [" #| #", 65, 9, 0, 0, 1, 0], + ["# |# ", 65, 11, 0, 0, 1, 0], + [" #| #", 65, 13, 0, 0, 1, 0], + [" #| #", 66, 1, 0, 0, 1, 0], + [" # | # ", 66, 3, 0], + [" # | # ", 66, 5, 0], + ["# |# ", 66, 6, 0, 0, 1, 0], + [" #| #", 66, 8, 0, 0, 1, 0], + [" # | # ", 66, 11, 0, 0, 1, 0], + [" # | # ", 66, 13, 0, 0, 1, 0], + [" # | # ", 67, 1, 0, 0, 1, 0], + [" #| #", 67, 3, 0], + [" # | # ", 67, 6, 0], + [" # | # ", 67, 7, 0, 0, 1, 0], + [" #| #", 67, 9, 0, 0, 1, 0], + ["# |# ", 67, 11, 0, 0, 1, 0], + [" #| #", 67, 13, 0, 0, 1, 0], + ["# |# ", 68, 1, 0, 0, 1, 0], + [" #| #", 68, 3, 0], + ["# |# ", 68, 5, 0], + [" # | # ", 68, 6, 0, 0, 1, 0], + [" #| #", 68, 8, 0, 0, 1, 0], + [" #| #", 68, 11, 0, 0, 1, 0], + ["# |# ", 68, 13, 0, 0, 1, 0], ] end