169 lines
5.5 KiB
Plaintext
169 lines
5.5 KiB
Plaintext
|
local common = animation_common
|
||
|
|
||
|
valid_anims = {}
|
||
|
local mutate_anim = animation_common.mutate_anim
|
||
|
function animation_common.mutate_anim(anm_table, anm_suffix, section)
|
||
|
table.insert(valid_anims, anm_suffix)
|
||
|
return mutate_anim(anm_table, anm_suffix, section)
|
||
|
end
|
||
|
|
||
|
transitions = {
|
||
|
}
|
||
|
|
||
|
function add_strict_transition(hud_section, start_anm, end_anm, transition_anm)
|
||
|
if not (hud_section and start_anm and end_anm and transition_anm) then
|
||
|
printf("[ERROR] aol_anim_transitions: Could not add new transition (a parameter was nil)")
|
||
|
return
|
||
|
end
|
||
|
|
||
|
-- Make sure transitions is properly set as a table of tables
|
||
|
transitions[hud_section] = transitions[hud_section] or {}
|
||
|
transitions[hud_section][start_anm] = transitions[hud_section][start_anm] or {}
|
||
|
|
||
|
transitions[hud_section][start_anm][end_anm] = transition_anm
|
||
|
end
|
||
|
|
||
|
pattern_transitions = {
|
||
|
}
|
||
|
|
||
|
function add_pattern_transition(hud_section, start_anm, end_anm, transition_anm, priority)
|
||
|
priority = priority or 25565
|
||
|
if not (hud_section and start_anm and end_anm and transition_anm) then
|
||
|
printf("[ERROR] aol_anim_transitions: Could not add new transition (a parameter was nil)")
|
||
|
return
|
||
|
end
|
||
|
|
||
|
pattern_transitions[hud_section] = pattern_transitions[hud_section] or {}
|
||
|
table.insert(pattern_transitions[hud_section], {
|
||
|
["start_anm"] = start_anm,
|
||
|
["end_anm"] = end_anm,
|
||
|
["transition_anm"] = transition_anm,
|
||
|
["priority"] = priority
|
||
|
})
|
||
|
end
|
||
|
|
||
|
local ini_items = ini_file("system.ltx")
|
||
|
local function itr(section)
|
||
|
local is_hud_section = section:match('_hud$')
|
||
|
if is_hud_section then
|
||
|
local line_count = ini_items:line_count(section)
|
||
|
for i=0,line_count-1 do
|
||
|
local result, id, value = ini_items:r_line_ex(section,i,"","")
|
||
|
|
||
|
local is_strict_transition = id:match("^ts_strict_")
|
||
|
if is_strict_transition then
|
||
|
local anm_names = str_explode(value,",")
|
||
|
add_strict_transition(section, anm_names[1], anm_names[2], anm_names[3])
|
||
|
end
|
||
|
|
||
|
local is_pattern_transition = id:match("^ts_pattern_")
|
||
|
if is_pattern_transition then
|
||
|
local anm_names = str_explode(value,",")
|
||
|
add_pattern_transition(section, anm_names[1], anm_names[2], anm_names[3], anm_names[4])
|
||
|
end
|
||
|
end
|
||
|
end
|
||
|
return false
|
||
|
end
|
||
|
ini_items:section_for_each(itr)
|
||
|
table.sort(pattern_transitions, function(a,b) return a["priority"] < b["priority"] end)
|
||
|
|
||
|
local previous_anms = {}
|
||
|
|
||
|
function set_strict_transition(anm_table, hud_section)
|
||
|
-- Make sure item has transitions
|
||
|
local item_transitions = transitions[hud_section]
|
||
|
if not (item_transitions) then
|
||
|
-- previous_anms[hud_section] = anm_table.anm_name
|
||
|
return false
|
||
|
end
|
||
|
|
||
|
-- Make sure there is a previous anm to check
|
||
|
local start_anm = previous_anms[hud_section]
|
||
|
if not start_anm then
|
||
|
-- previous_anms[hud_section] = anm_table.anm_name
|
||
|
return false
|
||
|
end
|
||
|
|
||
|
-- Get transition anm from table
|
||
|
local end_anm = anm_table.anm_name
|
||
|
local transition_anm = item_transitions[start_anm] and item_transitions[start_anm][end_anm]
|
||
|
if not (transition_anm) then
|
||
|
-- previous_anms[hud_section] = anm_table.anm_name
|
||
|
return false
|
||
|
end
|
||
|
|
||
|
-- Re-add valid suffixes from previous mutations
|
||
|
for i, anm_suffix in ipairs(valid_anims) do
|
||
|
if animation_common.has_animation(hud_section, transition_anm .. anm_suffix) then
|
||
|
transition_anm = transition_anm .. anm_suffix
|
||
|
end
|
||
|
end
|
||
|
|
||
|
anm_table.anm_name = transition_anm
|
||
|
return true
|
||
|
end
|
||
|
|
||
|
function set_pattern_transition(anm_table, hud_section)
|
||
|
-- Make sure item has transitions
|
||
|
local item_transitions = pattern_transitions[hud_section]
|
||
|
if not item_transitions then
|
||
|
return false
|
||
|
end
|
||
|
|
||
|
-- Make sure there is a previous anm to check
|
||
|
local start_anm = previous_anms[hud_section]
|
||
|
if not start_anm then
|
||
|
-- previous_anms[hud_section] = anm_table.anm_name
|
||
|
return false
|
||
|
end
|
||
|
|
||
|
|
||
|
local end_anm = anm_table.anm_name
|
||
|
for _, transition in ipairs(item_transitions) do
|
||
|
local transition_anm = transition["transition_anm"]
|
||
|
-- Re-add valid suffixes from previous mutations
|
||
|
for i, anm_suffix in ipairs(valid_anims) do
|
||
|
if animation_common.has_animation(hud_section, transition_anm .. anm_suffix) then
|
||
|
transition_anm = transition_anm .. anm_suffix
|
||
|
end
|
||
|
end
|
||
|
|
||
|
if end_anm:match(transition["end_anm"]) and
|
||
|
start_anm:match(transition["start_anm"]) and
|
||
|
start_anm ~= transition_anm and
|
||
|
end_anm ~= transition_anm and
|
||
|
start_anm ~= end_anm then
|
||
|
|
||
|
anm_table.anm_name = transition_anm
|
||
|
return true
|
||
|
end
|
||
|
end
|
||
|
return false
|
||
|
end
|
||
|
|
||
|
function anm_transitions(anm_table, item)
|
||
|
-- printf("ITEM: " .. item:section() .. " | ANM: " .. anm_table.anm_name)
|
||
|
local hud_section = SYS_GetParam(0, item:section(), "hud", nil)
|
||
|
if not hud_section then
|
||
|
return
|
||
|
end
|
||
|
|
||
|
local has_strict_transition = set_strict_transition(anm_table, hud_section)
|
||
|
|
||
|
if not has_strict_transition then
|
||
|
set_pattern_transition(anm_table, hud_section)
|
||
|
end
|
||
|
|
||
|
-- Track now playing animation
|
||
|
previous_anms[hud_section] = anm_table.anm_name
|
||
|
|
||
|
-- Clear valid anims
|
||
|
valid_anims = {}
|
||
|
|
||
|
-- printf("ITEM: " .. item:section() .. " | ANM: " .. anm_table.anm_name)
|
||
|
end
|
||
|
|
||
|
function on_game_start()
|
||
|
common.add_anim_mutator(anm_transitions, 999)
|
||
|
end
|