Files
2025-09-29 00:52:08 +02:00

540 lines
14 KiB
Ruby
Executable File

#
# mapidedefs.rb
# Game IDE Map Object Definition Classes
#
# Author:: David Muir <david.muir@rockstarnorth.com>
# Date:: 28 February 2008
#
require 'pipeline/game/idefile'
require 'pipeline/math/bbox'
require 'pipeline/math/bsphere'
require 'pipeline/math/vector'
require 'pipeline/math/quat'
module Pipeline
module Game
#
# == Description
#
# Object definition class.
#
class MapIDEObjDef < IDEDefBase
attr_reader :txd_name
attr_reader :dd_name
attr_reader :lod_distance
attr_reader :bbox
attr_reader :bsphere
attr_reader :flags
attr_reader :special
def MapIDEObjDef.parse( line, idefile )
parts = line.split( ',' )
parts.each do |part|
part.strip!()
end
name = parts[0].downcase
txd_name = parts[1]
lod_distance = parts[2]
flags = parts[3]
special = parts[4]
bbox = nil #Math::BoundingBox.new # parts[5..7, 8..10]
bsphere = nil #Math::BoundingSphere.new # parts[11..14]
dd_name = 'null' != parts[15] ? parts[15] : nil
MapIDEObjDef.new( name, idefile, txd_name, dd_name, lod_distance,
bbox, bsphere, flags, special )
end
def initialize( name, idefile, txd_name, dd_name, lod_distance,
bbox, bsphere, flags, special )
super( name, idefile )
@txd_name = txd_name.downcase
@dd_name = dd_name == nil ? nil : dd_name.downcase
@lod_distance = lod_distance
@bbox = bbox
@bsphere = bsphere
@flags = flags
@special = special
end
end
#
# == Description
#
# Time object definition class.
#
class MapIDETimeObjDef < MapIDEObjDef
attr_reader :time_on
attr_reader :time_off
def MapIDETimeObjDef.parse( line, idefile )
parts = line.split( ',' )
parts.each do |part|
part.strip!()
end
name = parts[0]
txd_name = parts[1]
lod_distance = parts[2].to_f
flags = parts[3].to_i
special = parts[4].to_i
bbox = nil #Math::BoundingBox.new() # parts[5..10]
bsphere = nil #Math::BoundingSphere.new() # parts[11..14]
dd_name = 'null' != parts[15] ? parts[15] : nil
time_on = parts[16].to_i
time_off = parts[17].to_i
MapIDETimeObjDef.new( name, idefile, txd_name, dd_name, lod_distance, bbox,
bsphere, flags, special, time_on, time_off )
end
def initialize( name, idefile, txd_name, dd_name, lod_distance,
bbox, bsphere, flags, special, time_on, time_off )
super( name, idefile, txd_name, dd_name, lod_distance, bbox, bsphere,
flags, special )
@time_on = time_on
@time_off = time_off
end
end
#
# == Description
#
# Map Anim object definition.
#
class MapIDEAnimObjDef < IDEDefBase
attr_reader :txd_name # Texture Dictionary
attr_reader :anim_filename # Animation Dictionary
attr_reader :lod_dist
attr_reader :bbox
attr_reader :bsphere
attr_reader :flags
attr_reader :special_attributes
attr_reader :dd_name
def MapIDEAnimObjDef.parse( line, idefile )
parts = line.split( ',' )
parts.each do |part|
part.strip!()
end
name = parts[0]
txd_name = parts[1]
anim_filename = parts[2]
lod_dist = parts[3].to_f
flags = parts[4].to_i
special_attributes = parts[5].to_i
bbox = nil #Math::BoundingBox.new() # parts[6..11]
bsphere = nil #Math::BoundingSphere.new() # parts[12..15]
dd_name = 'null' != parts[16] ? parts[16] : nil
MapIDEAnimObjDef.new( name, idefile, txd_name, anim_filename,
lod_dist, bbox, bsphere, flags, special_attributes, dd_name )
end
def initialize( name, idefile, txd_name, anim_filename, lod_dist,
bbox, bsphere, flags, special_attributes, dd_name )
super( name, idefile )
@txd_name = txd_name.downcase
@anim_filename = anim_filename.downcase
@lod_dist = lod_dist
@bbox = bbox
@bsphere = bsphere
@flags = flags
@special_attributes = special_attributes
@dd_name = dd_name
end
end
#
# == Description
#
# Animated time object class.
#
class MapIDETimeAnimObjDef < MapIDEAnimObjDef
attr_reader :time_on
attr_reader :time_off
def MapIDETimeAnimObjDef.parse( line, idefile )
parts = line.split( ',' )
parts.each do |part|
part.strip!()
end
name = parts[0]
txd_name = parts[1]
anim_filename = parts[2]
lod_dist = parts[3].to_f
flags = parts[4].to_i
special_attributes = parts[5].to_i
bbox = nil #Math::BoundingBox.new() # parts[6..11]
bsphere = nil #Math::BoundingSphere.new() # parts[12..15]
dd_name = 'null' != parts[16] ? parts[16] : nil
time_on = parts[17]
time_off = parts[18]
MapIDETimeAnimObjDef.new( name, idefile, txd_name, anim_filename,
lod_dist, bbox, bsphere, flags, special_attributes, dd_name,
time_on, time_off )
end
def initialize( name, idefile, txd_name, anim_filename, lod_dist,
bbox, bsphere, flags, special_attributes, dd_name,
time_on, time_off )
super( name, idefile, txd_name, anim_filename, lod_dist,
bbox, bsphere, flags, special_attributes, dd_name )
@time_on = time_on
@time_off = time_off
end
end
#
# == Description
#
# MILO definition.
#
class MapIDEMiloObjDef < IDEDefBase
attr_reader :flags
attr_reader :num_rooms
attr_reader :num_portals
attr_reader :num_objects
attr_reader :detail_dist
attr_reader :lod1_dist
attr_reader :lod2_dist
def MapIDEMiloObjDef.parse( line, idefile )
parts = line.split( ',' )
parts.each do |part|
part.strip!()
end
name = parts[0]
flags = parts[1].to_i
nrooms = parts[2].to_i
nportals = parts[3].to_i
nobjs = parts[4].to_i
detail_dist = parts[5].to_f
lod1_dist = parts[6].to_f
lod2_dist = parts[7].to_f
MapIDEMiloObjDef.new( name, idefile, flags, nrooms, nportals, nobjs,
detail_dist, lod1_dist, lod2_dist )
end
def initialize( name, idefile, flags, nrooms, nportals, nobjs, detail_dist,
lod1_dist, lod2_dist )
super( name, idefile )
@flags = flags
@num_rooms = nrooms
@num_portals = nportals
@num_objects = nobjs
@detail_dist = detail_dist
@lod1_dist = lod1_dist
@lod2_dist = lod2_dist
end
end
#
# == Description
#
# 2DFX definition.
#
class MapIDE2DFXDef < IDEDefBase
class UnknownType < Exception; end
attr_reader :position
attr_reader :rotation
def MapIDE2DFXDef.parse( line, idefile )
parts = line.split( ',' )
parts.each do |part|
part.strip!()
end
name = parts[0].downcase
position = Math::Vector.new() # parts[1..3]
type = parts[4].to_i
rotation = Math::Vector.new() # parts[5..8]
case type
when ET_LIGHT
parse_light( name, idefile, position, rotation, parts )
when ET_PARTICLE
return MapIDE2DFXDef.new( name, idefile, position, rotation )
when ET_EXPLOSION
return MapIDE2DFXDef.new( name, idefile, position, rotation )
when ET_ESCALATOR
return MapIDE2DFXDef.new( name, idefile, position, rotation )
when ET_PROCEDURALOBJECTS
return MapIDE2DFXDef.new( name, idefile, position, rotation )
when ET_COORDSCRIPT
return MapIDE2DFXDef.new( name, idefile, position, rotation )
when ET_LADDER
return MapIDE2DFXDef.new( name, idefile, position, rotation )
when ET_AUDIOEFFECT
return MapIDE2DFXDef.new( name, idefile, position, rotation )
when ET_SPAWN_POINT
return MapIDE2DFXDef.new( name, idefile, position, rotation )
when ET_LIGHT_SHAFT
return MapIDE2DFXDef.new( name, idefile, position, rotation )
when ET_SCROLLBAR
return MapIDE2DFXDef.new( name, idefile, position, rotation )
when ET_SWAYABLE
return MapIDE2DFXDef.new( name, idefile, position, rotation )
when ET_BUOYANCY
return MapIDE2DFXDef.new( name, idefile, position, rotation )
when ET_WALKDONTWALK
return MapIDE2DFXDef.new( name, idefile, position, rotation )
when ET_LEDGE
return MapIDE2DFXDef.new( name, idefile, position, rotation )
else
raise UnknownType.new( "Unknown 2DFX Type: #{type}" )
end # End type switch
end
#---------------------------------------------------------------------
# Protected
#---------------------------------------------------------------------
protected
def initialize( name, idefile, position, rotation )
super( name, idefile )
@position = position
@rotation = rotation
end
#---------------------------------------------------------------------
# Private
#---------------------------------------------------------------------
private
def MapIDE2DFXDef.parse_light( name, idefile, position, rotation, parts )
type = parts[9]
colour = nil # parts[10..13]
corona_name = parts[14].gsub( '"', '' )
shadow_name = parts[15].gsub( '"', '' )
lod_distance = parts[16].to_f
size = parts[17].to_s
corona_size = parts[18].to_f
shadow_size = parts[19].to_f
shadow_alpha = parts[20].to_i
flashyness = parts[21].to_i
reflection_type = parts[22].to_i
lens_flare_type = parts[23].to_i
flags = parts[24].to_i
cone_inner = parts[25].to_i
cone_outer = parts[26].to_i
intensity = parts[27].to_f
volume_intensity = parts[28].to_f
volume_intensity = parts[29].to_f
volume_size = parts[30].to_f
atten_start = parts[31].to_f
atten_end = parts[32].to_f
direction = Math::Vector.new( parts[33].to_f, parts[34].to_f, parts[35].to_f )
up = Math::Vector.new( parts[36].to_f, parts[37].to_f, parts[38].to_f )
attach = parts[39].to_i
light_fade = parts[40].to_f
volume_fade = parts[41].to_f
corona_hdr_multiplier = parts[42].to_f
if ( 'null' == shadow_name or '' == shadow_name )
shadow_name = nil
end
if ( 'null' == corona_name or '' == corona_name )
corona_name = nil
end
return MapIDELight2DFXDef.new( name, idefile, position, rotation,
corona_name, shadow_name, lod_distance, size,
corona_size, shadow_size, shadow_alpha, flashyness,
reflection_type, lens_flare_type, flags,
cone_inner, cone_outer, intensity, volume_intensity,
volume_size, atten_start, atten_end, direction, up,
attach, light_fade, volume_fade, corona_hdr_multiplier )
end
ET_LIGHT = 0
ET_PARTICLE = 1
ET_EXPLOSION = 2
ET_ESCALATOR = 10
ET_PROCEDURALOBJECTS = 12
ET_COORDSCRIPT = 13
ET_LADDER = 14
ET_AUDIOEFFECT = 15
ET_SPAWN_POINT = 17
ET_LIGHT_SHAFT = 18
ET_SCROLLBAR = 19
ET_SWAYABLE = 21
ET_BUOYANCY = 22
ET_WALKDONTWALK = 23
ET_LEDGE = 24
end
class MapIDELight2DFXDef < MapIDE2DFXDef
attr_reader :corona_name
attr_reader :shadow_name
attr_reader :lod_distance
attr_reader :size
attr_reader :corona_size
attr_reader :shadow_size
attr_reader :shadow_alpha
attr_reader :flashyness
attr_reader :reflection_type
attr_reader :lens_flare_type
attr_reader :flags
attr_reader :cone_inner
attr_reader :cone_outer
attr_reader :intensity
attr_reader :volume_intensity
attr_reader :volume_size
attr_reader :atten_start
attr_reader :atten_end
attr_reader :direction
attr_reader :up
attr_reader :attach
attr_reader :light_fade
attr_reader :volume_fade
attr_reader :corona_hdr_multiplier
def initialize( name, idefile, position, rotation,
corona_name, shadow_name, lod_distance, size,
corona_size, shadow_size, shadow_alpha, flashyness,
reflection_type, lens_flare_type, flags,
cone_inner, cone_outer, intensity, volume_intensity,
volume_size, atten_start, atten_end, direction, up,
attach, light_fade, volume_fade, corona_hdr_multiplier )
super( name, idefile, position, rotation )
end
end
class MapIDEParticle2DFXDef < MapIDE2DFXDef
def initialize( name, idefile, position, rotation )
super( name, idefile, position, rotation )
end
end
class MapIDEExplosion2DFXDef < MapIDE2DFXDef
def initialize( name, idefile, position, rotation )
super( name, idefile, position, rotation )
end
end
class MapIDEEscalator2DFXDef < MapIDE2DFXDef
def initialize( name, idefile, position, rotation )
super( name, idefile, position, rotation )
end
end
class MapIDEProcedural2DFXDef < MapIDE2DFXDef
def initialize( name, idefile, position, rotation )
super( name, idefile, position, rotation )
end
end
class MapIDECoordScript2DFXDef < MapIDE2DFXDef
def initialize( name, idefile, position, rotation )
super( name, idefile, position, rotation )
end
end
class MapIDELadder2DFXDef < MapIDE2DFXDef
attr_reader :bottom # Vector
attr_reader :top # Vector
attr_reader :normal # Vector
attr_reader :can_get_off_at_top # Bool
def initialize( name, idefile, position, rotation,
bottom, top, normal, can_get_off_at_top )
super( name, idefile, position, rotation )
@bottom = bottom
@top = top
@normal = normal
@can_get_off_at_top = can_get_off_at_top
end
end
class MapIDEAudioEffect2DFXDef < MapIDE2DFXDef
def initialize( name, idefile, position, rotation )
super( name, idefile, position, rotation )
end
end
class MapIDESpawnPoint2DFXDef < MapIDE2DFXDef
def initialize( name, idefile, position, rotation )
super( name, idefile, position, rotation )
end
end
class MapIDELightShaft2DFXDef < MapIDE2DFXDef
def initialize( name, idefile, position, rotation )
super( name, idefile, position, rotation )
end
end
class MapIDEScrollbar2DFXDef < MapIDE2DFXDef
def initialize( name, idefile, position, rotation )
super( name, idefile, position, rotation )
end
end
class MapIDESwayable2DFXDef < MapIDE2DFXDef
def initialize( name, idefile, position, rotation )
super( name, idefile, position, rotation )
end
end
class MapIDEBuoyancy2DFXDef < MapIDE2DFXDef
def initialize( name, idefile, position, rotation )
super( name, idefile, position, rotation )
end
end
class MapIDEWalkDontWant2DFXDef < MapIDE2DFXDef
def initialize( name, idefile, position, rotation )
super( name, idefile, position, rotation )
end
end
end # Game module
end # Pipeline module
# End of mapidedefs.rb