TibiaWiki
Advertisement

Click here to update this documentation.

This module is for Template:Scene.


 -- 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