Diese Dokumentation wird von Modul:SystemEntity/doc aus übernommen. Änderungen können auf der Diskussionsseite vorgeschlagen werden.
Function list |
---|
L 10 — getEntityData L 34 — SystemEntity.getSystemHeader L 65 — SystemEntity.getChildObjects L 97 — SystemEntity.makeInfoBox L 256 — SystemEntity.addManual L 297 — SystemEntity.newFromFrame L 313 — SystemEntity.new |
Dieses Modul ist ein Grundmodul für Systementitäten eines Sternensystems. Es erzeugt Infoboxen.
Mithilfe dieses Moduls können z.B. Points of Interest innerhalb des Wikis angezeigt werden.
local SystemEntity = require( 'Module:CelestialObject' ):new( 'Entität' )
-- Extensions
local common = require( 'Module:Common' )
local infobox = require( 'Module:InfoboxNeue' )
local system = require( 'Module:Sternensystem' )
--- Template arguments to subobject data
--- @return table
local function getEntityData( args )
return {
[ 'Quantum Beacon' ] = args[ 'Quantum Beacon' ] or nil,
[ 'Rechtsraum' ] = args[ 'Rechtsraum' ] or nil,
[ 'Waffenfreie Zone' ] = args[ 'Waffenfreie Zone' ] or nil,
[ 'Überwachte Zone' ] = args[ 'Überwachte Zone' ] or nil,
[ 'ATC' ] = args[ 'ATC' ] or nil,
[ 'Anzahl Landeplattformen' ] = args[ 'Anzahl Landeplattformen' ] or nil,
[ 'Anzahl Hangar' ] = args[ 'Anzahl Hangar' ] or nil,
[ 'Anzahl Garagen' ] = args[ 'Anzahl Garagen' ] or nil,
[ 'Anzahl Bodenfahrzeugkonsolen' ] = args[ 'Anzahl Bodenfahrzeugkonsolen' ] or nil,
[ 'Anzahl Raumschiffkonsolen' ] = args[ 'Anzahl Raumschiffkonsolen' ] or nil,
[ 'Temperatur Schattenseite' ] = args[ 'Temperatur Schattenseite' ] or nil,
[ 'Temperatur Sonnenseite' ] = args[ 'Temperatur Sonnenseite' ] or nil,
[ 'Anzahl Händler' ] = args[ 'Anzahl Händler' ] or nil,
[ 'Handelsterminals' ] = args[ 'Handelsterminals' ] or nil,
[ 'Anzahl Paketstationen' ] = args[ 'Anzahl Paketstationen' ] or nil,
[ 'Raffineriestationen' ] = args[ 'Raffineriestationen' ] or nil,
}
end
--- Adds the entities system as a header to the infobox
--- @param self table - The SystemEntity self
--- @param box table - The infobox
function SystemEntity.getSystemHeader( self )
if self.parentObjectData == nil or self.parentObjectData.page == nil then
return
end
local parentPage = ''
local ask = {
'[[ID::' .. self.celestialObjectData.system_id .. '|+depth=0]]',
'?#-=page',
'?Starmap Code=code',
}
ask.mainlabel = '-'
ask.limit = 1
ask.sort = 'Starmap Code'
ask.order = 'asc'
ask = mw.smw.ask( ask )
if ask ~= nil and ask[ 1 ] ~= nil then
parentPage = ask[ 1 ].page
else
parentPage = mw.text.split( self.parentObjectData.page, '#', true )[ 1 ]
end
return '[[' .. parentPage .. '|' .. parentPage .. ' System]]'
end
--- Get POIs or Personalities on this object
--- @param searchTypes string|table List of 'Typ' attributes
--- @return table
function SystemEntity.getChildObjects( self, searchTypes )
if type( searchTypes ) ~= 'table' then
searchTypes = {
searchTypes
}
end
local selector = {
'[[Elternid::' .. self.celestialObjectData.id .. ']]',
}
local conditions = {}
for _, searchType in pairs( searchTypes ) do
table.insert( conditions, '[[Typ::' .. searchType .. ']]' )
end
table.insert( selector, '<q>' .. table.concat( conditions, '||' ) .. '</q>' )
local query = {
table.concat( selector ),
'?Bezeichnung',
}
query.mainlabel = '-'
local data = mw.smw.ask( query )
return data
end
--- Creates the infobox
--- TODO Refactor, this is largely copied from CelestialObject
function SystemEntity.makeInfoBox( self )
if self.celestialObjectData == nil or self.celestialObjectData.page == nil or self.hideBox == true then
-- Faulty SMW data
return ''
end
local box = infobox:new( {
removeEmpty = true,
emptyString = '-',
placeholderImage = 'Platzhalter Starmap.webp',
} )
-- Image
box:renderImage( common.getImage( self.frameArgs['image'] ) )
local boxTitle = mw.title.getCurrentTitle().subpageText
if boxTitle ~= self.pageName then
boxTitle = self.pageName
end
box:renderHeader( {
title = common.removeTypeSuffix( boxTitle, self.typeSuffixes ),
subtitle = self:getSystemHeader()
} )
local section = {}
if self.parentObjectData.type ~= nil and self.parentObjectData.planet_count == nil then
local orbits = self.parentObjectData.designation
if self.parentObjectData.type == 'STAR' then
orbits = orbits .. ' (Stern)'
end
if self.parentObjectData.name ~= nil and orbits ~= self.parentObjectData.name then
orbits = orbits .. '|' .. orbits .. ': ' .. self.parentObjectData.name
end
table.insert( section, box:renderItem( self:getPositionLabel( self.celestialObjectData.type ), '[[' .. orbits .. ']]' ) )
end
table.insert( section, box:renderItem( 'Navigationspunkt', common.booleanToText(self.celestialObjectData[ 'Quantum Beacon' ]) or '-' ) )
box:renderSection( {
title = 'Astronomische Daten',
col = 2,
content = section,
} )
box:renderSection( {
title = 'Recht',
col = 2,
content = {
box:renderItem( 'Kontrolle', system.getAffiliationLines( self.celestialObjectData.affiliation ) or '-' ),
box:renderItem( 'Rechtsraum', self.celestialObjectData[ 'Rechtsraum' ] or '-' ),
box:renderItem( 'Waffenfreie Zone', common.booleanToText(self.celestialObjectData[ 'Waffenfreie Zone' ]) or '' ),
box:renderItem( 'Überwachte Zone', common.booleanToText(self.celestialObjectData[ 'Überwachte Zone' ]) or '' ),
}
} )
local atc = self.celestialObjectData[ 'ATC' ]
if atc ~= nil then
atc = common.booleanToText( self.celestialObjectData[ 'ATC' ] )
end
box:renderSection( {
title = 'Mobilität',
col = 2,
content = {
box:renderItem( 'Lande- und Startkontrolle', atc or '-' ),
box:renderItem( 'Landeplattformen', self.celestialObjectData[ 'Anzahl Landeplattformen' ] or '-' ),
box:renderItem( 'Hangar', self.celestialObjectData[ 'Anzahl Hangar' ] or '-' ),
box:renderItem( 'Garagen', self.celestialObjectData[ 'Anzahl Garagen' ] or '-' ),
box:renderItem( 'Bodenfahrzeugkonsolen', self.celestialObjectData[ 'Anzahl Bodenfahrzeugkonsolen' ] or '-' ),
box:renderItem( 'Raumschiffkonsolen', self.celestialObjectData[ 'Anzahl Raumschiffkonsolen' ] or '-' ),
}
} )
local habitable = self.celestialObjectData.habitable
if habitable ~= nil then
habitable = common.booleanToText( self.celestialObjectData.habitable )
end
local temperature = '-'
if self.celestialObjectData[ 'Temperatur Schattenseite' ] ~= self.celestialObjectData[ 'Temperatur Sonnenseite' ] then
temperature = (self.celestialObjectData[ 'Temperatur Schattenseite' ] or '-') .. ' / ' .. (self.celestialObjectData[ 'Temperatur Sonnenseite' ] or '-')
end
box:renderSection( {
title = 'Umgebung',
col = 2,
content = {
box:renderItem( 'Habitabel', habitable or '-' ),
box:renderItem( 'Temperatur', temperature ),
}
} )
box:renderSection( {
title = 'Wirtschaft',
col = 2,
content = {
box:renderItem( 'Händler', self.celestialObjectData[ 'Anzahl Händler' ] or '-' ),
box:renderItem( 'Paketstation', self.celestialObjectData[ 'Anzahl Paketstation' ] or '-' ),
box:renderItem( 'Ein- und Verkauf von Handelsware', self.celestialObjectData[ 'Handelsterminals' ] or '-' ),
box:renderItem( 'Raffineriestationen', self.celestialObjectData[ 'Raffineriestationen' ] or '-' ),
}
} )
-- TODO: REFACTOR
if self.celestialObjectData[ 'Anzahl Landeplattformen' ] ~= nil then
self:addCategory( 'Landezone' )
end
-- TODO: REFACTOR
if self.celestialObjectData[ 'Anzahl Händler' ] ~= nil or self.celestialObjectData[ 'Handelsterminals' ] ~= nil then
self:addCategory( 'Handelsplatz' )
end
local personalities = self:getChildObjects( 'PERSON' )
local pois = self:getChildObjects( {
'POI',
'STRUCTURE',
'LANDINGZONE'
} )
section = {}
if personalities ~= nil then
local list = {}
for _, personality in pairs( personalities ) do
table.insert( list, '[[' .. personality[ 'Bezeichnung' ] .. ']]' )
end
table.insert( section, box:renderItem( 'Persönlichkeiten', table.concat( list , '<br>' ) ) )
end
if pois ~= nil then
local list = {}
for _, personality in pairs( pois ) do
table.insert( list, '[[' .. personality[ 'Bezeichnung' ] .. ']]' )
end
table.insert( section, box:renderItem( 'Sehenswürdigkeiten', table.concat( list, '<br>' ) ) )
end
if #section > 0 then
box:renderSection( {
title = 'Personen und POIs',
col = 2,
content = section
} )
end
return tostring( box ) .. tostring( common.generateInterWikiLinks( self.pageName ) )
end
--- Overwrites CelestialObject method
function SystemEntity.addManual( self, args, typeOverride )
if args[ 'Starmap Code' ] == nil or mw.title.getCurrentTitle().isSubpage then
return
end
if args[ 'Infobox' ] == 'Nein' then
self.hideBox = true
end
local celestialObjectData = self:getSubObjectData( args )
local entityData = getEntityData( args )
local subObject = {}
for key, value in pairs( celestialObjectData ) do
if value ~= nil then
subObject[ key ] = value
end
end
for key, value in pairs( entityData ) do
if value ~= nil then
if key == 'Temperatur Sonnenseite' or key == 'Temperatur Schattenseite' then
value = mw.text.trim( value, 'CFK° ' )
value = value .. ' °C'
end
subObject[ key ] = value
end
end
if typeOverride ~= nil then
subObject[ 'Typ' ] = typeOverride
end
subObject[ 'Typ' ] = mw.text.trim( mw.ustring.upper( subObject[ 'Typ' ] ) ) .. '@en'
mw.smw.subobject( subObject )
end
--- For direct invocation
function SystemEntity.newFromFrame( frame )
local objectType = frame:getParent().args[ 'Kategorie' ] or frame.args[ 'type' ] or 'Entität'
if frame:getParent().args[ 'Typ' ] ~= nil then
local mappedType = SystemEntity.reverseMapType( frame:getParent().args[ 'Typ' ] )
if mappedType ~= nil then
objectType = mappedType
end
end
local instance = SystemEntity:new( objectType )
return instance:run( frame )
end
--- New Instance
function SystemEntity.new( self, objectType )
local instance = {}
setmetatable( instance, self )
self.__index = self
if objectType == nil then
error( 'Required argument "objectType" missing.' )
end
instance.objectType = objectType
self.objectType = objectType
table.insert( instance.typeSuffixes, objectType )
return instance
end
return SystemEntity