145 lines
8.7 KiB
Lua
145 lines
8.7 KiB
Lua
-- YataiDON-HSS override of PyTaikoGreen/global/allnet_indicator.lua
|
|
-- ROUND 6 (LUA_CAPABILITIES item 43) — boot-loading chrome.
|
|
--
|
|
-- `AllNetIcon:draw` is the last Lua call on LOADING (loading.cpp: black fill, progress-bar
|
|
-- track + fill, KIDOU::WARNING, white fade, allnet_indicator.draw), so it is the skin's only
|
|
-- paint hook on the boot screen.
|
|
--
|
|
-- Arcade reference: lumen attract/notice, `notice_instance_0` at (959.7,542.4) —
|
|
-- d0 8x8 black stretched 240x135 -> 1920x1080 backdrop (engine: DrawRectangle BLACK)
|
|
-- d1 NOTICE board 846x886 @ (0,-46) -> top-left (536.7, 53.4) (kidou/warning)
|
|
-- d2 8x8 #650000 stretched 115.47x5 -> a 923.7x40 track @ (497.9, 977.1)
|
|
-- d3 8x8 #ff0000 stretched 0.50x5 -> the fill, left-anchored at x 494.7, growing to 923.7
|
|
-- d4/d5 two 62x49.5 black caps at the ends of the track (invisible on black)
|
|
-- d6 8x8 white stretched 240x135, alpha 0 -> the fade-out (engine: Fade(WHITE, …))
|
|
-- The engine already copies the arcade's exact colours (101,0,0 / RED) and the white fade;
|
|
-- what it cannot match from a skin is the GEOMETRY: `progress_bar_*` in LoadingScreen::
|
|
-- on_screen_start is derived from the screen metrics (0.43*W x 50*scale at y = 0.85*H =
|
|
-- 825.6x75 @ (547.2, 918)) and `progress` has no Lua binding, so the bar cannot be redrawn
|
|
-- here. Its top edge (918) lands 11 px inside the last NOTICE line (ink bottom 929 with the
|
|
-- arcade board position restored in kidou/texture.json), so the board is simply re-drawn on
|
|
-- top from here — in the arcade the two never overlap (board ends 939.4, track starts 977.1),
|
|
-- so the stacking is unobservable there and this restores the readable result.
|
|
--
|
|
-- The ALL.Net icon itself is skipped on LOADING: the arcade boot notice screen carries no
|
|
-- overlay at all, and the engine draws this icon AFTER its white fade-out, so it would
|
|
-- otherwise hang in front of the full-white flash into the title screen.
|
|
AllNetIcon = {}
|
|
AllNetIcon.__index = AllNetIcon
|
|
|
|
function AllNetIcon.new(online)
|
|
local self = setmetatable({}, AllNetIcon)
|
|
self.online = online
|
|
self.indicator = tex.load_texture("global/overlay/allnet_indicator")
|
|
return self
|
|
end
|
|
|
|
function AllNetIcon:update(current_ms, online)
|
|
self.online = online
|
|
end
|
|
|
|
-- ROUND 9 - 「M曲」 on the gameplay plate (LUA_CAPABILITIES items 5 / 17 / 18).
|
|
-- `song_info.nulm` ET 9 `text_song_max` is a 110x40 box centred (1814,122),
|
|
-- font 24 / outline 3.0 / centre-aligned, cross-fading with the genre plate on
|
|
-- the same timeline as 「N曲目」 (root MC 15 `song_number` cmul 12). The engine
|
|
-- draws the 「N曲目」 half itself (SongNum at song_num_game) but had no value
|
|
-- for the total; `tex.song_limit()` is the new binding that supplies it.
|
|
-- allnet_indicator is the last Lua paint hook on GAME (game.cpp draw_overlay),
|
|
-- which is why this lives here and not in background.lua (draw_fore runs before
|
|
-- song_info.draw). The engine now also raises global_data.in_transition for
|
|
-- these frames while the song-loading transition is still on screen, so the
|
|
-- plate text does not float over the rainbow.
|
|
local SONG_MAX_CX, SONG_MAX_CY = 1814, 122
|
|
-- ROUND 16 (r16-outline): the record's border 3.0 is already in 1080p stage px,
|
|
-- and OutlinedText multiplies the thickness it is given by screen_scale (1.5),
|
|
-- so the value to pass is border / screen_scale. This used to pass 3 and draw a
|
|
-- 4.5 px ring. (`tex.get_screen_scale` is read lazily, at first draw.)
|
|
local SONG_MAX_FONT, SONG_MAX_BORDER = 24, 3.0
|
|
|
|
function AllNetIcon:draw_song_max()
|
|
if not tex.song_limit then return end
|
|
local limit = tex.song_limit()
|
|
if not limit or limit <= 0 then return end
|
|
if self._song_max_n ~= limit then
|
|
self._song_max = text.create_raw_text(tostring(limit) .. "曲",
|
|
SONG_MAX_FONT, { 255, 255, 255, 255 }, { 0, 0, 0, 255 }, false, SONG_MAX_BORDER / tex.get_screen_scale(), 2.0)
|
|
self._song_max_n = limit
|
|
end
|
|
local t = self._song_max
|
|
if not t then return end
|
|
-- animation id 3 is the genre <-> song-number cross-fade SongInfo drives;
|
|
-- reading the same live object keeps both halves of the plate in step.
|
|
if not self._plate_fade then self._plate_fade = tex.get_animation(3, false) end
|
|
local fade = self._plate_fade and self._plate_fade.attribute or 1.0
|
|
if fade <= 0 then return end
|
|
-- ROUND 11 (text sharpness): snap to whole pixels. OutlinedText is a rasterised
|
|
-- texture drawn 1:1 with BILINEAR filtering, so an odd-width label centred on an
|
|
-- integer lands on a .5 and every texel gets blended 50/50 with its neighbour
|
|
-- (+34..69 % edge width, measured — see Graphics/song_select/MAPPING.md ROUND 11).
|
|
t:draw({ x = math.floor(SONG_MAX_CX - (t.width - 2.0) / 2 + 0.5),
|
|
y = math.floor(SONG_MAX_CY - t.height / 2 + 0.5), fade = fade })
|
|
end
|
|
|
|
function AllNetIcon:draw(x, y)
|
|
local screen = tex.current_screen and tex.current_screen() or ""
|
|
-- ROUND 71 (r71-dan-skip-popup): GAME_DAN joins GAME here.
|
|
--
|
|
-- The 段位道場 skip fired with no on-screen cue at all, while the ordinary
|
|
-- enso showed the whole card/numeral/dim/banner. Nothing was missing from
|
|
-- the pipeline -- DanGameScreen::update_skip_dan() already calls the
|
|
-- inherited push_skip_state() (game_dan.cpp:1299), which feeds
|
|
-- Background:handle_skip -> self.enso_skip, and DanGameScreen builds a real
|
|
-- Background ("DAN", game_dan.cpp:108) whose constructor publishes
|
|
-- _G.g_active_enso_skip. The ONLY thing dan mode never did was DRAW it:
|
|
-- this hook was gated on `screen == "GAME"`, so GAME_DAN fell through to
|
|
-- the bare-indicator tail below and the popup was updated every frame and
|
|
-- painted never.
|
|
--
|
|
-- The cabinet does show it, and shows the SAME asset -- this is not an
|
|
-- inference from "the trigger is shared". `datatable/enso_post.bin` (the reference build,
|
|
-- tlb decode_datatable.py) is the per-mode placement table; its dojo set is
|
|
-- `target 2` (the set carrying donbg_dojo_1p, dani_enso*, and ROUND 69's
|
|
-- dani_enso_between), and that set contains
|
|
-- part 30 lumen/000_default/enso_normal/enso/information/skip.nulstb
|
|
-- x = 0, y = 0, playerNo = 0
|
|
-- byte-for-byte the same row as the normal-enso set (`target 0`), pointing
|
|
-- at the same enso_normal clip -- there is no enso_dani/.../skip.nulm on
|
|
-- the cabinet at all, only this one. In target 2 it is the LAST row in the
|
|
-- list, i.e. topmost, and in particular it is placed AFTER
|
|
-- `dani_enso_between` (part 38), so the popup draws OVER the between-song
|
|
-- fusuma exactly as it does here.
|
|
if screen == "GAME" or screen == "GAME_DAN" then
|
|
-- The song-number plate belongs to GAME's own song_info cross-fade;
|
|
-- GAME_DAN's header is ROUND 70's and is deliberately left alone.
|
|
if screen == "GAME" and not (tex.in_transition and tex.in_transition()) then
|
|
self:draw_song_max()
|
|
end
|
|
local frame = self.online and 2 or 0
|
|
tex.draw_texture(self.indicator, { frame = frame, x = x, y = y })
|
|
-- ROUND 19 (r19-skip2): 演奏スキップ's card/dim/banner, published on the
|
|
-- shared globals table by background.lua (self.enso_skip). Drawn from
|
|
-- here, the last Lua paint hook on GAME (and, via GameScreen::draw_overlay,
|
|
-- on GAME_DAN too -- game_dan.cpp:1178 calls the inherited overlay), so it
|
|
-- lands after song_info and the gauge and under the outgoing
|
|
-- result_transition -- see the citation at Background.new in
|
|
-- Scripts/background/background.lua for why this hook and not draw_fore.
|
|
if _G.g_active_enso_skip then _G.g_active_enso_skip:draw() end
|
|
return
|
|
end
|
|
if screen == "LOADING" then
|
|
-- ROUND 15 (r15-audit-global): this used to re-draw `loading/kidou/warning` here, to lift
|
|
-- the NOTICE board back over the engine's progress bar, whose top edge (918) cut 11 px
|
|
-- into the last line of text. The bar now sits where the cabinet puts it
|
|
-- (`loading_progress_bar` = 924x40 @ (498,977), from `attract/notice` depth 2), so the two
|
|
-- no longer overlap -- board ends 939, track starts 977, exactly as on the cabinet.
|
|
-- Removing the re-draw also fixes a defect it introduced: `LoadingScreen::draw` runs this
|
|
-- hook AFTER its white fade-out, so the re-drawn board stayed at full opacity while the
|
|
-- rest of the screen whitened into TITLE.
|
|
-- The ALL.Net icon is still deliberately not drawn: the arcade boot notice screen carries
|
|
-- no overlay at all.
|
|
return
|
|
end
|
|
local frame = self.online and 2 or 0
|
|
tex.draw_texture(self.indicator, { frame = frame, x = x, y = y })
|
|
end
|