-- scene size and placement definition
local scenes = require("Module:SceneBuilder/data")
local scene = {}
function scene.CreateSceneTable(template)
-- function for concatenating the sprite file name with it's file extension inside a {{filepath:}} wikitext in original format, can be adjusted from here to accept more file extension or remove format
function scene.file_path(name)
if name == "" then
return ""
else
return template:callParserFunction{ name = 'filepath', args = name..".gif"}
--"[[File:"..name..".gif|link="..name.."]]";
--does not expand ("{{filepath:"..name..".gif}}&format=original";)
end
end
function scene.file_url(name)
if name == "" then
return ""
else
return "https://tibia.fandom.com/wiki/Special:Redirect/file/"..name:gsub(" ", "_")..".gif";
end
end
-- function for splitting missile distance string, apparently lua doesnt have a built in split
function scene.split(str, delimiter)
local result = {};
for slice in string.gmatch(str..delimiter,"(.-)"..delimiter) do
table.insert(result, slice);
end
return result
end
--------
-- default values set via the template
--------
scene_name = template.args["spell"]
margin = template.args["edge_size"]
tile = template.args["background"]
effect = template.args["effect"]
effect_2 =template.args["effect_2"]
caster = template.args["caster"]
caster_name = template.args["caster_name"]
direction = template.args["look_direction"]
casting_effect = template.args["casting_effect"]
effect_on_caster = template.args["effect_on_caster"]
target = template.args["target"]
effect_on_target = template.args["effect_on_target"]
damage_effect = template.args["damage_effect"]
missile = template.args["missile"]
missile_direction = template.args["missile_direction"]
missile_distance = scene.split(template.args["missile_distance"],"/")
sprite_1 = template.args["sprite_1"]
sprite_2 = template.args["sprite_2"]
sprite_3 = template.args["sprite_3"]
rotate90 = template.args["rotate90"]
--------
-- effect on caster
if effect_on_caster == "yes" then effect_on_caster = "" else effect_on_caster = "display:none;" end
if missile_distance == "" then missile_distance = scene.split(template.args["missile_distance"],"/") end
-- missile distance
local missile_horiz = tostring(tonumber(missile_distance[1])*100)
local missile_vert = tostring(tonumber(missile_distance[2])*100)
math.randomseed(os.time())
local melee_missiles_types = {
"Throwing Sword Missile",
"Throwing Axe Missile",
"Throwing Club Missile"
}
local melee_missile = melee_missiles_types[math.random(1, #melee_missiles_types)]
-- melee missile sprite
if missile == "melee" then missile = melee_missile end
-- missile sprite frame direction definition to class name for animation
local missile_frames = {
["north-west"] ="0",
["north"]="1",
["north-east"]="2",
["east"]="3",
["south-east"]="4",
["south"]="5",
["south-west"]="6",
["west"]="7"
}
-- table elements definitions
local table_open = "<table class=\"scene_table ".. tile.."\" cellspacing=\"0\" style=\"padding:"..margin.."px;\">\n<tr>\n"
local missile_element =
"\t<div class=\"missile_area\" style=\"width:".. missile_horiz.."%;height:"..missile_vert.."%;\">\n"..
"\t<div style=\"position:relative;padding:0;width: 32px;height: 32px;z-index:2;animation:"..missile_direction.." 1s infinite;\">\n"..
"\t<div class=\"sprite\">"..scene.file_path(missile).."&frame="..missile_frames[missile_direction].."</div>\n".."</div>\n</div>"
if missile == "" then missile_element = "" end
local tile_only_element =
"<td>\n".."\t<div class=\"tile\">\n".."</td>\n"
local effect_2_element = "<div class=\"effect\">"..scene.file_url(effect_2).."</div>\n"
if effect_2 == "" then effect_2_element = "" end
local effect_element =
"<td>\n"..
"\t<div class=\"tile\">\n"..
"\t<div class=\"effect\">"..scene.file_url(effect).."</div>\n"..effect_2_element..
"</div>\n</td>\n"
local caster_name_element =
"\t<div class=\"tibiatext tibiagreen_n\">"..caster_name.."</div>".."<div class=\"hp_bar\"></div>\n"
if caster_name == "" then caster_name_element = "" end
local caster_element =
"<td>\n"..
"\t<div class=\"tile\">\n"..caster_name_element..
"\t<div class=\"caster-"..direction.."\">"..scene.file_path(caster ).."</div>\n"..
"\t<div class=\"effect\">"..scene.file_url(casting_effect).."</div>\n"..
"\t<div class=\"effect\" style=\""..effect_on_caster.."\">"..scene.file_url( effect ).."</div>\n"..effect_2_element..
missile_element.."\n</div>\n</td>\n"
local target_element =
"<td>\n"..
"\t<div class=\"tile\">\n"..
"\t<div class=\"target\">"..scene.file_url(target ).."</div>\n"..
"\t<div class=\"effect\">"..scene.file_url(damage_effect).."</div>\n"..
"\t<div class=\"effect\">"..scene.file_url( effect_on_target ).."</div>\n"..
"</div>\n</td>\n"
local extra_sprite_element_1 =
"<td>\n"..
"\t<div class=\"tile\">\n"..
"\t<div class=\"sprite\">"..scene.file_url( sprite_1 ).."</div>\n"..
"\t</div>\n</td>\n"
local extra_sprite_element_2 =
"<td>\n"..
"\t<div class=\"tile\">\n"..
"\t<div class=\"sprite\">"..scene.file_url( sprite_2 ).."</div>\n"..
"\t</div>\n</td>\n"
local extra_sprite_element_3 =
"<td>\n"..
"\t<div class=\"tile\">\n"..
"\t<div class=\"sprite\">"..scene.file_url( sprite_3 ).."</div>\n"..
"\t</div>\n</td>\n"
local row_end =
"</tr>\n<tr>\n"
local table_close = "</table>"
-- grid number definition
local elements = {
[0] = tile_only_element,
[1] = effect_element,
[2] = caster_element,
[3] = target_element,
[4] = extra_sprite_element_1,
[5] = extra_sprite_element_2,
[6] = extra_sprite_element_3
}
-------transpose matrix--------------
function scene.table2matrix(t,r)
r_count = 0
new_matrix = {}
row_t = {}
for key = 1, #t do
r_count = r_count + 1
table.insert(row_t, t[key])
if r_count == r then
table.insert(new_matrix, row_t)
row_t = {}
r_count = 0
end
end
return new_matrix
end
function scene.transpose(matrix)
local transposed = {}
for c, m_1_c in ipairs(matrix[1]) do
local col = {m_1_c}
for r = 2, #matrix do
col[r] = matrix[r][c]
end
table.insert(transposed, col)
end
return transposed
end
function scene.matrix2table(matrix)
local rotated_table = {}
for row = 1, #matrix do
for index = 1, #matrix[row] do
table.insert(rotated_table, matrix[row][index])
end
end
return rotated_table
end
function scene.rotate_scene_90deg(scene)
local matrix = scene.table2matrix(scene[1],scene[2])
local transposed_matrix = scene.transpose(matrix)
local new_table = scene.matrix2table(transposed_matrix)
local rotated_scene = {}
table.insert(rotated_scene, new_table)
table.insert(rotated_scene, #matrix)
return rotated_scene
end
---------------------------------
local scene_array = scenes[scene_name] -- scene definition from data
if rotate90 == "yes" then scene_array = scene.rotate_scene_90deg(scene_array) end
local table_data = ""
local row_count = 0
-- generating the html table
for v = 1, #scene_array[1] do
table_data = table_data .. elements[scene_array[1][v]]
row_count = row_count + 1
if (row_count == scene_array[2]) then
table_data = table_data .. row_end
row_count = 0
end
end
return table_open..table_data..table_close
end
return scene
Advertisement
Module:SceneBuilder
Advertisement