This commit is contained in:
Amazed 2020-10-27 15:28:23 +01:00
parent c03e87bc21
commit 83b0ea3267
19 changed files with 2301 additions and 328 deletions

23
3d.gd
View File

@ -21,8 +21,14 @@ func _ready() -> void:
f.open("res://dir.txt", File.READ) f.open("res://dir.txt", File.READ)
var dir = f.get_as_text() var dir = f.get_as_text()
f.close() f.close()
var terrainmanager = load("res://terrainmanager.gd").new()
var terrain_mesh = terrainmanager.get_terrain("/home/tasty/Jeux/Giants Citizen Kabuto/Worlds/Mecc v. Mecc - Summit.gck")
add_child(terrain_mesh)
objmgr = giantsscript.ObjectManager.new() objmgr = giantsscript.ObjectManager.new()
objmgr.GIANTS_PATH = dir # objmgr.GIANTS_PATH = dir
# var giants_dir_browser = FileDialog.new() # var giants_dir_browser = FileDialog.new()
# giants_dir_browser.mode = FileDialog.MODE_OPEN_DIR # giants_dir_browser.mode = FileDialog.MODE_OPEN_DIR
# giants_dir_browser.window_title = "Select your Giants directory" # giants_dir_browser.window_title = "Select your Giants directory"
@ -32,13 +38,12 @@ func _ready() -> void:
objmgr.build() objmgr.build()
# var m = objmgr.load_model("mc_nothrust_l0.gbs") # var m = objmgr.load_model("mc_nothrust_l0.gbs")
# var m = objmgr.load_model("ripper.gbs") # var m = objmgr.load_model("ripper.gbs")
var m = objmgr.load_model("RP_command.gbs")
# print(m.tex) #var m = objmgr.load_model("RP_command.gbs")
# print(m.point_uv)
# print(m.tex) #var meshinstance = objmgr.load_model_mesh(m)
var meshinstance = objmgr.load_model_mesh(m) #meshinstance.transform.origin.y = 50
meshinstance.transform.origin.y = 50 #add_child(meshinstance)
add_child(meshinstance)
func _input(event: InputEvent) -> void: func _input(event: InputEvent) -> void:
@ -71,7 +76,7 @@ func _input(event: InputEvent) -> void:
add_child(meshinstance) add_child(meshinstance)
func _process(delta): func _process(_delta):
var pos = camera.get_global_transform().origin var pos = camera.get_global_transform().origin
get_node("Label").text = "X: "+str(pos.x)+", Y: "+str(pos.y)+", Z: "+str(pos.z) get_node("Label").text = "X: "+str(pos.x)+", Y: "+str(pos.y)+", Z: "+str(pos.z)
var rotation = camera.rotation var rotation = camera.rotation

63
3d.tscn

File diff suppressed because one or more lines are too long

View File

@ -1,149 +0,0 @@
extends ImmediateGeometry
var signature
var u0
var xoffset
var yoffset
var minheight
var maxheight
var xverticesnumber
var yverticesnumber
var stretch
var u1
var u2
var u3
var u4
var version
var u6
var u7
var u8
var tex
var edges
var file = File.new()
var vertices = []
var triangles = []
func _ready():
return
clear()
readgti("res://default.gti")
# triangles = [[-1, 0, -1, 0, 1, 255, 251], [-1,0,1, 0, 224, 255, 0], [1,0,-1, 0, 1, 0, 0]]
print("vertices: "+str(len(vertices)))
print("draw "+str(len(triangles)))
assert(len(triangles) % 3 == 0)
begin(Mesh.PRIMITIVE_TRIANGLES)
for i in range(len(triangles)):
var vertex = triangles[i]
if not vertex:
print(i)
else:
print("color: ("+str(vertex[6] / 255.0)+")")
set_color(Color(vertex[4] / 255.0, vertex[5] / 255.0, vertex[6] / 255.0))
add_vertex(Vector3(vertex[0], vertex[2], vertex[1]))
end()
func fill():
print("version="+str(version))
# fill read values
print("fill")
var p = 0
while p < xverticesnumber * yverticesnumber:
var b = file.get_8()
if b >= 0x80:
while b != 0x00:
if p >= xverticesnumber * yverticesnumber:
return
b = (b + 1) & 0xFF
p+=1
else:
while b != 0xff:
if p >= xverticesnumber * yverticesnumber:
return
if version != 7:
vertices[p][2] = file.get_float() # height
vertices[p][3] = file.get_8() # triangulation
vertices[p][4] = file.get_8() # R
vertices[p][5] = file.get_8() # G
vertices[p][6] = file.get_8() # B
else:
vertices[p][2] = file.get_float() # height
vertices[p][3] = file.get_8() # triangulation
vertices[p][4] = file.get_8() # R
vertices[p][5] = file.get_8() # G
vertices[p][6] = file.get_8() # B
var unk = file.get_8() # unk
# print("["+ str(vertices[p][0]) + ", "+ str(vertices[p][1])+", "+ str(vertices[p][2])+", "+ str(vertices[p][3])+", "+ str(vertices[p][4])+", "+ str(vertices[p][5])+", "+ str(vertices[p][6])+", "+str(b)+"]")
p+=1
b = (b - 1) & 0xFF
func readgti(filename):
file.open(filename, File.READ)
if not file.is_open():
get_tree().quit()
return
signature = file.get_32()
u0 = file.get_32()
xoffset = file.get_float()
yoffset = file.get_float()
minheight = file.get_float()
maxheight = file.get_float()
xverticesnumber = file.get_32()
yverticesnumber = file.get_32()
stretch = file.get_float()
u1 = file.get_float()
u2 = file.get_float()
u3 = file.get_float()
u4 = file.get_float()
version = file.get_16()
u6 = file.get_16()
u7 = file.get_float()
u8 = file.get_float()
tex = file.get_buffer(32).get_string_from_ascii()
vertices.resize(xverticesnumber * yverticesnumber)
# initialize empty terrain
print("init")
for y in range(yverticesnumber):
for x in range(xverticesnumber):
vertices[y * xverticesnumber + x] = []
vertices[y * xverticesnumber + x].append(xoffset + x * stretch) # 0: x
vertices[y * xverticesnumber + x].append(yoffset + y * stretch) # 1: y
vertices[y * xverticesnumber + x].append(minheight) # 2: height
vertices[y * xverticesnumber + x].append(0) # 3: triangulation value
vertices[y * xverticesnumber + x].append(0) # 4: R
vertices[y * xverticesnumber + x].append(0) # 5: G
vertices[y * xverticesnumber + x].append(0) # 6: B
fill()
file.close()
# sort triangles
print("sort")
var i = 0
# triangles.resize(2*len(vertices))
for y in range(yverticesnumber-1):
for x in range(xverticesnumber-1):
var b = (vertices[y * xverticesnumber + x][3] & 7) % 128
if b == 4 or b == 5 or b == 7:
triangles.append(vertices[(y+1) * xverticesnumber + x])
triangles.append(vertices[y * xverticesnumber + x])
triangles.append(vertices[(y+1) * xverticesnumber + (x+1)])
if b == 5 or b == 3:
triangles.append(vertices[y * xverticesnumber + (x + 1)])
triangles.append(vertices[y * xverticesnumber + x])
triangles.append(vertices[(y + 1) * xverticesnumber + (x + 1)])
for y in range (yverticesnumber-1):
for x in range(xverticesnumber-1):
var b = (vertices[y * xverticesnumber + x][3] & 7) % 128
if b == 1 or b == 6:
triangles.append(vertices[(y + 1) * xverticesnumber + x])
triangles.append(vertices[y * xverticesnumber + x])
triangles.append(vertices[y * xverticesnumber + (x + 1)])
if b == 2 or b == 6:
triangles.append(vertices[y * xverticesnumber + (x + 1)])
triangles.append(vertices[(y + 1) * xverticesnumber + x])
triangles.append(vertices[(y + 1) * xverticesnumber + (x + 1)])

View File

@ -1,7 +0,0 @@
[gd_scene load_steps=2 format=2]
[ext_resource path="res://MeshInstance.gd" type="Script" id=1]
[node name="GiantsTerrain" type="MeshInstance"]
script = ExtResource( 1 )
[connection signal="ready" from="." to="." method="_on_MeshInstance_ready"]

56
UI.gd
View File

@ -1 +1,55 @@
extends Panel extends Node
func error(msg):
get_node("ErrorPopup/ErrorLbl").text = msg
get_node("ErrorPopup").popup_centered()
func _on_Quit_pressed():
get_tree().quit() # Quits the game
func _on_BrowseButton_pressed():
get_node("GCKFileDialog").popup()
func _on_GCKFileDialog_dir_selected(dir):
get_node("GiantsDir").text = dir
func _on_Start_pressed():
if (check_path(get_node("GiantsDir").text)):
var f = File.new()
f.open("res://dir.txt", File.WRITE)
f.store_string(get_node("GiantsDir").text)
f.close()
get_tree().change_scene("res://viewer.tscn")
func check_path(path) -> bool:
var ret = true
var d = Directory.new()
if not d.dir_exists(path):
error("%s is not a valid directory!" % path)
ret = false
if not d.file_exists("%s/Giants.exe" % path):
error("%s does not contain Giants.exe!" % path)
ret = false
return ret
func _on_Node_ready():
var f = File.new()
f.open("res://dir.txt", File.READ)
var dir = f.get_as_text()
f.close()
get_node("GiantsDir").text = dir
if dir:
if check_path(get_node("GiantsDir").text):
get_tree().change_scene("res://viewer.tscn")
# error("Changed")
func _on_Close_pressed():
get_node("ErrorPopup").visible = false

184
UI.tscn
View File

@ -2,62 +2,156 @@
[ext_resource path="res://UI.gd" type="Script" id=1] [ext_resource path="res://UI.gd" type="Script" id=1]
[node name="Panel" type="Panel"] [node name="Node" type="Node"]
anchor_left = 0.000976562
anchor_top = 0.001
anchor_right = 0.000976562
anchor_bottom = 0.001
margin_left = -2.0
margin_top = -1.0
margin_right = 1023.0
margin_bottom = 600.0
script = ExtResource( 1 ) script = ExtResource( 1 )
__meta__ = {
"_edit_use_anchors_": false
}
[node name="Title" type="Label" parent="."] [node name="Title" type="Label" parent="."]
margin_left = 329.0 anchor_left = 0.5
margin_top = 37.0 anchor_right = 0.5
margin_right = 539.0 margin_left = -280.5
margin_bottom = 51.0 margin_top = 61.0
text = "Welcome to GiantsEditReloaded!" margin_right = 280.5
__meta__ = { margin_bottom = 143.001
"_edit_use_anchors_": false grow_horizontal = 2
} grow_vertical = 2
text = "Welcome to Giants Model Viewer!
[node name="New" type="Button" parent="."] This tool allows you to show Giants models and textures.
margin_left = 153.0
margin_top = 150.0
margin_right = 268.0
margin_bottom = 179.0
rect_pivot_offset = Vector2( 82, 14.5 )
text = "Create new map"
__meta__ = {
"_edit_use_anchors_": false
}
[node name="Open" type="Button" parent="."] You can use it to explore the models and/or get the ID needed to be used in GiantsEdit!"
margin_left = 366.0 align = 1
margin_top = 149.0
margin_right = 481.0
margin_bottom = 178.0
rect_pivot_offset = Vector2( 82, 14.5 )
text = "Open map"
__meta__ = { __meta__ = {
"_edit_use_anchors_": false "_edit_use_anchors_": false
} }
[node name="Quit" type="Button" parent="."] [node name="Quit" type="Button" parent="."]
margin_left = 614.0 anchor_left = 0.5
margin_top = 149.0 anchor_top = 1.0
margin_right = 729.0 anchor_right = 0.5
margin_bottom = 178.0 anchor_bottom = 1.0
rect_pivot_offset = Vector2( 82, 14.5 ) margin_left = 99.5
margin_top = -155.0
margin_right = 262.5
margin_bottom = -125.0
rect_pivot_offset = Vector2( 34.3256, 17.0624 )
text = "Quit" text = "Quit"
__meta__ = { __meta__ = {
"_edit_use_anchors_": false "_edit_use_anchors_": false
} }
[connection signal="pressed" from="New" to="." method="_on_Button_pressed"]
[connection signal="pressed" from="Open" to="." method="_on_Button_pressed"] [node name="GCKFileDialog" type="FileDialog" parent="."]
[connection signal="pressed" from="Quit" to="." method="_on_Button_pressed"] margin_right = 800.0
margin_bottom = 500.0
window_title = "Open a Directory"
resizable = true
mode = 2
access = 2
current_dir = "/home/tasty/Jeux/GiantsEdit"
current_path = "/home/tasty/Jeux/GiantsEdit/"
[node name="GiantsDir" type="LineEdit" parent="."]
anchor_left = 0.5
anchor_top = 0.5
anchor_right = 0.5
anchor_bottom = 0.5
margin_left = -17.5
margin_top = -12.0
margin_right = 355.5
margin_bottom = 12.0
__meta__ = {
"_edit_use_anchors_": false
}
[node name="EnterGCKDir" type="Label" parent="."]
anchor_left = 0.5
anchor_top = 0.5
anchor_right = 0.5
anchor_bottom = 0.5
margin_left = -313.5
margin_top = -7.0
margin_right = -38.5
margin_bottom = 7.0
text = "Enter your Giants: Citizen Kabuto directory:"
__meta__ = {
"_edit_use_anchors_": false
}
[node name="BrowseButton" type="Button" parent="."]
anchor_left = 0.5
anchor_top = 0.5
anchor_right = 0.5
anchor_bottom = 0.5
margin_left = 357.5
margin_top = -12.0
margin_right = 416.5
margin_bottom = 12.0
text = "Browse"
__meta__ = {
"_edit_use_anchors_": false
}
[node name="Start" type="Button" parent="."]
anchor_left = 0.5
anchor_top = 1.0
anchor_right = 0.5
anchor_bottom = 1.0
margin_left = -254.5
margin_top = -155.0
margin_right = -91.5
margin_bottom = -125.0
text = "Start"
__meta__ = {
"_edit_use_anchors_": false
}
[node name="Credit" type="Label" parent="."]
anchor_left = 1.0
anchor_top = 1.0
anchor_right = 1.0
anchor_bottom = 1.0
margin_left = -197.438
margin_top = -15.3966
margin_right = -5.43799
margin_bottom = -1.39661
text = "V1.1 - Made by Amazed#0001"
__meta__ = {
"_edit_use_anchors_": false
}
[node name="ErrorPopup" type="WindowDialog" parent="."]
margin_left = 231.5
margin_top = 203.0
margin_right = 782.5
margin_bottom = 411.0
popup_exclusive = true
window_title = "Error"
__meta__ = {
"_edit_use_anchors_": false
}
[node name="ErrorLbl" type="Label" parent="ErrorPopup"]
anchor_left = 0.5
anchor_right = 0.5
margin_left = -275.5
margin_top = 20.0
margin_right = 275.5
margin_bottom = 80.0
text = "Error !"
align = 1
[node name="Close" type="Button" parent="ErrorPopup"]
anchor_left = 0.5
anchor_top = 1.0
anchor_right = 0.5
anchor_bottom = 1.0
margin_left = -50.0
margin_top = -52.0
margin_right = 50.0
margin_bottom = -21.0
text = "Close"
[connection signal="ready" from="." to="." method="_on_Node_ready"]
[connection signal="pressed" from="Quit" to="." method="_on_Quit_pressed"]
[connection signal="dir_selected" from="GCKFileDialog" to="." method="_on_GCKFileDialog_dir_selected"]
[connection signal="pressed" from="BrowseButton" to="." method="_on_BrowseButton_pressed"]
[connection signal="pressed" from="Start" to="." method="_on_Start_pressed"]
[connection signal="pressed" from="ErrorPopup/Close" to="." method="_on_Close_pressed"]

671
addons/gdunzip/gdunzip.gd Normal file
View File

@ -0,0 +1,671 @@
# MIT License
#
# Copyright (c) 2018 Jelle Hermsen
#
# Permission is hereby granted, free of charge, to any person obtaining a copy
# of this software and associated documentation files (the "Software"), to deal
# in the Software without restriction, including without limitation the rights
# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
# copies of the Software, and to permit persons to whom the Software is
# furnished to do so, subject to the following conditions:
#
# The above copyright notice and this permission notice shall be included in all
# copies or substantial portions of the Software.
#
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
# SOFTWARE.
#
# +-------------------------------------+
# | _ _ |
# | __ _ __| |_ _ _ __ ___(_)_ __ |
# | / _` |/ _` | | | | '_ \|_ / | '_ \ |
# || (_| | (_| | |_| | | | |/ /| | |_) ||
# | \__, |\__,_|\__,_|_| |_/___|_| .__/ |
# | |___/ |_| |
# | |
# +-------------------------------------+
# | A small GDScript that allows you to |
# | browse and uncompress zip files. |
# +-------------------------------------+
# Example usage:
#
# - put gdunzip.gd somewhere in your Godot project
# - instance this scrip by using:
# var gdunzip = load('res://LOCATION_IN_LIBRARY/gdunzip.gd').new()
# - load a zip file:
# var loaded = gdunzip.load('res://PATH_TO_ZIP/test.zip')
# - if loaded is true you can try to uncompress a file:
# var uncompressed = gdunzip.uncompress('PATH_TO_FILE_IN_ZIP/test.txt')
# - now you have got a PoolByteArray named "uncompressed" with the
# uncompressed data for the given file
#
# You can iterate over the "files" variable from the gdunzip instance, to
# see all the available files:
# - for f in gdunzip.files:
# print(f['file_name'])
# The path of the currently loaded zip file
var path
# A PoolByteArray with the contents of the zip file
var buffer
# The size of the currently loaded buffer
var buffer_size
# A dictionary with the files in the currently loaded zip file.
# It maps full file paths to dictionaries with meta file information:
#
# - compression_method: -1 if uncompressed or File.COMPRESSION_DEFLATE
# - file_name: the full path of the compressed file inside the zip
# - file_header_offset: the exact byte location of this file's compressed data
# inside the zip file
# - compressed_size
# - uncompressed_size
var files = {}
# The current position we're at inside the buffer
var pos = 0
# An instance of the inner Tinf class, which is a GDScript port of Jørgen
# Ibsen's excellent "tiny inflate library"
var tinf
# Initialize the gdunzip class
func _init():
self.tinf = Tinf.new()
# Load a zip file with the given path. Returns a boolean denoting success.
func load(path):
if path == null:
return false
self.path = path
self.pos = 0
var file = File.new()
if !file.file_exists(path):
return false
file.open(path, File.READ)
var file_length = file.get_len()
if file.get_32() != 0x04034b50:
return false
file.seek(0)
self.buffer = file.get_buffer(file_length)
self.buffer_size = self.buffer.size()
file.close()
if self.buffer_size < 22:
# Definitely not a valid zip file
return false
# Fill in self.files with all the file data
return self._get_files()
# Uncompress the given file. Returns false if uncompressing fails, or when the
# file isn't available in the currently loaded zip file.
func uncompress(file_name):
if !(file_name in self.files):
return false
var f = self.files[file_name]
self.pos = f['file_header_offset']
self._skip_file_header()
var uncompressed = self._read(f['compressed_size'])
if f['compression_method'] == -1:
return uncompressed
return tinf.tinf_uncompress(f['uncompressed_size'], uncompressed)
# Returns a PoolByteArray with the compressed data for the given file.
# Returns false if it can't be found.
func get_compressed(file_name):
if !(file_name in self.files):
return false
var f = self.files[file_name]
self.pos = f['file_header_offset']
self._skip_file_header()
return self._read(f['compressed_size'])
# Parse the zip file's central directory and fill self.files with all the
# file info
func _get_files():
# Locate starting position of central directory
var eocd_offset = buffer.size() - 22
while (
eocd_offset > 0
&& buffer[eocd_offset+3] != 0x06
&& buffer[eocd_offset+2] != 0x05
&& buffer[eocd_offset+1] != 0x4b
&& buffer[eocd_offset] != 0x50
):
eocd_offset -= 1
# Set the central directory start offset
self.pos = (
buffer[eocd_offset + 19] << 24
| buffer[eocd_offset + 18] << 16
| buffer[eocd_offset + 17] << 8
| buffer[eocd_offset + 16]
)
# Get all central directory records, and fill self.files
# with all the file information
while (
buffer[pos + 3] == 0x02
&& buffer[pos + 2] == 0x01
&& buffer[pos + 1] == 0x4b
&& buffer[pos] == 0x50
):
var raw = _read(46)
var header = {
'compression_method': '',
'file_name': '',
'compressed_size': 0,
'uncompressed_size': 0,
'file_header_offset': -1,
}
if raw[10] == 0 && raw[11] == 0:
header['compression_method'] = -1
else:
header['compression_method'] = File.COMPRESSION_DEFLATE
header['compressed_size'] = (
raw[23] << 24
| raw[22] << 16
| raw[21] << 8
| raw[20]
)
header['uncompressed_size'] = (
raw[27] << 24
| raw[26] << 16
| raw[25] << 8
| raw[24]
)
header['file_header_offset'] = (
raw[45] << 24
| raw[44] << 16
| raw[43] << 8
| raw[42]
)
var file_name_length = raw[29] << 8 | raw[28]
var extra_field_length = raw[31] << 8 | raw[30]
var comment_length = raw[33] << 8 | raw[32]
var raw_end = _read(file_name_length + extra_field_length + comment_length)
if !raw_end:
return false
header['file_name'] = (
raw_end.subarray(0, file_name_length - 1).get_string_from_utf8()
)
self.files[header['file_name']] = header
return true
# Read a given number of bytes from the buffer, and return it as a
# PoolByteArray
func _read(length):
var result = buffer.subarray(pos, pos + length - 1)
if result.size() != length:
return false
pos = pos + length
return result
# Skip the given number of bytes in the buffer. Advancing "pos".
func _skip(length):
pos += length
# This function skips the file header information, when "pos" points at a file
# header inside the buffer.
func _skip_file_header():
var raw = _read(30)
if !raw:
return false
var file_name_length = raw[27] << 8 | raw[26]
var extra_field_length = raw[29] << 8 | raw[28]
var raw_end = _skip(file_name_length + extra_field_length)
# The inner Tinf class is a pretty straight port from Jørgen Ibsen's excellent
# "tiny inflate library". It's written in an imperative style and I have tried
# to stay close to the original. I added two helper functions, and had to make
# some minor additions to support "faux pointer arithmetic".
#
# I have created a TINF_TREE and TINF_DATA dictionary to serve as structs. I
# use "duplicate" to make an instance from these structs.
class Tinf:
# ----------------------------------------
# -- GDscript specific helper functions --
# ----------------------------------------
func make_pool_int_array(size):
var pool_int_array = PoolIntArray()
pool_int_array.resize(size)
return pool_int_array
func make_pool_byte_array(size):
var pool_byte_array = PoolByteArray()
pool_byte_array.resize(size)
return pool_byte_array
# ------------------------------
# -- internal data structures --
# ------------------------------
var TINF_TREE = {
'table': make_pool_int_array(16),
'trans': make_pool_int_array(288),
}
var TINF_DATA = {
'source': PoolByteArray(),
# sourcePtr is an "int" that's used to point at a location in "source".
# I added this since we don't have pointer arithmetic in GDScript.
'sourcePtr': 0,
'tag': 0,
'bitcount': 0,
'dest': PoolByteArray(),
'destLen': 0,
# "Faux pointer" to dest.
'destPtr': 0,
'ltree': TINF_TREE.duplicate(),
'dtree': TINF_TREE.duplicate()
}
const TINF_OK = 0
const TINF_DATA_ERROR = -3
# ---------------------------------------------------
# -- uninitialized global data (static structures) --
# ---------------------------------------------------
var sltree = TINF_TREE.duplicate() # fixed length/symbol tree
var sdtree = TINF_TREE.duplicate() # fixed distance tree
var base_tables = {
# extra bits and base tables for length codes
'length_bits': make_pool_byte_array(30),
'length_base': make_pool_int_array(30),
# extra bits and base tables for distance codes
'dist_bits': make_pool_byte_array(30),
'dist_base': make_pool_int_array(30)
}
var clcidx = PoolByteArray([
16, 17, 18, 0, 8, 7, 9, 6,
10, 5, 11, 4, 12, 3, 13, 2,
14, 1, 15])
# -----------------------
# -- utility functions --
# -----------------------
# build extra bits and base tables
# bits: PoolByteArray
# base: PoolIntArray
# delta: int
# first: int
func tinf_build_bits_base(target, delta, first):
# var i = 0
var sum = first
for i in range(0, delta):
base_tables[target + '_bits'][i] = 0
for i in range(0, 30 - delta):
base_tables[target + '_bits'][i + delta] = i / delta
for i in range(0, 30):
base_tables[target + '_base'][i] = sum
sum += 1 << base_tables[target + '_bits'][i]
# build the fixed huffman trees
# lt: TINF_TREE
# rt: TINF_TREE
func tinf_build_fixed_trees(lt, dt):
# var i = 0
for i in range(0, 7):
lt['table'][i] = 0
lt['table'][7] = 24
lt['table'][8] = 152
lt['table'][9] = 112
for i in range(0, 24):
lt['trans'][i] = 256 + i
for i in range(0, 144):
lt['trans'][24 + i] = i
for i in range(0, 8):
lt['trans'][24 + 144 + i] = 280 + i
for i in range(0, 112):
lt['trans'][24 + 144 + 8 + i] = 144 + i
for i in range(0, 5):
dt['table'][i] = 0
dt['table'][5] = 32
for i in range(0, 32):
dt['trans'][i] = i
# given an array of code lengths, build a tree
# t: TINF_TREE
# lengths: PoolByteArray
# num: int
func tinf_build_tree(t, lengths, num):
var offs = make_pool_int_array(16)
# var i = 0
var sum = 0
# clear code length count table
for i in range(0,16):
t['table'][i] = 0
# scan symbol lengths, and sum code length counts
for i in range(0, num):
t['table'][lengths[i]] += 1
t['table'][0] = 0
for i in range(0,16):
offs[i] = sum
sum += t['table'][i]
for i in range(0, num):
if lengths[i]:
t['trans'][offs[lengths[i]]] = i
offs[lengths[i]] += 1
# ----------------------
# -- decode functions --
# ----------------------
# get one bit from source stream
# d: TINF_DATA
# returns: int
func tinf_getbit(d):
var bit = 0
d['bitcount'] -= 1
if !(d['bitcount'] + 1) :
d['tag'] = d['source'][d['sourcePtr']]
d['sourcePtr'] += 1
d['bitcount'] = 7
bit = d['tag'] & 0x01
d['tag'] >>= 1
return bit
# read a num bit value from a stream and add base
# d: TINF_DATA
# num: int
# base: int
func tinf_read_bits(d, num, base):
var val = 0
if num:
var limit = 1 << num
var mask = 1
while mask < limit:
if tinf_getbit(d):
val += mask
mask *= 2
return val + base
# given a data stream and a tree, decode a symbol
# d: TINF_DATA
# t: TINF_TREE
func tinf_decode_symbol(d, t):
var sum = 0
var cur = 0
var length = 0
while true:
cur = 2 * cur + tinf_getbit(d)
length += 1
sum += t['table'][length]
cur -= t['table'][length]
if cur < 0:
break
return t['trans'][sum + cur]
# given a data stream, decode dynamic trees from it
# d: TINF_DATA
# lt: TINF_TREE
# dt: TINF_TREE
func tinf_decode_trees(d, lt, dt):
var code_tree = TINF_TREE.duplicate()
var lengths = make_pool_byte_array(288 + 32)
var hlit = 0
var hdist = 0
var hclen = 0
# var i = 0
var num = 0
var length = 0
# get 5 bits HLIT (257-286)
hlit = tinf_read_bits(d, 5, 257)
# get 5 bits HDIST (1-32)
hdist = tinf_read_bits(d, 5, 1)
# get 4 bits HCLEN (4-19)
hclen = tinf_read_bits(d, 4, 4)
for i in range(0, 19):
lengths[i] = 0
for i in range(0, hclen):
var clen = tinf_read_bits(d, 3, 0)
lengths[clcidx[i]] = clen
# build code length tree
tinf_build_tree(code_tree, lengths, 19)
while num < hlit + hdist:
var sym = tinf_decode_symbol(d, code_tree)
match sym:
16:
var prev = lengths[num - 1]
length = tinf_read_bits(d, 2, 3)
while length != 0:
lengths[num] = prev
num += 1
length -= 1
17:
length = tinf_read_bits(d, 3, 3)
while length != 0:
lengths[num] = 0
num += 1
length -= 1
18:
length = tinf_read_bits(d, 7, 11)
while length != 0:
lengths[num] = 0
num += 1
length -= 1
_:
lengths[num] = sym
num += 1
# build dynamic trees
tinf_build_tree(lt, lengths, hlit)
tinf_build_tree(dt, lengths.subarray(hlit, lengths.size() - 1), hdist)
# -----------------------------
# -- block inflate functions --
# -----------------------------
# given a stream and two trees, inflate a block of data
# d: TINF_DATA
# lt: TINF_TREE
# dt: TINF_TREE
func tinf_inflate_block_data(d, lt, dt):
var start = d['destPtr']
while true:
var sym = tinf_decode_symbol(d, lt)
if sym == 256:
d['destLen'] += d['destPtr'] - start
return TINF_OK
if sym < 256:
d['dest'][d['destPtr']] = sym
d['destPtr'] += 1
else:
var length = 0
var dist = 0
var offs = 0
# var i = 0
var ptr = d['destPtr']
sym -= 257
length = tinf_read_bits(d, base_tables['length_bits'][sym], base_tables['length_base'][sym])
dist = tinf_decode_symbol(d, dt)
# possibly get more bits from distance code
offs = tinf_read_bits(d, base_tables['dist_bits'][dist], base_tables['dist_base'][dist])
for i in range(0, length):
d['dest'][ptr + i] = d['dest'][ptr + (i - offs)]
d['destPtr'] += length
# inflate an uncompressed block of data */
# d: TINF_DATA
func tinf_inflate_uncompressed_block(d):
var length = 0
var invlength = 0
var i = 0
# get length
length = d['source'][d['sourcePtr'] + 1]
length = 256 * length + d['source'][d['sourcePtr']]
# get one's complement of length
invlength = d['source'][d['sourcePtr'] + 3]
invlength = 256 * invlength + d['source'][d['sourcePtr'] + 2]
if length != ~invlength & 0x0000ffff:
return TINF_DATA_ERROR
d['sourcePtr'] += 4
i = length
while i:
d['dest'][d['destPtr']] = d['source'][d['sourcePtr']]
d['destPtr'] += 1
d['sourcePtr'] += 1
i -= 1
d['bitcount'] = 0
d['destLen'] += length
return TINF_OK
# inflate a block of data compressed with fixed huffman trees
# d: TINF_DATA
# returns: int
func tinf_inflate_fixed_block(d):
# decode block using fixed trees
return tinf_inflate_block_data(d, sltree, sdtree)
# inflate a block of data compressed with dynamic huffman trees
# d: TINF_DATA
# returns: int
func tinf_inflate_dynamic_block(d):
# decode trees from stream
tinf_decode_trees(d, d['ltree'], d['dtree'])
# decode block using decoded trees
return tinf_inflate_block_data(d, d['ltree'], d['dtree'])
# ----------------------
# -- public functions --
# ----------------------
func _init():
# build fixed huffman trees
tinf_build_fixed_trees(sltree, sdtree)
# build extra bits and base tables
tinf_build_bits_base('length', 4, 3)
tinf_build_bits_base('dist', 2, 1)
# fix a special case
base_tables['length_bits'][28] = 0
base_tables['length_base'][28] = 258
# inflate stream from source to dest
func tinf_uncompress(destLen, source):
var d = TINF_DATA.duplicate()
var dest = make_pool_byte_array(destLen)
var sourceSize = source.size()
d['source'] = source
d['dest'] = dest
destLen = 0
while true:
var btype = 0
var res = 0
# Skip final block flag
tinf_getbit(d)
# read block type (2 bits)
btype = tinf_read_bits(d, 2, 0)
match btype:
0:
# decompress uncompressed block
res = tinf_inflate_uncompressed_block(d)
1:
# decompress block with fixed huffman trees
res = tinf_inflate_fixed_block(d)
2:
# decompress block with dynamic huffman trees
res = tinf_inflate_dynamic_block(d)
_:
return false
if res != TINF_OK:
return false
# When we have consumed the entire source, we're done
if d['sourcePtr'] >= sourceSize:
break
return d['dest']

View File

@ -0,0 +1,6 @@
[plugin]
name="gdunzip"
description="A script for browsing and uncompressing ZIP files."
author="Jelle Hermsen"
version="1.0.0"
script="gdunzip.gd"

BIN
modelviewer.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 162 KiB

34
modelviewer.png.import Normal file
View File

@ -0,0 +1,34 @@
[remap]
importer="texture"
type="StreamTexture"
path="res://.import/modelviewer.png-e5bc2ce62b9d535c1fb6eb14f8affdcb.stex"
metadata={
"vram_texture": false
}
[deps]
source_file="res://modelviewer.png"
dest_files=[ "res://.import/modelviewer.png-e5bc2ce62b9d535c1fb6eb14f8affdcb.stex" ]
[params]
compress/mode=0
compress/lossy_quality=0.7
compress/hdr_mode=0
compress/bptc_ldr=0
compress/normal_map=0
flags/repeat=0
flags/filter=true
flags/mipmaps=false
flags/anisotropic=false
flags/srgb=2
process/fix_alpha_border=true
process/premult_alpha=false
process/HDR_as_SRGB=false
process/invert_color=false
stream=false
size_limit=0
detect_3d=true
svg/scale=1.0

View File

@ -23,14 +23,14 @@ class ObjectManager:
assert(checksum == 0x6608F101) assert(checksum == 0x6608F101)
var meta_info_offset = file.get_32() var meta_info_offset = file.get_32()
file.seek(meta_info_offset) file.seek(meta_info_offset)
var unk = file.get_32() var _unk = file.get_32()
var entries_count = file.get_32() var entries_count = file.get_32()
for i in range(entries_count): for _i in range(entries_count):
var compressed_size = file.get_32() var _compressed_size = file.get_32()
var original_size = file.get_32() var _original_size = file.get_32()
var file_time = file.get_32() var _file_time = file.get_32()
var content_offset = file.get_32() + 16 var _content_offset = file.get_32() + 16
var compression = file.get_8() var _compression = file.get_8()
var name_length = file.get_8() var name_length = file.get_8()
var name = file.get_buffer(name_length).get_string_from_ascii() var name = file.get_buffer(name_length).get_string_from_ascii()
name = name.to_lower() name = name.to_lower()
@ -51,12 +51,12 @@ class ObjectManager:
assert(checksum == 0x6608F101) assert(checksum == 0x6608F101)
var meta_info_offset = file.get_32() var meta_info_offset = file.get_32()
file.seek(meta_info_offset) file.seek(meta_info_offset)
var unk = file.get_32() var _unk = file.get_32()
var entries_count = file.get_32() var entries_count = file.get_32()
for i in range(entries_count): for _i in range(entries_count):
var compressed_size = file.get_32() var compressed_size = file.get_32()
var original_size = file.get_32() var original_size = file.get_32()
var file_time = file.get_32() var _file_time = file.get_32()
var content_offset = file.get_32() + 16 var content_offset = file.get_32() + 16
var compression = file.get_8() var compression = file.get_8()
var name_length = file.get_8() var name_length = file.get_8()
@ -77,8 +77,9 @@ class ObjectManager:
func load_model(gbs_file: String): func load_model(gbs_file: String):
gbs_file = gbs_file.to_lower() gbs_file = gbs_file.to_lower()
var pos = 0
var gbs_stream = read_file_in_gzp(gbs_file) var gbs_stream = read_file_in_gzp(gbs_file)
if not gbs_stream:
return null
var model = load("res://model.gd").Model.new() var model = load("res://model.gd").Model.new()
var modelitem_gd = load("res://modelitem.gd") var modelitem_gd = load("res://modelitem.gd")
model.magic = gbs_stream.get_32() model.magic = gbs_stream.get_32()
@ -116,7 +117,7 @@ class ObjectManager:
model.point_uv[s][0] = gbs_stream.get_float() model.point_uv[s][0] = gbs_stream.get_float()
model.point_uv[s][1] = gbs_stream.get_float() model.point_uv[s][1] = gbs_stream.get_float()
for s in range(model.points): for _s in range(model.points):
var r = gbs_stream.get_8() var r = gbs_stream.get_8()
var g = gbs_stream.get_8() var g = gbs_stream.get_8()
var b = gbs_stream.get_8() var b = gbs_stream.get_8()
@ -198,21 +199,21 @@ class ObjectManager:
func load_texture(texture_file: String) -> ImageTexture: func load_texture(texture_file: String) -> ImageTexture:
print("Loading texture "+texture_file) print("Loading texture "+texture_file)
var tmpDirectory = Directory.new() var tmpDirectory = Directory.new()
if not tmpDirectory.dir_exists("res://tmp"): if not tmpDirectory.dir_exists("user://tmp"):
tmpDirectory.make_dir("res://tmp") tmpDirectory.make_dir("user://tmp")
var stream = read_file_in_gzp(texture_file) var stream = read_file_in_gzp(texture_file)
if stream == null: if stream == null:
return null return null
var tmpFile = File.new() var tmpFile = File.new()
tmpFile.open("res://tmp/"+texture_file, File.WRITE) tmpFile.open("user://tmp/"+texture_file, File.WRITE)
tmpFile.store_buffer(stream.data_array) tmpFile.store_buffer(stream.data_array)
print("Saved to: "+tmpFile.get_path_absolute()) print("Saved to: "+tmpFile.get_path_absolute())
tmpFile.close() tmpFile.close()
var img = Image.new() var img = Image.new()
var tex = ImageTexture.new() var tex = ImageTexture.new()
img.load("res://tmp/"+texture_file) img.load("user://tmp/"+texture_file)
tex.create_from_image(img) tex.create_from_image(img)
tmpDirectory.remove("res://tmp/"+texture_file) tmpDirectory.remove("user://tmp/"+texture_file)
return tex return tex
func load_model_mesh(model) -> MeshInstance: func load_model_mesh(model) -> MeshInstance:

950
objlist.txt Normal file
View File

@ -0,0 +1,950 @@
1 xx_kabuto_flick.bin kb_l0
1 xx_kabutolev1.bin kb_l0 kb_l1 kb_l2 kb_l3 kb_l4 kb_l5 kb_l6 kb_l7
2 xx_mecc_flick.bin mc_l0 mc_l1 mc_l2 mc_l3 mc_l4 mc_l5 mc_l6 mc_l7
2 xx_mecclev1.bin mc_l0 mc_l1 mc_l2 mc_l3 mc_l4 mc_l5 mc_l6 mc_l7
3 xx_reaper_flick.bin rp_l0 rp_l1 rp_l2 rp_l3 rp_l4 rp_l5 rp_l6 rp_l7
3 xx_reaperlev1.bin rp_l0 rp_l1 rp_l2 rp_l3 rp_l4 rp_l5 rp_l6 rp_l7
4 xx_lander.bin m_lander_l0
8 xx_vimp.bin vp_l1 vp_l2 vp_l3 vp_l4 vp_l5 vp_l6 vp_l7
11 xx_smartie.bin sm_l0 sm_l1 sm_l2 sm_l3 sm_l4 sm_l5 sm_l6 sm_l7
14 xx_mecc_flick.bin mc_bullet
14 xx_mecclev1.bin mc_bullet
14 xx_rpman_weapons.bin mc_bullet
21 xx_mecc_flick.bin mc_gun_l0 mc_gun_l1 mc_gun_l2 mc_gun_l3 mc_gun_l4 mc_gun_l5
21 xx_mecclev1.bin mc_gun_l0 mc_gun_l1 mc_gun_l2 mc_gun_l3 mc_gun_l4 mc_gun_l5
21 xx_rpman_weapons.bin mc_gun_l0 mc_gun_l1 mc_gun_l2 mc_gun_l3 mc_gun_l4 mc_gun_l5
22 xx_mecc_flick.bin mc_shotgun_l0 mc_shotgun_l1 mc_shotgun_l2 mc_shotgun_l3 mc_shotgun_l4 mc_shotgun_l5
22 xx_mecclev1.bin mc_shotgun_l0 mc_shotgun_l1 mc_shotgun_l2 mc_shotgun_l3 mc_shotgun_l4 mc_shotgun_l5
22 xx_rpman_weapons.bin mc_shotgun_l0 mc_shotgun_l1 mc_shotgun_l2 mc_shotgun_l3 mc_shotgun_l4 mc_shotgun_l5
23 xx_mecclev1.bin mc_syringe
23 xx_rpman_weapons.bin mc_syringe
24 xx_reaper_spells.bin rw_tornado
25 xx_mecclev1.bin mc_laser
25 xx_rpman_weapons.bin mc_laser
28 xx_mecc_flick.bin mc_beamring
28 xx_mecclev1.bin mc_beamring
28 xx_rpman_weapons.bin mc_beamring
29 xx_mecclev1.bin mc_lasergun
29 xx_rpman_weapons.bin mc_lasergun
30 xx_raik.bin rp_bow rp_bow_l1 rp_bow_l2 rp_bow_l3 rp_bow_l4 rp_bow_l5
30 xx_reaper_flick.bin rp_bow rp_bow_l1 rp_bow_l2 rp_bow_l3 rp_bow_l4 rp_bow_l5
30 xx_reaperlev1.bin rp_bow rp_bow_l1 rp_bow_l2 rp_bow_l3 rp_bow_l4 rp_bow_l5
31 xx_efx.bin rp_glow
33 xx_reaperlev1.bin rw_warning
34 xx_reaperlev1.bin rparrow
35 xx_reaperlev1.bin rp_fire
36 xx_mecclev1.bin mcbush
36 xx_rpman_weapons.bin mcbush
37 xx_efx.bin rp_glow
38 xx_mecc_flick.bin mc_zip
38 xx_mecclev1.bin mc_zip
38 xx_rpman_weapons.bin mc_zip
40 xx_reaper_spells.bin mr_invisible
42 xx_mecc_flick.bin mc_gun_l0 mc_gun_l1 mc_gun_l2 mc_gun_l3 mc_gun_l4 mc_gun_l5
42 xx_mecclev1.bin mc_gun_l0 mc_gun_l1 mc_gun_l2 mc_gun_l3 mc_gun_l4 mc_gun_l5
42 xx_rpman_weapons.bin mc_gun_l0 mc_gun_l1 mc_gun_l2 mc_gun_l3 mc_gun_l4 mc_gun_l5
43 xx_mecc_flick.bin mc_bullet
43 xx_mecclev1.bin mc_bullet
43 xx_rpman_weapons.bin mc_bullet
44 xx_permanentaliens.bin ex_flash
45 xx_permanentaliens.bin ex_smoke_ring
49 xx_permanentaliens.bin mr_invisible mr_invisible
53 xx_smartie_stuff.bin pub pub_l1 pub_l2 pub_l3 pub_l4
60 xx_mecclev1.bin mc_turret mc_turret_l1 mc_turret_l2 mc_turret_l3 mc_turret_l4
60 xx_rpman_weapons.bin mc_turret mc_turret_l1 mc_turret_l2 mc_turret_l3 mc_turret_l4
71 xx_efx.bin sm_glow
73 xx_ripper.bin ripper rip_l1 rip_l2 rip_l3 rip_l4 rip_l5 rip_l6
74 xx_efx.bin smoke
75 xx_seamonster.bin rm_seamonster rm_seamonster_l1 rm_seamonster_l2 rm_seamonster_l3 rm_seamonster_l4 rm_seamonster_l5 rm_seamonster_l6
78 xx_rocks.bin rock_1
79 xx_rocks.bin rock_2
84 xx_mecc_flick.bin mcthrust
84 xx_mecclev1.bin mcthrust
84 xx_rpman_weapons.bin mcthrust
85 xx_mecc_flick.bin mcthrust2
85 xx_mecclev1.bin mcthrust2
85 xx_rpman_weapons.bin mcthrust2
90 xx_ripper.bin ripspit
91 xx_rocks.bin rock_3 rock_3
92 xx_plants.bin b_pod b_pod_l1 b_pod_l2
93 xx_plants.bin b_bush b_bush_l1
101 xx_ptree.bin ptree
102 xx_ptree.bin ptree_bob ptree_bob_l1 ptree_bob_l2 ptree_bob_l3 ptree_bob_l4 ptree_bob_l5 ptree_bob_l6 ptree_bob_l7
109 xx_efx.bin dust
118 xx_bridge.bin bridge
121 xx_efx.bin water_rings
121 xx_water_rings.bin water_rings
123 xx_birds.bin flak_l0 flak_l1
124 xx_birds.bin lobird_l0
125 xx_ptree.bin b_leaf1
127 xx_mecclev1.bin mcflag
127 xx_rpman_weapons.bin mcflag
128 xx_fish.bin shiner
129 xx_plants.bin s_weeds
130 xx_plants.bin b_lilly
133 xx_mecclev1_nothrust.bin mc_nothrust_l0
135 xx_efx.bin m_blueglow
137 xx_efx.bin water_drip
137 xx_water_rings.bin water_drip
138 xx_plants.bin s_flower1
208 xx_lander.bin mecc_crash1
215 xx_reaperman.bin rpman_l0 rpman_l1 rpman_l2 rpman_l3 rpman_l4 rpman_l5 rpman_l6 rpman_l7
216 xx_smfemale.bin smf_l0 smf_l1 smf_l2 smf_l3 smf_l4 smf_l5 smf_l6
218 xx_ripper.bin ripnest
219 xx_ripper.bin mound
220 xx_ripper.bin dirt1
223 xx_birds.bin feather1
224 xx_reaperman.bin rpm_horn rpm_horn_l1 rpm_horn_l2 rpm_horn_l3 rpm_horn_l4
226 xx_ripper.bin ripnest_x
229 xx_ripper.bin ripper rip_l1 rip_l2 rip_l3 rip_l4 rip_l5 rip_l6
230 xx_ripper.bin ripper rip_l1 rip_l2 rip_l3 rip_l4 rip_l5 rip_l6
232 xx_ripper.bin ripspitbig
235 xx_smartie_stuff.bin sm_fork
236 xx_smartie_stuff.bin sm_knife
240 xx_reaperman.bin rpman_spear rpman_spear_l1 rpman_spear_l2 rpman_spear_l3 rpman_spear_l4
245 xx_plants.bin mcbush
247 xx_bridge.bin bridge_end
254 xx_mecc_flick.bin mcjetpack
254 xx_mecclev1.bin mcjetpack
254 xx_rpman_weapons.bin mcjetpack
256 xx_bridge.bin bridge_100ft
257 xx_bridge.bin bridge_200ft
258 xx_bridge.bin bridge_300ft
270 xx_bigwalls.bin bw_arch_100
271 xx_bigwalls.bin bw_arch_150
272 xx_bigwalls.bin bw_arch_200
273 xx_bigwalls.bin bw_corner
274 xx_bigwalls.bin bw_wall_100
275 xx_reaperman.bin rpman_tracer
276 xx_offspring.bin rpman_grenade rpman_grenade_l1
276 xx_reaperman.bin rpman_grenade rpman_grenade_l1
276 xx_seamonster.bin rpman_grenade rpman_grenade_l1
300 xx_mecc_flick.bin mc_machinegun_l0 mc_machinegun_l1 mc_machinegun_l2 mc_machinegun_l3 mc_machinegun_l4 mc_machinegun_l5
300 xx_mecclev1.bin mc_machinegun_l0 mc_machinegun_l1 mc_machinegun_l2 mc_machinegun_l3 mc_machinegun_l4 mc_machinegun_l5
300 xx_rpman_weapons.bin mc_machinegun_l0 mc_machinegun_l1 mc_machinegun_l2 mc_machinegun_l3 mc_machinegun_l4 mc_machinegun_l5
301 xx_mecc_flick.bin mc_grenade_l0 mc_grenade
301 xx_mecclev1.bin mc_grenade_l0 mc_grenade
301 xx_rpman_weapons.bin mc_grenade_l0 mc_grenade
302 xx_mecclev1.bin mc_shotgun_l0 mc_shotgun_l1 mc_shotgun_l2 mc_shotgun_l3 mc_shotgun_l4 mc_shotgun_l5
302 xx_rpman_weapons.bin mc_shotgun_l0 mc_shotgun_l1 mc_shotgun_l2 mc_shotgun_l3 mc_shotgun_l4 mc_shotgun_l5
303 xx_mecclev1.bin mc_machinegun_l0 mc_machinegun_l1 mc_machinegun_l2 mc_machinegun_l3 mc_machinegun_l4 mc_machinegun_l5
303 xx_rpman_weapons.bin mc_machinegun_l0 mc_machinegun_l1 mc_machinegun_l2 mc_machinegun_l3 mc_machinegun_l4 mc_machinegun_l5
311 xx_reaper_flick.bin rp_l3 rp_l4 rp_l5 rp_l6 rp_l7
311 xx_reaperlev1.bin rp_l7
312 xx_reaperlev1.bin rp_sword_trail
506 xx_smartie_stuff.bin sm_boat_l0
507 xx_smartie_stuff.bin sm_cart_l0
508 xx_smartie_stuff.bin sm_chimney_l0
509 xx_smartie_stuff.bin sm_dome_l0 sm_dome_l1 sm_dome_l2 sm_dome_l3 sm_dome_l4
510 xx_smartie_stuff.bin sm_domed1_l0
511 xx_smartie_stuff.bin sm_door_l0 sm_door_l1 sm_door_l2 sm_door_l3
512 xx_smartie_stuff.bin sm_fences_l0
513 xx_smartie_stuff.bin sm_seat_l0
514 xx_smartie_stuff.bin sm_table_l0
515 xx_smartie_stuff.bin sm_tower_l0
516 xx_smartie_stuff.bin sm_well_l0
517 xx_smartie_stuff.bin sm_window_l0 sm_window_l1 sm_window_l2
518 xx_smartie_stuff.bin sm_tube_l0 sm_tube_l1 sm_tube_l2
519 xx_smartie_stuff.bin sm_ladder_l0
520 xx_smartie_stuff.bin sm_fences2_l0
521 xx_smartie_stuff.bin sm_post_l0
522 xx_smartie_stuff.bin sm_hatch_l0
523 xx_smartie_stuff.bin sm_vconnect1
524 xx_smartie_stuff.bin sm_vconnect2
525 xx_smartie_stuff.bin sm_sphere sm_sphere_l1 sm_sphere_l2
527 xx_smartie_stuff.bin sm_sphere2
528 xx_bridge.bin bridge_400ft
529 xx_smartie_stuff.bin sm_spheredark sm_spheredark_l1 sm_spheredark_l2
530 xx_smartie_stuff.bin sm_spheredark2
531 xx_smartie_stuff.bin sm_post_tall
532 xx_bridge.bin bridge_500ft
533 xx_pier.bin pier_straight
534 xx_pier.bin pier_bend90
535 xx_pier.bin pier_round_rings
536 xx_pier.bin pier_round_tile
537 xx_pier.bin pier_square
538 xx_pier.bin pier_post20
539 xx_pier.bin pier_post30
540 xx_pier.bin pier_post40
541 xx_shadows.bin shadow_round
542 xx_shadows.bin shadow_elipse
543 xx_shadows.bin shadow_elipse2
544 xx_smartie_stuff.bin smw_entrance
545 xx_smartie_stuff.bin smw_curvehi
546 xx_smartie_stuff.bin smw_column
547 xx_smartie_stuff.bin smw_curvemed
548 xx_smartie_stuff.bin smw_curvelow
549 xx_smartie_stuff.bin smw_column2
550 xx_smartie_stuff.bin smw_cwall_low
551 xx_smartie_stuff.bin smw_wall_hi
552 xx_smartie_stuff.bin smw_wall_med
553 xx_smartie_stuff.bin smw_wall_hi_hole
555 xx_bigwalls.bin bw_gate_portcullis
556 xx_bigwalls.bin bw_wall_150
557 xx_bigwalls.bin bw_wall_200
558 xx_bigwalls.bin bw_parapit
558 xx_bigwalls_lite.bin bw_parapit
559 xx_bigwalls.bin bw_sr_arch_100
560 xx_bigwalls.bin bw_sr_corner
562 xx_verm.bin verm_l0 verm_l2 verm_l4 verm_l5 verm_l6 verm_l7
563 xx_pier.bin canopy_1
564 xx_pier.bin bent_post
565 xx_pier.bin pier_straight_80
566 xx_pier.bin pier_straight_160
567 xx_bigwalls.bin bw_column_20
567 xx_bigwalls_lite.bin bw_column_20
568 xx_bigwalls.bin bw_column_30
568 xx_bigwalls_lite.bin bw_column_30
569 xx_bigwalls.bin bw_column_40
569 xx_bigwalls_lite.bin bw_column_40
570 xx_bigwalls.bin bw_column_60
570 xx_bigwalls_lite.bin bw_column_60
571 xx_verm.bin verm_egg_l0
572 xx_verm.bin verm_l0 verm_l2 verm_l4 verm_l5 verm_l6 verm_l7
574 xx_charger.bin charger charger_l1 charger_l2 charger_l3 charger_l4 charger_l5 charger_l6
575 xx_sonak.bin sonak_l0 sonak_l1 sonak_l2 sonak_l3 sonak_l4 sonak_l5 sonak_l6
576 xx_verm.bin verm_egg_d1_l0
577 xx_verm.bin verm_eggshell1
578 xx_bigwalls.bin bw_bunker1
579 xx_bigwalls.bin bw_top_platform
580 xx_bigwalls.bin bw_top_connect1
583 xx_smtimmy.bin smtimmy_l0 smtimmy_l1 smtimmy_l2 smtimmy_l3 smtimmy_l4 smtimmy_l5 smtimmy_l6
583 xx_smtimmy_flick.bin smtimmy_l0
584 xx_smborjoyzee.bin smborjoyzee_l0 smborjoyzee_l1 smborjoyzee_l2 smborjoyzee_l3 smborjoyzee_l4 smborjoyzee_l5 smborjoyzee_l6
584 xx_smborjoyzee_flick.bin smborjoyzee_l0 sm_l7
586 xx_sonak.bin sonak_seat_l0
587 xx_bigwalls.bin bw_wall_100_window
588 xx_bigwalls.bin bw_bunker_low
589 xx_smartie_stuff.bin smw_curvehi_m
590 xx_smartie_stuff.bin smw_house1 smw_house1_l1 smw_house1_l2 smw_house1_l3 smw_house1_l4
591 xx_smartie_stuff.bin smw_house2 smw_house2_l1 smw_house2_l2 smw_house2_l3 smw_house2_l4
592 xx_smartie_stuff.bin smw_house3 smw_house3_l1 smw_house3_l2 smw_house3_l3 smw_house3_l4
593 xx_smartie_stuff.bin smw_house4 smw_house4_l1 smw_house4_l2 smw_house4_l3 smw_house4_l4
594 xx_smartie_stuff.bin smw_curvemed_m
595 xx_smartie_stuff.bin smw_curvelow_m
596 xx_smartie_stuff.bin sm_canopy_1_blue
597 xx_smartie_stuff.bin sm_canopy_1_red
598 xx_smartie_stuff.bin sm_canopy_1_green
599 xx_smartie_stuff.bin sm_panel
601 xx_bigwalls.bin bw_sr_arch_150
602 xx_bigwalls.bin bw_sr_arch_200
606 xx_smartie_stuff.bin sm_raft_l0
607 xx_sonak.bin sonak_ring
609 xx_ptree.bin ptree_simple
610 xx_reaperman.bin rpman_tracer
611 xx_bigwalls.bin bw_debri_piece1
611 xx_bigwalls_lite.bin bw_debri_piece1
612 xx_bigwalls.bin bw_debri_piece2
612 xx_bigwalls_lite.bin bw_debri_piece2
613 xx_bigwalls.bin bw_debri_piece3
613 xx_bigwalls_lite.bin bw_debri_piece3
614 xx_bigwalls.bin bw_debri_piece4
614 xx_bigwalls_lite.bin bw_debri_piece4
615 xx_bigwalls.bin bw_debri_column1
615 xx_bigwalls_lite.bin bw_debri_column1
616 xx_bigwalls.bin bw_debri_column2
616 xx_bigwalls_lite.bin bw_debri_column2
617 xx_bigwalls.bin bw_debri_bunker1
617 xx_bigwalls_lite.bin bw_debri_bunker1
618 xx_shadows.bin shadow_blastmark_1
619 xx_shadows.bin shadow_blastmark_2
620 xx_effects.bin dust_ring
621 xx_effects.bin water_spray
622 xx_effects.bin dust_blast
623 xx_mecc_base.bin muzzle_flash
623 xx_reaper_base.bin muzzle_flash
623 xx_reaperman.bin muzzle_flash
625 xx_reaperman.bin rpman_gunseat_l0
627 xx_mecc_base.bin muzzle_flash2
627 xx_reaper_base.bin muzzle_flash2
627 xx_reaperman.bin muzzle_flash2
628 xx_effects.bin dust_flash
646 xx_effects.bin shrap_ground
647 xx_mecclev1.bin mc_pickup_shells
647 xx_rpman_weapons.bin mc_pickup_shells
648 xx_mecclev1.bin mc_pickup_clips
648 xx_rpman_weapons.bin mc_pickup_clips
649 xx_mecclev1.bin mc_pickup_health
649 xx_rpman_weapons.bin mc_pickup_health
650 xx_mecclev1.bin mc_pickup_grenades
650 xx_rpman_weapons.bin mc_pickup_grenades
651 xx_mecclev1.bin mcbush
651 xx_rpman_weapons.bin mcbush
652 xx_bigwalls.bin bw_bunker1_d1
652 xx_bigwalls_lite.bin bw_bunker1_d1
653 xx_bigwalls.bin bw_bunker_top
654 xx_bigwalls.bin bw_bunker_low_d1
654 xx_bigwalls_lite.bin bw_bunker_low_d1
655 xx_bigwalls.bin bw_column_20_d1
655 xx_bigwalls_lite.bin bw_column_20_d1
656 xx_bigwalls.bin bw_column_30_d1
656 xx_bigwalls_lite.bin bw_column_30_d1
657 xx_bigwalls.bin bw_column_40_d1
657 xx_bigwalls_lite.bin bw_column_40_d1
658 xx_bigwalls.bin bw_column_60_d1
658 xx_bigwalls_lite.bin bw_column_60_d1
659 xx_bigwalls.bin bw_parapit_d1
659 xx_bigwalls_lite.bin bw_parapit_d1
660 xx_mecc_flick.bin mc_machinegun_shell
660 xx_mecclev1.bin mc_machinegun_shell
660 xx_rpman_weapons.bin mc_machinegun_shell
662 xx_guard_buildings.bin muzzle_flash
662 xx_guard_turrets.bin muzzle_flash
662 xx_mecc_base.bin muzzle_flash
662 xx_mecc_flick.bin muzzle_flash
662 xx_mecclev1.bin muzzle_flash
662 xx_reaper_base.bin muzzle_flash
662 xx_rpman_weapons.bin muzzle_flash
663 xx_guard_buildings.bin muzzle_flash2
663 xx_guard_turrets.bin muzzle_flash2
663 xx_mecc_base.bin muzzle_flash2
663 xx_mecc_flick.bin muzzle_flash2
663 xx_mecclev1.bin muzzle_flash2
663 xx_reaper_base.bin muzzle_flash2
663 xx_rpman_weapons.bin muzzle_flash2
664 xx_ptree.bin ptree_bob_d1
665 xx_smborjoyzee.bin sm_staff
665 xx_smborjoyzee_flick.bin sm_staff
666 xx_rpqueen.bin rpqueen_l0 rpqueen_l1 rpqueen_l2 rpqueen_l3 rpqueen_l4 rpqueen_l5 rpqueen_l6 rpqueen_l7
666 xx_rpqueen_flick.bin rpqueen_l0
667 xx_mecc_flick.bin blast_ring
667 xx_mecclev1.bin blast_ring
667 xx_rpman_weapons.bin blast_ring
668 xx_mecc_flick.bin mc_shotgun_blast
668 xx_mecclev1.bin mc_shotgun_blast
668 xx_rpman_weapons.bin mc_shotgun_blast
669 xx_raik.bin rp_sword rp_sword_l1 rp_sword_l2 rp_sword_l3 rp_sword_l4 rp_sword_l5
669 xx_reaper_flick.bin rp_sword rp_sword_l1 rp_sword_l2 rp_sword_l3 rp_sword_l4 rp_sword_l5
669 xx_reaperlev1.bin rp_sword rp_sword_l1 rp_sword_l2 rp_sword_l3 rp_sword_l4 rp_sword_l5
670 xx_smartie_stuff.bin sm_borj_house_l0 sm_borj_house_l1 sm_borj_house_l2 sm_borj_house_l3 sm_borj_house_l4 sm_borj_house_l5 sm_borj_house_l6
671 xx_effects.bin dust_ball
672 xx_effects.bin dust_smoke
677 xx_kab_stuff.bin mud_ball
678 xx_kab_stuff.bin hot_rock
679 xx_markers.bin marker
680 xx_rocks.bin rock_rpman_1
681 xx_rocks.bin rock_rpman_2
682 xx_kab_stuff.bin hot_rock_d
683 xx_guard_log_launcher.bin log_carrier
685 xx_permanentaliens.bin cleaner_l0 cleaner_l1 cleaner_l2
686 xx_guard_barracks.bin barracks barracks_l1 barracks_l2 barracks_l3 barracks_l4 barracks_l5
687 xx_rocks.bin rock_rpman_3
688 xx_guard_log_launcher.bin log_launcher
689 xx_guard_log_launcher.bin log_launcher_base
690 xx_birds.bin hitcher
693 xx_reaperman.bin rpman_tuba rpman_tuba_l1 rpman_tuba_l2 rpman_tuba_l3 rpman_tuba_l4
696 xx_effects.bin cast_spell
697 xx_effects.bin rain
702 xx_reaperlev1.bin rpbomb
705 xx_bridge.bin bridge_200ft_d
706 xx_bigwalls.bin bw_column_40_b
706 xx_bigwalls_lite.bin bw_column_40_b
707 xx_smartie_stuff.bin apple
709 xx_mecc_base.bin wood_wall wood_wall_l1 wood_wall_l2 wood_wall_l3
710 xx_mecc_base.bin wood_gift wood_gift_l1 wood_gift_l2 wood_gift_l3 wood_gift_l4 wood_gift_l5 wood_gift_l6
711 xx_mecc_base.bin wood_pub wood_pub_l1 wood_pub_l2 wood_pub_l3 wood_pub_l4 wood_pub_l5 wood_pub_l6
712 xx_mecc_base.bin wood_shop wood_shop_l1 wood_shop_l2 wood_shop_l3 wood_shop_l4 wood_shop_l5 wood_shop_l6
714 xx_mecc_base.bin stone_wall stone_wall_l1 stone_wall_l2 stone_wall_l3 stone_wall_l4
716 xx_mecc_base.bin stone_gift stone_gift_l1 stone_gift_l2 stone_gift_l3 stone_gift_l4 stone_gift_l5 stone_gift_l6
717 xx_mecc_base.bin stone_shop stone_shop_l1 stone_shop_l2 stone_shop_l3 stone_shop_l4 stone_shop_l5 stone_shop_l6
729 xx_reaper_base.bin extractor_1 extractor_1_l1 extractor_1_l2 extractor_1_l3 extractor_1_l4 extractor_1_l5 extractor_1_l6
730 xx_reaper_base.bin extractor_2 extractor_2_l1 extractor_2_l2 extractor_2_l3 extractor_2_l4 extractor_2_l5 extractor_2_l6
735 xx_reaper_base.bin spellshop_1 spellshop_1_l1 spellshop_1_l2 spellshop_1_l3 spellshop_1_l4 spellshop_1_l5 spellshop_1_l6
736 xx_reaper_base.bin spellshop_2 spellshop_2_l1 spellshop_2_l2 spellshop_2_l3 spellshop_2_l4 spellshop_2_l5 spellshop_2_l6
742 xx_smyan.bin smyan_l0 smyan_l1 smyan_l2 smyan_l3 smyan_l4 smyan_l5 smyan_l6
742 xx_smyan_flick.bin smyan_l0
744 xx_mecc_base.bin wood_gate wood_gate_l1 wood_gate_l2 wood_gate_l3 wood_gate_l4
745 xx_offspring.bin offspring_l0 offspring_l1 offspring_l2 offspring_l3 offspring_l4 offspring_l5 offspring_l6
746 xx_offspring.bin offspring_egg_l0
747 xx_offspring.bin offspring_egg_d1_l0
748 xx_offspring.bin offspring_eggshell1
749 xx_kabutolev1.bin kb_hotspot
750 xx_mecc_base.bin sm_firepit
752 xx_smartie_stuff.bin sm_table_full
753 xx_smartie_stuff.bin sm_shovel
754 xx_smartie_stuff.bin sm_tankard
755 xx_smartie_stuff.bin sm_hammer
756 xx_smartie_stuff.bin sm_saw
757 xx_smartie_stuff.bin sm_drumstick
758 xx_smartie_stuff.bin sm_ribs
759 xx_smartie_stuff.bin sm_pool
761 xx_smartie_stuff.bin sm_planks
762 xx_smartie_stuff.bin sm_woodshop_pile
763 xx_mecc_base.bin d_wood_shop d_wood_shop_l1 d_wood_shop_l2 d_wood_shop_l3 d_wood_shop_l4
764 xx_mecc_base.bin d_stone_gift d_stone_gift_l1 d_stone_gift_l2 d_stone_gift_l3 d_stone_gift_l4
765 xx_mecc_base.bin d_stone_shop d_stone_shop_l1 d_stone_shop_l2 d_stone_shop_l3 d_stone_shop_l4
768 xx_mecc_base.bin d_wood_gift d_wood_gift_l1 d_wood_gift_l2 d_wood_gift_l3 d_wood_gift_l4
769 xx_mecc_base.bin d_wood_wall d_wood_wall_l1 d_wood_wall_l2
771 xx_mecc_base.bin d_stone_wall d_stone_wall_l1 d_stone_wall_l2
772 xx_mecc_base.bin d_wood_gate d_wood_gate_l1 d_wood_gate_l2
773 xx_mecc_base.bin d_stone_gate d_stone_gate_l1 d_stone_gate_l2
775 xx_mecc_base.bin stone_gate stone_gate_l1 stone_gate_l2 stone_gate_l3 stone_gate_l4
779 xx_mecc_base.bin d_wood_pub d_wood_pub_l1 d_wood_pub_l2 d_wood_pub_l3 d_wood_pub_l4
781 xx_mecclev1.bin mcthrust_nitro
781 xx_rpman_weapons.bin mcthrust_nitro
782 xx_smartie_stuff.bin sm_bricks
783 xx_smartie_stuff.bin sm_metal
785 xx_mecc_flick.bin mc_launcher_l0 mc_launcher_l1 mc_launcher_l2 mc_launcher_l3 mc_launcher_l4 mc_launcher_l5
785 xx_mecclev1.bin mc_launcher_l0 mc_launcher_l1 mc_launcher_l2 mc_launcher_l3 mc_launcher_l4 mc_launcher_l5
785 xx_rpman_weapons.bin mc_launcher_l0 mc_launcher_l1 mc_launcher_l2 mc_launcher_l3 mc_launcher_l4 mc_launcher_l5
787 xx_mecc_flick.bin mc_snipergun_l0 mc_snipergun_l1 mc_snipergun_l2 mc_snipergun_l3 mc_snipergun_l4 mc_snipergun_l5
787 xx_mecclev1.bin mc_snipergun_l0 mc_snipergun_l1 mc_snipergun_l2 mc_snipergun_l3 mc_snipergun_l4 mc_snipergun_l5
787 xx_rpman_weapons.bin mc_snipergun_l0 mc_snipergun_l1 mc_snipergun_l2 mc_snipergun_l3 mc_snipergun_l4 mc_snipergun_l5
788 xx_sm_book.bin sm_book
788 xx_smartie_stuff.bin sm_book
788 xx_smyan_pagoda.bin sm_book
790 xx_mecc_flick.bin mc_mortar_l0 mc_mortar_l1 mc_mortar_l2 mc_mortar_l3 mc_mortar_l4 mc_mortar_l5
790 xx_mecclev1.bin mc_mortar_l0 mc_mortar_l1 mc_mortar_l2 mc_mortar_l3 mc_mortar_l4 mc_mortar_l5
790 xx_rpman_weapons.bin mc_mortar_l0 mc_mortar_l1 mc_mortar_l2 mc_mortar_l3 mc_mortar_l4 mc_mortar_l5
792 xx_mecclev1.bin mc_pickup_sn_clips
792 xx_rpman_weapons.bin mc_pickup_sn_clips
793 xx_mecclev1.bin mc_sniper_bullit
793 xx_rpman_weapons.bin mc_sniper_bullit
794 xx_efx.bin efx_flash
796 xx_efx.bin efx_debri1
797 xx_efx.bin efx_debri2
798 xx_efx.bin efx_fireball
799 xx_efx.bin efx_shockwave
800 xx_mecc_flick.bin mc_rocket
800 xx_mecclev1.bin mc_rocket
800 xx_rpman_weapons.bin mc_rocket
801 xx_mecclev1.bin mc_pickup_rockets
801 xx_rpman_weapons.bin mc_pickup_rockets
802 xx_mecclev1.bin mc_pickup_lbombs
802 xx_rpman_weapons.bin mc_pickup_lbombs
803 xx_mecc_flick.bin mc_rocket_proximity
803 xx_mecclev1.bin mc_rocket_proximity
803 xx_rpman_weapons.bin mc_rocket_proximity
804 xx_mecclev1.bin mc_pickup_proximity
804 xx_rpman_weapons.bin mc_pickup_proximity
805 xx_mecc_flick.bin mc_mine
805 xx_mecclev1.bin mc_mine mc_mine_l1 mc_mine_l2 mc_mine_l3 mc_mine_l4
805 xx_rpman_weapons.bin mc_mine mc_mine_l1 mc_mine_l2 mc_mine_l3 mc_mine_l4
806 xx_mecc_flick.bin mc_rocket_homing
806 xx_mecclev1.bin mc_rocket_homing
806 xx_rpman_weapons.bin mc_rocket_homing
807 xx_mecclev1.bin mc_pickup_homing
807 xx_rpman_weapons.bin mc_pickup_homing
808 xx_mecc_flick.bin mc_lbomb
808 xx_mecclev1.bin mc_lbomb
808 xx_rpman_weapons.bin mc_lbomb
809 xx_story4.bin s6_dungeon
810 xx_story4.bin s6_cage
811 xx_efx.bin efx_shockwave_w
813 xx_efx.bin efx_dustball
814 xx_efx.bin efx_smoke_black
815 xx_efx.bin efx_fire_trail
816 xx_efx.bin efx_shockwave_b
817 xx_efx.bin efx_ref_horiz_circle
818 xx_efx.bin efx_ref_sphere
819 xx_efx.bin efx_ref_plume
820 xx_efx.bin efx_bfire_trail
821 xx_efx.bin efx_ref_line_back
822 xx_mecc_flick.bin mc_popupbomb
822 xx_mecclev1.bin mc_popupbomb
822 xx_rpman_weapons.bin mc_popupbomb
823 xx_efx.bin efx_ref_line_up
824 xx_efx.bin efx_shockwave_bh
826 xx_efx.bin efx_smoke_blue
827 xx_efx.bin efx_gfire_trail
828 xx_efx.bin efx_smoke_mgrey
829 xx_efx.bin efx_sniper_flash
830 xx_snow_stuff.bin snowtree
830 xx_snowtree.bin snowtree
834 xx_mecc_base.bin sm_dropoff
834 xx_smartie_stuff.bin sm_dropoff
835 xx_smartie_stuff.bin base_flag_red
836 xx_smartie_stuff.bin base_flag_blue
837 xx_efx.bin efx_ref_line_l2r
839 xx_efx.bin efx_rain
840 xx_efx.bin efx_snow
841 xx_efx.bin efx_hail
846 xx_efx.bin efx_waterdrop
847 xx_efx.bin efx_glint
848 xx_efx.bin efx_bubble_reflection
849 xx_efx.bin efx_bubble_hilight
850 xx_efx.bin efx_bubble_glow
851 xx_reaper_base.bin rp_smartie_waiting
854 xx_efx.bin efx_water_ring
857 xx_reaper_base.bin sm_podium_reap
858 xx_reaper_base.bin sm_dropoff_reap
859 xx_efx.bin efx_vimp_ghost
861 xx_efx.bin efx_water_bubble
862 xx_efx.bin efx_ref_bubbles
866 xx_efx.bin efx_blast_area_check
867 xx_efx.bin efx_dust_ball
868 xx_efx.bin efx_dust_swirl
869 xx_efx.bin efx_mist
872 xx_efx.bin efx_smartie_spell
873 xx_efx.bin efx_ref_ground_hit
874 xx_efx.bin efx_snow_ball
875 xx_efx.bin efx_snow_swirl
882 xx_reaper_base.bin rp_soul_dropoff
883 xx_efx.bin efx_redlight
884 xx_efx.bin mr_invisible
885 xx_efx.bin efx_blue_wide
886 xx_efx.bin efx_blue_wide
887 xx_efx.bin efx_ref_spin
888 xx_efx.bin efx_ref_firewall
890 xx_efx.bin efx_fire
892 xx_mecclev1.bin mc_jetpack_2
892 xx_rpman_weapons.bin mc_jetpack_2
894 xx_efx.bin efx_slow_spell
897 xx_mecclev1.bin mc_repairpack
897 xx_rpman_weapons.bin mc_repairpack
898 xx_mecclev1.bin mc_repairgun
898 xx_rpman_weapons.bin mc_repairgun
899 xx_efx.bin efx_lightning
900 xx_efx.bin efx_wood_debri_1
901 xx_efx.bin efx_wood_debri_2
902 xx_mecclev1.bin mc_shield
902 xx_rpman_weapons.bin mc_shield
903 xx_reaperlev1.bin rp_head
904 xx_efx.bin efx_hail_missile
905 xx_efx.bin efx_hail_shrapnel
906 xx_efx.bin mc_chunk1
907 xx_efx.bin mc_chunk2
908 xx_efx.bin mc_chunk3
909 xx_efx.bin mc_chunk4
910 xx_efx.bin mc_chunk5
911 xx_efx.bin mc_chunk6
912 xx_efx.bin efx_metal_debri_1
913 xx_efx.bin efx_stone_debri_1
914 xx_efx.bin efx_splat
915 xx_efx.bin efx_spray
916 xx_efx.bin efx_blood
917 xx_efx.bin efx_build_select
918 xx_mecc_base.bin fun_house fun_house_l1 fun_house_l2 fun_house_l3 fun_house_l4 fun_house_l5 fun_house_l6
919 xx_efx.bin efx_mc_death
920 xx_mecclev1.bin mc_bushpack
920 xx_rpman_weapons.bin mc_bushpack
921 xx_efx.bin efx_circle_spell
922 xx_efx.bin efx_debri_3
923 xx_efx.bin efx_ref_circle_out
924 xx_efx.bin efx_ref_sphere_in
925 xx_efx.bin efx_rp_target
926 xx_efx.bin efx_prx_sphere
927 xx_efx.bin efx_fire_roll
928 xx_reaperlev1.bin rp_bow_homing rp_bow_homing_l1 rp_bow_homing_l2 rp_bow_homing_l3 rp_bow_homing_l4 rp_bow_homing_l5
929 xx_reaperlev1.bin rp_bow_sniper rp_bow_sniper_l1 rp_bow_sniper_l2 rp_bow_sniper_l3 rp_bow_sniper_l4 rp_bow_sniper_l5
930 xx_reaperlev1.bin rp_bow_rpg rp_bow_rpg_l1 rp_bow_rpg_l2 rp_bow_rpg_l3 rp_bow_rpg_l4 rp_bow_rpg_l5
931 xx_reaperlev1.bin rp_bow_powerup rp_bow_powerup_l1 rp_bow_powerup_l2 rp_bow_powerup_l3 rp_bow_powerup_l4 rp_bow_powerup_l5
932 xx_efx.bin efx_dark_fire
933 xx_efx.bin efx_box_alpha
934 xx_reaperlev1.bin rp_screamer
935 xx_efx.bin efx_bglow
936 xx_mecc_base.bin d_fun_house d_fun_house_l1 d_fun_house_l2 d_fun_house_l3 d_fun_house_l4
937 xx_tools.bin scott_test
938 xx_efx.bin efx_blooddrop
942 xx_efx.bin efx_ice_target
945 xx_offspring.bin offs_hotspot
946 xx_efx.bin efx_swirl
947 xx_efx.bin efx_lightning_1
948 xx_efx.bin efx_lightning_2
950 xx_efx.bin efx_rp_debri_1
951 xx_smartie_stuff.bin sm_flag
952 xx_smartie_stuff.bin sm_flag1
953 xx_smartie_stuff.bin sm_flag2
954 xx_smartie_stuff.bin sm_flag3
955 xx_efx.bin efx_sun_yellow
956 xx_efx.bin efx_sun_yellow_f
959 xx_efx.bin efx_clockhand_1
960 xx_efx.bin efx_clockhand_2
964 xx_efx.bin efx_bow_charged
965 xx_efx.bin efx_fire_ring
966 xx_efx.bin efx_splash
967 xx_reaper_base.bin d_spellshop_1 d_spellshop_1_l1 d_spellshop_1_l2 d_spellshop_1_l3 d_spellshop_1_l4
968 xx_reaper_base.bin d_spellshop_2 d_spellshop_2_l1 d_spellshop_2_l2 d_spellshop_2_l3 d_spellshop_2_l4
970 xx_reaper_base.bin d_extractor_2 d_extractor_2_l1 d_extractor_2_l2 d_extractor_2_l3 d_extractor_2_l4
977 xx_bones.bin bone_femur
978 xx_bones.bin bone_rib
979 xx_bones.bin bone_spine
980 xx_efx.bin efx_3dxhair
981 xx_mecc_base.bin mecc_base_template_1
983 xx_mecc_base.bin s_mecc_teleport s_mecc_teleport_l1 s_mecc_teleport_l2 s_mecc_teleport_l3
984 xx_mecc_base.bin s_mecc_gpad s_mecc_gpad_l1 s_mecc_gpad_l2 s_mecc_gpad_l3 s_mecc_gpad_l4 s_mecc_gpad_l4
985 xx_reaper_base.bin rp_base_template_1
986 xx_mecc_base.bin s_mecc_shop s_mecc_shop_l1 s_mecc_shop_l2 s_mecc_shop_l3 s_mecc_shop_l4 s_mecc_shop_l5 s_mecc_shop_l6
988 xx_mecc_base.bin s_mecc_tower s_mecc_tower_l1 s_mecc_tower_l2 s_mecc_tower_l3 s_mecc_tower_l4 s_mecc_tower_l5 s_mecc_tower_l6
989 xx_reaper_base.bin s_reaper_shop s_reaper_shop_l1 s_reaper_shop_l2 s_reaper_shop_l3 s_reaper_shop_l4 s_reaper_shop_l5 s_reaper_shop_l6
991 xx_mecc_base.bin gyro_l0
992 xx_plants.bin shrub1 shrub1_l1
993 xx_plants.bin shrub2
994 xx_plants.bin shrub3
996 xx_plants.bin shrub5 shrub5_l1 shrub5_l2 shrub5_l3
997 xx_plants.bin shrub6 shrub6_l1 shrub6_l2 shrub6_l3
998 xx_plants.bin shrub7 shrub7_l1 shrub7_l2 shrub7_l3
999 xx_plants.bin shrub8 shrub8_l1 shrub8_l2 shrub8_l3
1001 xx_story1.bin w_story1_hang
1002 xx_smartie_stuff.bin smw_house5 smw_house5_l1 smw_house5_l2 smw_house5_l3 smw_house5_l4
1003 xx_smartie_stuff.bin smw_house6 smw_house6_l1 smw_house6_l2 smw_house6_l3 smw_house6_l4
1004 xx_tools.bin light
1005 xx_permanentaliens.bin piranha
1006 xx_ptree.bin ptree_bob_busted
1007 xx_bigwalls.bin guard_center
1007 xx_bigwalls_lite.bin guard_center
1008 xx_story1.bin w_story1_ramp_1
1009 xx_story1.bin w_story1_ramp_2 w_story1_ramp_2
1009 xx_story1.bin w_story1_ramp_2 w_story1_ramp_2
1009 xx_story1.bin w_story1_ramp_2 w_story1_ramp_2
1009 xx_story1.bin w_story1_ramp_2 w_story1_ramp_2
1010 xx_story1.bin w_story1_ramp_3
1011 xx_story1.bin w_story1_ramp_4
1012 xx_story1.bin w_story1_rock_1
1013 xx_story1.bin w_story1_rock_2
1014 xx_story1.bin w_story1_rock_3
1015 xx_bigwalls.bin bw_gate_swing
1016 xx_efx.bin efx_blur
1017 xx_tools.bin sphere_coll
1018 xx_kabutolev1.bin kabuto_shield
1019 xx_menus.bin mu_mpselect
1020 xx_menus.bin efx_menu
1021 xx_guard_drawbridge.bin bw_drawbridge bw_drawbridge_coll
1022 xx_bigwalls.bin bw_fence
1023 xx_guard_prison.bin bw_prison bw_prison_l1 bw_prison_l2 bw_prison_l3
1024 xx_smartie_stuff.bin fun_house_int
1025 xx_menus.bin mu_idselect
1026 xx_menus.bin mu_wdselect
1027 xx_menus.bin mu_gnselect
1028 xx_smartie_stuff.bin mctower
1029 xx_plants.bin shrub9 shrub9_l1 shrub9_l2 shrub9_l3
1030 xx_plants.bin shrub10 shrub10_l1 shrub10_l2
1031 xx_plants.bin shrub11
1041 xx_smartie_stuff.bin mcbarrack mcbarrack_l1 mcbarrack_l2 mcbarrack_l3 mcbarrack_l4 mcbarrack_l5 mcbarrack_l6
1042 xx_rocks.bin desert_rock_1
1043 xx_rocks.bin desert_rock_2
1044 xx_rocks.bin desert_rock_3
1045 xx_ptree.bin ptree_canopy ptree_canopy_l1 ptree_canopy_l2
1047 xx_reaperman.bin rpm_snipergun rpm_snipergun_l1 rpm_snipergun_l2 rpm_snipergun_l3 rpm_snipergun_l4
1048 xx_reaperman.bin rpm_bazooka rpm_bazooka_l1 rpm_bazooka_l2 rpm_bazooka_l3 rpm_bazooka_l4
1049 xx_reaperman.bin rpm_jetpack rpm_jetpack_l1 rpm_jetpack_l2 rpm_jetpack_l3 rpm_jetpack_l4
1050 xx_guard_buildings.bin guard_tower1 guard_tower1_l1 guard_tower1_l2 guard_tower1_l3 guard_tower1_l4
1051 xx_guard_buildings.bin guard_tower2 guard_tower2_l1 guard_tower2_l2 guard_tower2_l3 guard_tower2_l4
1052 xx_markers.bin marker_spline
1053 xx_story4.bin story4
1054 xx_formations.bin 1sonak_4guards
1055 xx_reaperman.bin rpm_torch
1056 xx_guard_drawbridge.bin bw_drawbridge_open bw_drawbridgeo_coll
1057 xx_story4.bin story4_gate
1058 xx_formations.bin 1tsonak_4guards
1059 xx_formations.bin 1mcsonak_4guards
1060 xx_guard_barracks.bin bw_minibarracks bw_minibarracks_l1 bw_minibarracks_l2 bw_minibarracks_l3 bw_minibarracks_l4
1061 xx_guard_buildings.bin guard_sam guard_sam_l1 guard_sam_l2 guard_sam_l3 guard_sam_l4
1061 xx_guard_turrets.bin guard_sam guard_sam_l1 guard_sam_l2 guard_sam_l3 guard_sam_l4
1062 xx_guard_buildings.bin guard_turret guard_turret_l1 guard_turret_l2 guard_turret_l3 guard_turret_l4
1062 xx_guard_turrets.bin guard_turret guard_turret_l1 guard_turret_l2 guard_turret_l3 guard_turret_l4
1063 xx_guard_prison.bin bw_prisoncrater bw_prisoncrater_l1 bw_prisoncrater_l2 bw_prisoncrater_l3
1064 xx_charger.bin charger_hotspot
1065 xx_guard_buildings.bin guard_lift guard_lift_l1 guard_lift_l2 guard_lift_l3 guard_lift_l4
1066 xx_guard_buildings.bin guard_lift_strut guard_lift_strut_l1 guard_lift_strut_l2 guard_lift_strut_l3 guard_lift_strut_l4
1067 xx_formations.bin 2x4_guards
1068 xx_formations.bin 2x5_guards
1069 xx_formations.bin 2x3_guards
1070 xx_formations.bin 2x2_guards
1071 xx_formations.bin 2x1_guards
1072 xx_guard_buildings.bin guard_bunker guard_bunker_l1 guard_bunker_l2 guard_bunker_l3 guard_bunker_l4
1073 xx_smartie_stuff.bin sm_plate
1074 xx_guard_buildings.bin guard_stable guard_stable_l1 guard_stable_l2 guard_stable_l3 guard_stable_l4
1075 xx_smartie_stuff.bin potato
1076 xx_jetski.bin rp_jetski
1077 xx_guard_reaper_tower.bin bw_reapertower bw_reapertower_l1 bw_reapertower_l2 bw_reapertower_l3 bw_reapertower_l4 bw_reapertower_l5
1078 xx_smartie_stuff.bin potato_basket
1079 xx_reaperman.bin rpm_telescope rpm_telescope_l1 rpm_telescope_l2 rpm_telescope_l3 rpm_telescope_l4
1080 xx_raik.bin raik_l0 raik_l1 raik_l2 raik_l3 raik_l4 raik_l5 raik_l6 raik_l7
1081 xx_snow_stuff.bin iceberg1
1082 xx_smyan_pagoda.bin sm_pagoda sm_pagoda_l1 sm_pagoda_l2 sm_pagoda_l3 sm_pagoda_l4
1083 xx_smyan_pagoda.bin sm_pagodagong sm_pagodagong_l1 sm_pagodagong_l2 sm_pagodagong_l3 sm_pagodagong_l4
1084 xx_smartie_stuff.bin sm_pagodagate
1084 xx_smyan_pagoda.bin sm_pagodagate
1085 xx_snow_stuff.bin iceberg2
1086 xx_snow_stuff.bin iceberg3
1087 xx_snow_stuff.bin iceberg4
1088 xx_snow_stuff.bin iceberg_ramp
1089 xx_snow_stuff.bin ice_wall
1092 xx_guard_buildings.bin guard_shop guard_shop_l1 guard_shop_l2 guard_shop_l3 guard_shop_l4
1093 xx_mecc_base.bin stone_command stone_command_l1 stone_command_l2 stone_command_l3 stone_command_l4 stone_command_l5 stone_command_l6
1094 xx_guard_buildings.bin guard_lift_base guard_lift_base_l1 guard_lift_base_l2 guard_lift_base_l3 guard_lift_base_l4
1095 xx_mecc_base.bin wood_command
1096 xx_rocks.bin story3_ridge
1097 xx_guard_buildings.bin guard_buoy guard_buoy_l1 guard_buoy_l2 guard_buoy_l3 guard_buoy_l4
1098 xx_markers.bin buoy_spline
1099 xx_jetski.bin p_jetski_homing
1100 xx_jetski.bin p_jetski_missile
1101 xx_jetski.bin p_jetski_turbo
1102 xx_efx.bin efx_sunflare
1104 xx_ripper.bin rip_gore_head
1105 xx_ripper.bin rip_gore_arm
1106 xx_efx.bin efx_ref_machinegun
1107 xx_efx.bin efx_sniper_flash2
1108 xx_efx.bin efx_smoke_ring
1109 xx_efx.bin efx_ref_vert_circle
1111 xx_efx.bin efx_shotgun_blast
1112 xx_efx.bin efx_ripper_lspit
1113 xx_efx.bin efx_ripper_mspit
1114 xx_mecc_flick.bin mc_shotgun_shell
1114 xx_mecclev1.bin mc_shotgun_shell
1114 xx_rpman_weapons.bin mc_shotgun_shell
1115 xx_formations.bin 1tsonak
1116 xx_sonak.bin rpman_sonak_shell
1117 xx_vimp.bin vimpfoodchunk1
1118 xx_vimp.bin vimpfoodchunk2
1119 xx_vimp.bin vimpfoodchunk3
1120 xx_efx.bin efx_sam_debri
1121 xx_efx.bin efx_ref_sam_explode
1122 xx_efx.bin efx_ref_turret_explode
1123 xx_mecclev1.bin mc_pickup_mines
1123 xx_rpman_weapons.bin mc_pickup_mines
1124 xx_efx.bin efx_turret_debri
1125 xx_efx.bin efx_smoke_ring_white
1126 xx_giants_logo_3d.bin giants_logo_3d
1127 xx_guard_buildings.bin guard_tower1d guard_tower1d_l1 guard_tower1d_l2 guard_tower1d_l3
1128 xx_guard_buildings.bin guard_bunkerd guard_bunkerd_l1 guard_bunkerd_l2 guard_bunkerd_l3 guard_bunkerd_l4
1129 xx_guard_buildings.bin guard_tower2d guard_tower2d_l1 guard_tower2d_l2 guard_tower2d_l3
1130 xx_efx.bin efx_sunflare2
1134 xx_efx.bin efx_stable_debri_2
1135 xx_efx.bin efx_stable_debri_1
1136 xx_efx.bin efx_stable_debri_3
1137 xx_efx.bin efx_stable_debri_4
1138 xx_guard_buildings.bin guard_stabled
1139 xx_efx.bin efx_sun_orange
1140 xx_efx.bin efx_guard_tower2
1142 xx_efx.bin efx_smoke_green
1144 xx_ptree.bin ptree_bob_coll
1145 xx_efx.bin efx_mc_lbomb
1146 xx_rstory4.bin rstory4
1147 xx_rstory3.bin r3_start_finish
1147 xx_rstory5.bin r3_start_finish
1148 xx_reaper_base.bin magic_wall1
1149 xx_reaper_base.bin magic_wall2
1150 xx_reaper_base.bin magic_gate1
1151 xx_reaper_base.bin magic_gate2
1152 xx_reaper_base.bin rp_workshop rp_workshop_l1 rp_workshop_l2 rp_workshop_l3 rp_workshop_l4 rp_workshop_l5 rp_workshop_l6
1153 xx_reaper_base.bin d_rp_workshop d_rp_workshop_l1 d_rp_workshop_l2 d_rp_workshop_l3 d_rp_workshop_l4
1154 xx_reaper_base.bin rp_generator rp_generator_l1 rp_generator_l2 rp_generator_l3 rp_generator_l4 rp_generator_l5 rp_generator_l6
1155 xx_reaper_base.bin d_rp_generator d_rp_generator_l1 d_rp_generator_l2 d_rp_generator_l3 d_rp_generator_l4
1156 xx_reaper_base.bin rp_fun_house rp_fun_house_l1 rp_fun_house_l2 rp_fun_house_l3 rp_fun_house_l4 rp_fun_house_l5 rp_fun_house_l6
1157 xx_reaper_base.bin d_rp_fun_house d_rp_fun_house_l1 d_rp_fun_house_l2 d_rp_fun_house_l3 d_rp_fun_house_l4
1158 xx_reaper_base.bin rp_command rp_command_l1 rp_command_l2 rp_command_l3 rp_command_l4 rp_command_l5 rp_command_l6
1159 xx_jetski_rpm.bin rpm_jetski
1160 xx_rstory3.bin r3_lap_marker
1160 xx_rstory5.bin r3_lap_marker
1161 xx_guard_army_barracks.bin guard_army_barracks guard_army_barracks_l1 guard_army_barracks_l2 guard_army_barracks_l3 guard_army_barracks_l4 guard_army_barracks_l5 guard_army_barracks_l6
1162 xx_markers.bin army_spline
1163 xx_rocks.bin pebble
1164 xx_rstory3.bin r_grid r_grid_l0 r_grid_l1 r_grid_l2
1164 xx_rstory5.bin r_grid
1165 xx_efx.bin efx_rstory5_volcano
1166 xx_rstory5.bin rstory5_cave
1168 xx_toby.bin toby
1169 xx_story4.bin story4_door
1170 xx_efx.bin efx_ice_wall_debri
1171 xx_reaper_ship.bin reaper_ship
1172 xx_reaper_ship.bin reaper_ship_husk
1173 xx_guard_army_barracks.bin guard_army_barracks_husk
1174 xx_formations.bin 7_flying_guards
1175 xx_kab_stuff.bin mag_crystal
1176 xx_formations.bin 1_ripper
1177 xx_formations.bin 2_rippers
1178 xx_formations.bin 3_rippers
1180 xx_formations.bin 1_kamikazi
1181 xx_reaper_base.bin s_reaper_pier s_reaper_pier_l1 s_reaper_pier_l2 s_reaper_pier_l3 s_reaper_pier_l4 s_reaper_pier_l5 s_reaper_pier_l6
1185 xx_mecc_base.bin s_mecc_sam s_mecc_sam_l1 s_mecc_sam_l2 s_mecc_sam_l3 s_mecc_sam_l4 s_mecc_sam_l5 s_mecc_sam_l6
1186 xx_mecc_base.bin s_mecc_turret s_mecc_turret_l1 s_mecc_turret_l2 s_mecc_turret_l3 s_mecc_turret_l4 s_mecc_turret_l5 s_mecc_turret_l6
1187 xx_reaper_base.bin s_reaper_turret s_reaper_turret_l1 s_reaper_turret_l2 s_reaper_turret_l3 s_reaper_turret_l4 s_reaper_turret_l5 s_reaper_turret_l6
1188 xx_reaper_base.bin s_reaper_sam s_reaper_sam_l1 s_reaper_sam_l2 s_reaper_sam_l3 s_reaper_sam_l4 s_reaper_sam_l5 s_reaper_sam_l6
1189 xx_reaper_base.bin s_reaper_tower s_reaper_tower_l1 s_reaper_tower_l2 s_reaper_tower_l3 s_reaper_tower_l4 s_reaper_tower_l5 s_reaper_tower_l6
1190 xx_guard_barracks.bin barracks_husk
1192 xx_reaper_base.bin s_reaper_portal
1198 xx_lander.bin mother_ship
1199 xx_kab_stuff.bin mag_crystal_shard
1200 xx_smyan.bin yan_sword
1200 xx_smyan_flick.bin yan_sword
1201 xx_story4.bin mc_cutout1
1202 xx_story4.bin mc_cutout2
1203 xx_reaperman.bin rpm_bomb rpm_bomb_l1 rpm_bomb_l2 rpm_bomb_l3 rpm_bomb_l4
1204 xx_kab_stuff.bin kabuto_stone
1204 xx_kabuto_flick.bin kabuto_stone
1205 xx_efx.bin efx_portal
1206 xx_efx.bin efx_mc_rocket
1207 xx_giantwalls.bin giantwall1 giantwall1_l1 giantwall1_l2 giantwall1_l3 giantwall1_l4
1208 xx_giantwalls.bin giantwall2 giantwall2_l1 giantwall2_l2 giantwall2_l3 giantwall2_l4
1209 xx_giantwalls.bin giantwall3 giantwall3_l1 giantwall3_l2 giantwall3_l3 giantwall3_l4
1210 xx_kab_stuff.bin kab_ash
1211 xx_guard_buildings.bin guard_portal
1212 xx_smtimmy.bin sm_timmygrave
1212 xx_smtimmy_flick.bin sm_timmygrave
1213 xx_guard_buildings.bin guard_portal_m
1214 xx_reaper_ship.bin reaper_galleon
1215 xx_kab_stuff.bin k_rock_gen
1216 xx_kstory5.bin k_pocket
1217 xx_smdoomed.bin smdoomed_l0
1218 xx_smdoomed.bin smd_ground
1219 xx_formations.bin 5_flying_guards
1220 xx_formations.bin 3_flying_guards
1221 xx_efx.bin efx_portal_charm
1222 xx_reaperlev1.bin rp_mine rp_mine_l1 rp_mine_l2 rp_mine_l3 rp_mine_l4
1223 xx_reaperlev1.bin rp_pickup_mines
1224 xx_reaperlev1.bin rp_health
1225 xx_reaperlev1.bin rp_pickup_health
1226 xx_guard_barracks.bin guard_ripperbarracks guard_ripperbarracks_l1 guard_ripperbarracks_l2 guard_ripperbarracks_l3 guard_ripperbarracks_l4
1228 xx_reaper_base.bin d_magic_wall1
1229 xx_reaper_base.bin d_magic_wall2
1230 xx_reaper_base.bin d_magic_gate1
1231 xx_reaper_base.bin d_magic_gate2
1233 xx_reaperlev1.bin rp_pickup_repair
1234 xx_story1.bin w_story1_walls
1235 xx_story1.bin w_story1_arch
1236 xx_story1.bin w_story1_entrance
1237 xx_mecc_base.bin d_stone_command d_stone_command_l1 d_stone_command_l2 d_stone_command_l3 d_stone_command_l4
1238 xx_reaper_base.bin d_rp_command d_rp_command_l1 d_rp_command_l2 d_rp_command_l3 d_rp_command_l4
1239 xx_raik.bin raik_l7
1240 xx_rpqueen.bin rpqueen_l7
1241 xx_theend.bin reg_kiss
1242 xx_kab_stuff.bin k_lava_ball
1242 xx_seamonster.bin k_lava_ball
1243 xx_kab_stuff.bin k_volcano_debri
1244 xx_kab_stuff.bin k_exhaust
1245 xx_efx.bin efx_repair_ring
1246 xx_kab_stuff.bin k_rock_gen_top
1247 xx_story1.bin w_story1_mine
1248 xx_story1.bin w_story1_walls_1
1249 xx_story1.bin w_story1_walls_2
1250 xx_story1.bin w_story1_walls_3
1251 xx_story1.bin w_story1_walls_4
1252 xx_story1.bin w_story1_walls_5
1253 xx_story1.bin w_story1_walls_6
1255 xx_reaper_base.bin efx_magic_w1
1256 xx_efx.bin efx_portal_open_loop
1257 xx_efx.bin efx_portal_open_flick
1258 xx_efx.bin efx_portal_close_flick
1259 xx_story1.bin w_story1_hang_flick
1274 xx_plants.bin shrub5_coll
1275 xx_tools.bin ripper_radius
1276 xx_guard_barracks.bin barracks_story2 barracks_l1 barracks_l2 barracks_l3 barracks_l4 barracks_l5
1277 xx_giantwalls.bin giantwall4 giantwall4_l1 giantwall4_l2 giantwall4_l3 giantwall4_l4
1279 xx_ambient.bin a_m1_near_beach
1280 xx_ambient.bin a_m2_mnt_beach
1281 xx_ambient.bin a_m3_cliffs_sand
1282 xx_ambient.bin a_m4_beach_dark
1283 xx_ambient.bin a_m5_beach_waves
1284 xx_ambient.bin a_r1_light_rain
1285 xx_ambient.bin a_r2_snow
1286 xx_ambient.bin a_r3_race
1287 xx_ambient.bin a_r4_darker
1288 xx_ambient.bin a_r5_mountain
1289 xx_ambient.bin a_k1
1290 xx_ambient.bin a_k5_storm
1291 xx_ambient.bin a_crashed_lander
1293 xx_ambient.bin a_floating_gate
1295 xx_ambient.bin a_cage
1296 xx_ambient.bin a_distant_birds
1297 xx_ambient.bin a_wind_gusts
1298 xx_ambient.bin a_single_tree
1299 xx_ambient.bin a_trees
1300 xx_ambient.bin a_shoreline
1301 xx_ambient.bin a_pools
1302 xx_ambient.bin a_pier
1303 xx_ambient.bin a_big_leaf_tree
1304 xx_ambient.bin a_reaper_tower
1305 xx_ambient.bin a_int_volcano
1306 xx_ambient.bin a_smartie_village
1308 xx_ambient.bin a_high_winds
1309 xx_ambient.bin a_prison
1310 xx_ambient.bin a_army_barracks
1312 xx_ambient.bin a_forest_trees
1313 xx_ambient.bin a_distant_animals
1314 xx_formations.bin 4_wide_guards
1315 xx_ambient.bin a_shoreline_long
1316 xx_ambient.bin a_shoreline_dark_short
1317 xx_ambient.bin a_shoreline_dark_long
1318 xx_ambient.bin a_river
1319 xx_ambient.bin a_high_winds_light
1320 xx_ambient.bin a_cold_wind_gusts
1322 xx_efx.bin efx_giantwall4
1323 xx_music_temp.bin a_kabuto_temp
1324 xx_music_temp.bin a_mecc_temp
1325 xx_music_temp.bin a_mecc_temp_amb
1326 xx_music_temp.bin a_mecc_temp_battle
1327 xx_music_temp.bin a_mecc_temp_sus
1328 xx_story4.bin story4_tower story4_tower_l1 story4_tower_l2 story4_tower_l3 story4_tower_l4 story4_tower_l5
1330 xx_guard_buildings.bin guard_buoy_coll
1331 xx_jetski_rpm.bin rpm_jetski_coll
1332 xx_reaper_base.bin efx_magic_w2
1333 xx_giantwalls.bin giantwall5 giantwall5_l1 giantwall5_l2 giantwall5_l3 giantwall5_l4
1334 xx_kab_stuff.bin kabutopad
1335 xx_smartie_stuff.bin smw_house7 smw_house7_l1 smw_house7_l2 smw_house7_l3 smw_house7_l4
1336 xx_smartie_stuff.bin smw_house8 smw_house8_l1 smw_house8_l2 smw_house8_l3 smw_house8_l4
1337 xx_sm_evil.bin sm_evil_l0
1338 xx_ambient.bin a_k2
1339 xx_ambient.bin a_k3
1340 xx_ambient.bin a_k4
1342 xx_ambient.bin a_special_tree
1343 xx_ambient.bin a_pools_large
1344 xx_ambient.bin a_boat
1348 xx_smartie_stuff.bin sm_tower_timmy
1349 xx_jetski.bin p_jetski_coll
1350 xx_reaper_base.bin efx_magic_gate1
1351 xx_reaper_base.bin efx_magic_gate2
1354 xx_smartie_stuff.bin sm_table_dad
1355 xx_ambient.bin a_volcano
1356 xx_rstory5.bin rstory5_volcano_coll
1357 xx_rstory5.bin rstory5_fake
1358 xx_efx.bin efx_flare
1359 xx_giantwalls.bin giantwall3_nick
1360 xx_efx.bin efx_offspring_spit
1361 xx_efx.bin efx_offspring_fire
1363 xx_efx.bin efx_red_rings
1364 xx_efx.bin efx_ref_crooked_line
1365 xx_efx.bin efx_whizzer
1366 xx_efx.bin efx_whizzer_sparkles
1367 xx_efx.bin efx_deep_red
1368 xx_efx.bin efx_whizzer_charml
1369 xx_efx.bin efx_whizzer_charmr
1370 xx_kstory5.bin k_spike
1371 xx_kstory5.bin k_bridge_1
1372 xx_kstory5.bin k_bridge_2
1373 xx_kstory5.bin k_bridge_3
1374 xx_jetski.bin sign
1375 xx_kab_stuff.bin efx_crystal_debri
1376 xx_guard_barracks.bin efx_ref_minibarracks
1377 xx_guard_barracks.bin efx_mini_debri_top
1378 xx_guard_barracks.bin efx_mini_debri_1
1379 xx_guard_barracks.bin efx_mini_debri_2
1380 xx_guard_barracks.bin efx_mini_debri_3
1381 xx_guard_buildings.bin efx_ref_guard_tower_1
1382 xx_guard_buildings.bin efx_guard_tower_debri_1
1383 xx_guard_buildings.bin efx_guard_tower_debri_2
1384 xx_guard_buildings.bin efx_guard_tower_debri_3
1385 xx_guard_buildings.bin efx_guard_tower_debri_4
1386 xx_guard_buildings.bin efx_guard_tower_debri_5
1387 xx_guard_buildings.bin efx_ref_guard_tower_2
1388 xx_guard_buildings.bin efx_tower_2_debri_1
1389 xx_guard_buildings.bin efx_tower_2_debri_2
1390 xx_guard_buildings.bin efx_tower_2_debri_3
1391 xx_guard_barracks.bin efx_rpbarracks_debri_1
1392 xx_guard_barracks.bin efx_rpbarracks_debri_2
1393 xx_guard_barracks.bin efx_rpbarracks_debri_3
1394 xx_giantwalls.bin efx_ref_giantwall3
1395 xx_giantwalls.bin efx_giantwall_debri_1
1396 xx_giantwalls.bin efx_giantwall_debri_2
1397 xx_giantwalls.bin efx_giantwall_debri_3
1398 xx_giantwalls.bin efx_giantwall_debri_4
1399 xx_giantwalls.bin efx_giantwall_debri_5
1400 xx_giantwalls.bin efx_giantwall_debri_6
1401 xx_giantwalls.bin efx_giantwall_debri_7
1402 xx_giantwalls.bin efx_giantwall_debri_8
1403 xx_giantwalls.bin efx_giantwall_debri_9
1404 xx_giantwalls.bin efx_giantwall_debri_10
1405 xx_giantwalls.bin efx_giantwall_debri_11
1406 xx_giantwalls.bin efx_giantwall_debri_12
1407 xx_giantwalls.bin efx_giantwall_debri_13
1408 xx_giantwalls.bin efx_giantwall_debri_14
1409 xx_giantwalls.bin efx_ref_giantwall5
1410 xx_giantwalls.bin efx_giantwall5_debri_1
1411 xx_giantwalls.bin efx_giantwall3_debri_s
1412 xx_efx.bin efx_smoke_ring_b
1413 xx_bridge.bin bridge_wide
1414 xx_guard_drawbridge.bin bw_drawbridge_coll
1415 xx_guard_drawbridge.bin bw_drawbridgeo_coll
1416 xx_kab_stuff.bin k_rock_gen_coll
1417 xx_efx.bin efx_soot

View File

@ -26,17 +26,19 @@ export var deacceleration := 10
export(float, 0.0, 1.0, 0.05) var air_control := 0.3 export(float, 0.0, 1.0, 0.05) var air_control := 0.3
export var jump_height := 10 export var jump_height := 10
# Fly # Fly
export var fly_speed := 1000 export var fly_speed := 20
export var fly_accel := 4 export var fly_accel := 2
var flying := true var flying := true
# Slopes # Slopes
export var floor_max_angle := 45.0 export var floor_max_angle := 45.0
var mouse_press = false
var capture_mouse = false
################################################## ##################################################
# Called when the node enters the scene tree # Called when the node enters the scene tree
func _ready() -> void: func _ready() -> void:
Input.set_mouse_mode(Input.MOUSE_MODE_CAPTURED)
cam.fov = FOV cam.fov = FOV
@ -60,6 +62,15 @@ func _physics_process(delta: float) -> void:
func _input(event: InputEvent) -> void: func _input(event: InputEvent) -> void:
if event is InputEventMouseMotion: if event is InputEventMouseMotion:
mouse_axis = event.relative mouse_axis = event.relative
if event is InputEventMouseButton and capture_mouse:
if event.is_pressed():
mouse_press = true
print("mouse_press = true")
Input.set_mouse_mode(Input.MOUSE_MODE_CAPTURED)
else:
mouse_press = false
print("mouse_press = false")
Input.set_mouse_mode(Input.MOUSE_MODE_VISIBLE)
func walk(delta: float) -> void: func walk(delta: float) -> void:
@ -151,7 +162,7 @@ func fly(delta: float) -> void:
func camera_rotation() -> void: func camera_rotation() -> void:
if Input.get_mouse_mode() != Input.MOUSE_MODE_CAPTURED: if not (mouse_press and capture_mouse):
return return
if mouse_axis.length() > 0: if mouse_axis.length() > 0:
var _smoothness := 80 var _smoothness := 80

View File

@ -15,13 +15,15 @@ _global_script_class_icons={
[application] [application]
config/name="GiantsEdit" config/name="Giants ModelViewer"
run/main_scene="res://start.tscn" run/main_scene="res://UI.tscn"
boot_splash/image="res://modelviewer.png"
boot_splash/fullsize=false
config/icon="res://icon.png" config/icon="res://icon.png"
[display] [display]
window/size/resizable=false window/size/height=732
window/stretch/mode="viewport" window/stretch/mode="viewport"
window/stretch/aspect="expand" window/stretch/aspect="expand"
@ -30,6 +32,7 @@ window/stretch/aspect="expand"
move_forward={ move_forward={
"deadzone": 0.5, "deadzone": 0.5,
"events": [ Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":0,"alt":false,"shift":false,"control":false,"meta":false,"command":false,"pressed":false,"scancode":90,"unicode":0,"echo":false,"script":null) "events": [ Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":0,"alt":false,"shift":false,"control":false,"meta":false,"command":false,"pressed":false,"scancode":90,"unicode":0,"echo":false,"script":null)
, Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":0,"alt":false,"shift":false,"control":false,"meta":false,"command":false,"pressed":false,"scancode":87,"unicode":0,"echo":false,"script":null)
] ]
} }
move_backward={ move_backward={
@ -40,6 +43,7 @@ move_backward={
move_left={ move_left={
"deadzone": 0.5, "deadzone": 0.5,
"events": [ Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":0,"alt":false,"shift":false,"control":false,"meta":false,"command":false,"pressed":false,"scancode":81,"unicode":0,"echo":false,"script":null) "events": [ Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":0,"alt":false,"shift":false,"control":false,"meta":false,"command":false,"pressed":false,"scancode":81,"unicode":0,"echo":false,"script":null)
, Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":0,"alt":false,"shift":false,"control":false,"meta":false,"command":false,"pressed":false,"scancode":65,"unicode":0,"echo":false,"script":null)
] ]
} }
move_right={ move_right={

View File

@ -13,7 +13,7 @@ __meta__ = {
margin_right = 307.0 margin_right = 307.0
margin_bottom = 130.0 margin_bottom = 130.0
popup_exclusive = true popup_exclusive = true
window_title = "Open Giants directory" window_title = "Open a Directory"
resizable = true resizable = true
mode = 2 mode = 2
access = 2 access = 2

View File

@ -1,6 +1,4 @@
tool extends Node
extends MeshInstance
var signature var signature
var u0 var u0
@ -23,28 +21,18 @@ var u8
var tex var tex
var edges var edges
var file = File.new() var file
var vertices = [] var vertices = []
var triangles = [] var triangles = []
func _on_MeshInstance_ready():
readgti("res://default.gti")
var st = SurfaceTool.new()
st.begin(Mesh.PRIMITIVE_TRIANGLES)
for v in triangles:
st.add_color(Color(v[4] / 255.0, v[5] / 255.0, v[6] / 255.0))
st.add_vertex(Vector3(v[0], v[2], v[1]))
var m = st.commit() func _fill():
mesh = m
func fill():
# fill read values # fill read values
# print("fill") # print("fill")
var p = 0 var p = 0
while p < xverticesnumber * yverticesnumber: while p < xverticesnumber * yverticesnumber:
var b = file.get_8() var b = file.get_u8()
if b >= 0x80: if b >= 0x80:
while b != 0x00: while b != 0x00:
if p >= xverticesnumber * yverticesnumber: if p >= xverticesnumber * yverticesnumber:
@ -57,34 +45,35 @@ func fill():
return return
if version != 7: if version != 7:
vertices[p][2] = file.get_float() * heightscale # height vertices[p][2] = file.get_float() * heightscale # height
vertices[p][3] = file.get_8() # triangulation #if -5000 > vertices[p][2] or vertices[p][2] > 5000:
vertices[p][4] = file.get_8() # R # print("wtf vertice was at "+str(vertices[p][2]))
vertices[p][5] = file.get_8() # G vertices[p][3] = file.get_u8() # triangulation
vertices[p][6] = file.get_8() # B vertices[p][4] = file.get_u8() # R
vertices[p][5] = file.get_u8() # G
vertices[p][6] = file.get_u8() # B
else: else:
vertices[p][2] = file.get_float() * heightscale # height vertices[p][2] = file.get_float() * heightscale # height
vertices[p][3] = file.get_8() # triangulation #if -5000 > vertices[p][2] or vertices[p][2] > 5000:
vertices[p][4] = file.get_8() # R # print("wtf vertice was at "+str(vertices[p][2]))
vertices[p][5] = file.get_8() # G vertices[p][3] = file.get_u8() # triangulation
vertices[p][6] = file.get_8() # B vertices[p][4] = file.get_u8() # R
var unk = file.get_8() # unk vertices[p][5] = file.get_u8() # G
# print("["+ str(vertices[p][0]) + ", "+ str(vertices[p][1])+", "+ str(vertices[p][2])+", "+ str(vertices[p][3])+", "+ str(vertices[p][4])+", "+ str(vertices[p][5])+", "+ str(vertices[p][6])+", "+str(b)+"]") vertices[p][6] = file.get_u8() # B
var _unk = file.get_u8() # unk
p+=1 p+=1
b = (b - 1) & 0xFF b = (b - 1) & 0xFF
# print("["+ str(vertices[p][0]) + ", "+ str(vertices[p][1])+", "+ str(vertices[p][2])+", "+ str(vertices[p][3])+", "+ str(vertices[p][4])+", "+ str(vertices[p][5])+", "+ str(vertices[p][6])+", "+str(b)+"]")
func readgti(filename): func _readgti(f: StreamPeerBuffer):
file.open(filename, File.READ) self.file = f
if not file.is_open(): signature = file.get_u32()
get_tree().quit() u0 = file.get_u32()
return
signature = file.get_32()
u0 = file.get_32()
xoffset = file.get_float() xoffset = file.get_float()
yoffset = file.get_float() yoffset = file.get_float()
minheight = file.get_float() minheight = file.get_float()
maxheight = file.get_float() maxheight = file.get_float()
xverticesnumber = file.get_32() xverticesnumber = file.get_u32()
yverticesnumber = file.get_32() yverticesnumber = file.get_u32()
stretch = file.get_float() stretch = file.get_float()
stretch = 40.0 stretch = 40.0
heightscale = stretch/40.0 # normal stretch heightscale = stretch/40.0 # normal stretch
@ -92,11 +81,13 @@ func readgti(filename):
u2 = file.get_float() u2 = file.get_float()
u3 = file.get_float() u3 = file.get_float()
u4 = file.get_float() u4 = file.get_float()
version = file.get_16() version = file.get_u16()
u6 = file.get_16() u6 = file.get_u16()
u7 = file.get_float() u7 = file.get_float()
u8 = file.get_float() u8 = file.get_float()
tex = file.get_buffer(32).get_string_from_ascii()
tex = file.get_string(32)
print("tex: "+tex)
vertices.resize(xverticesnumber * yverticesnumber) vertices.resize(xverticesnumber * yverticesnumber)
@ -114,12 +105,10 @@ func readgti(filename):
vertices[y * xverticesnumber + x].append(0) # 6: B vertices[y * xverticesnumber + x].append(0) # 6: B
fill() _fill()
file.close()
# sort triangles # sort triangles
# print("sort") # print("sort")
var i = 0
# triangles.resize(2*len(vertices)) # triangles.resize(2*len(vertices))
for y in range(yverticesnumber-1): for y in range(yverticesnumber-1):
for x in range(xverticesnumber-1): for x in range(xverticesnumber-1):

134
terrainmanager.gd Normal file
View File

@ -0,0 +1,134 @@
extends Node
func get_terrain(gck_map: String) -> MeshInstance:
var finalmesh = MeshInstance.new()
var gdunzip = load("res://addons/gdunzip/gdunzip.gd").new()
var loaded = gdunzip.load(gck_map)
if loaded:
var gti_file = null
for f in gdunzip.files:
if f.ends_with(".gti"):
gti_file = f
if not gti_file:
print("Could not find any gti file in "+gck_map)
return finalmesh
var terrain_bytes = gdunzip.uncompress(gti_file)
if not terrain_bytes:
print("Failed to decompress default.gti")
return finalmesh
var terrain = load("res://terrain.gd").new()
var stream = StreamPeerBuffer.new()
stream.data_array = terrain_bytes
terrain._readgti(stream)
var st = SurfaceTool.new()
st.begin(Mesh.PRIMITIVE_TRIANGLES)
for v in terrain.triangles:
st.add_color(Color(v[4] / 255.0, v[5] / 255.0, v[6] / 255.0))
st.add_vertex(Vector3(v[0], v[2], v[1]))
var m = st.commit()
finalmesh.mesh = m
# create heightmap and colormap
var heightmap = Image.new()
var colormap = Image.new()
heightmap.create(terrain.xverticesnumber, terrain.yverticesnumber, false, Image.FORMAT_RGBA8)
colormap.create(terrain.xverticesnumber, terrain.yverticesnumber, false, Image.FORMAT_RGBA8)
heightmap.lock()
colormap.lock()
var minheight = terrain.minheight
var maxheight = terrain.maxheight
for x in range(terrain.xverticesnumber):
for y in range(terrain.yverticesnumber):
var height = terrain.vertices[y * terrain.xverticesnumber + x][2]
var greypercentage = (height-minheight)/(maxheight-minheight)
heightmap.set_pixel(x, y, Color(greypercentage, greypercentage , greypercentage))
var r = terrain.vertices[y * terrain.xverticesnumber + x][4]
var g = terrain.vertices[y * terrain.xverticesnumber + x][5]
var b = terrain.vertices[y * terrain.xverticesnumber + x][6]
colormap.set_pixel(x, y, Color8(r, g, b))
heightmap.unlock()
colormap.unlock()
heightmap.save_png("res://heightmap.png")
colormap.save_png("res://colormap.png")
else:
print("Could not open map "+gck_map)
return finalmesh
var mat = SpatialMaterial.new()
mat.vertex_color_use_as_albedo = true
mat.params_cull_mode = SpatialMaterial.CULL_DISABLED
finalmesh.material_override = mat
return finalmesh
func read_pstring(s: StreamPeerBuffer) -> String:
var res = ''
var c = s.get_u8()
while c != 0:
var a = PoolByteArray([c])
res+=a.get_string_from_ascii()
return res
func load_bin(stream: StreamPeerBuffer) -> void:
pass
func read_chunk(stream: StreamPeerBuffer, chunktype: int):
match(chunktype):
0x17:
var scale = stream.get_float()
0x1d:
var outdome_texture = stream.get_string(16)
0x1e:
var dome_texture = stream.get_string(16)
0x1f:
var dome_edge_texture = stream.get_string(16)
0x20:
var WFall1Tex = stream.get_string(16)
0x21:
var WFall2Tex = stream.get_string(16)
0x22:
var WFall3Tex = stream.get_string(16)
0x23:
var space_line_texture = stream.get_string(16)
0x24:
var space_texture = stream.get_string(16)
0x25:
var sea_texture = stream.get_string(16)
0x26:
var glow_texture = stream.get_string(16)
0x27:
var teleport = {}
teleport["Index"] = stream.get_u8()
teleport["X"] = stream.get_float()
teleport["Y"] = stream.get_float()
teleport["Z"] = stream.get_float()
teleport["Angle"] = stream.get_float()
0x28:
var r = stream.get_u8()
var g = stream.get_u8()
var b = stream.get_u8()
var sun_color = [r, g, b]
0x29:
var fog = {}
fog["NearDistance"] = stream.get_float()
fog["FarDistance"] = stream.get_float()
var r = stream.get_u8()
var g = stream.get_u8()
var b = stream.get_u8()
fog["Color"] = [r, g, b]
0x2a:
var type = stream.get_32()
var x = stream.get_float()
var y = stream.get_float()
var z = stream.get_float()
var angle = stream.get_float()
0x2c:
var music = stream.get_string(32)

113
viewer.gd Normal file
View File

@ -0,0 +1,113 @@
extends Node
var objmgr
onready var currObj = get_node("CurrentObject")
onready var tabs = get_node("Tabs")
func reset_itemlist_models(search=""):
var ilist = get_node("ItemList")
ilist.clear()
var done = []
var f2 = File.new()
f2.open("res://objlist.txt", File.READ)
var a = true
while a:
a = f2.get_line()
var arr = a.split("\t")
if len(arr) >= 3:
if not done.has(arr[0]):
var parts = arr[2].split(" ")
if len(parts) > 0:
if not search or (search and search in parts[0]):
ilist.add_item(arr[0] + " " + parts[0])
done.append(arr[0])
f2.close()
func _on_Node_ready():
tabs.add_tab("Models")
tabs.add_tab("Textures")
tabs.current_tab = 0
var giantsscript = load("res://objectmanager.gd")
var f1 = File.new()
f1.open("res://dir.txt", File.READ)
var dir = f1.get_as_text()
f1.close()
objmgr = giantsscript.ObjectManager.new()
objmgr.GIANTS_PATH = dir
objmgr.build()
reset_itemlist_models()
var tlist = get_node("TextureList")
for t in objmgr.index:
if t.ends_with(".tga"):
tlist.add_item(t)
func _on_ViewportContainer_mouse_entered():
get_node("ViewportContainer/Viewport/Player").capture_mouse = true
print("capture true")
func _on_ViewportContainer_mouse_exited():
get_node("ViewportContainer/Viewport/Player").capture_mouse = false
print("capture false")
func _on_ItemList_item_selected(index):
print("Showing")
get_node("Loader").show()
yield(get_tree(),"idle_frame")
yield(get_tree(),"idle_frame")
var text = get_node("ItemList").get_item_text(index)
var model = text.split(" ")[1] + ".gbs"
print("Loading "+model)
var m = objmgr.load_model(model)
var meshinstance = objmgr.load_model_mesh(m)
remove_child(currObj)
add_child(meshinstance)
currObj = meshinstance
print("Hiding")
get_node("Loader").hide()
func _on_Tabs_tab_changed(tab):
var ilist = get_node("ItemList")
var vpcontainer = get_node("ViewportContainer")
var sprite = get_node("Sprite")
var texturelist = get_node("TextureList")
var search = get_node("SearchModel")
if tab == 0: # model
ilist.visible = true
vpcontainer.visible = true
search.visible = true
texturelist.visible = false
sprite.visible = false
else:
ilist.visible = false
vpcontainer.visible = false
search.visible = false
texturelist.visible = true
sprite.visible = true
func _on_TextureList_item_selected(index):
var sprite = get_node("Sprite")
var text = get_node("TextureList").get_item_text(index)
var texture = objmgr.load_texture(text)
sprite.texture = texture
var max_height = 685
var max_width = 700
var height_scale = max_height / texture.get_height()
var width_scale = max_width / texture.get_width()
var final_scale = min(height_scale, width_scale)
sprite.scale = Vector2(final_scale, final_scale)
func _on_SearchModel_text_changed(new_text):
reset_itemlist_models(new_text)

100
viewer.tscn Normal file
View File

@ -0,0 +1,100 @@
[gd_scene load_steps=4 format=2]
[ext_resource path="res://viewer.gd" type="Script" id=1]
[ext_resource path="res://player/Player.tscn" type="PackedScene" id=2]
[sub_resource type="CubeMesh" id=1]
[node name="Node" type="Node"]
script = ExtResource( 1 )
[node name="Tabs" type="Tabs" parent="."]
margin_right = 1024.0
margin_bottom = 44.0
__meta__ = {
"_edit_use_anchors_": false
}
[node name="ItemList" type="ItemList" parent="."]
anchor_right = 1.0
anchor_bottom = 1.0
margin_top = 68.0
margin_right = -699.0
margin_bottom = -3.0
__meta__ = {
"_edit_use_anchors_": false
}
[node name="ViewportContainer" type="ViewportContainer" parent="."]
anchor_right = 1.0
anchor_bottom = 1.0
margin_left = 325.0
margin_top = 48.0
margin_right = 1.0
margin_bottom = -3.0
stretch = true
__meta__ = {
"_edit_use_anchors_": false
}
[node name="Viewport" type="Viewport" parent="ViewportContainer"]
size = Vector2( 700, 681 )
handle_input_locally = false
render_target_update_mode = 3
[node name="Player" parent="ViewportContainer/Viewport" instance=ExtResource( 2 )]
[node name="CurrentObject" type="MeshInstance" parent="."]
transform = Transform( 0.999955, 0.00945954, 0, -0.00945954, 0.999955, 0, 0, 0, 1, 0, 0, -2.5736 )
mesh = SubResource( 1 )
material/0 = null
[node name="TextureList" type="ItemList" parent="."]
visible = false
margin_top = 44.0
margin_right = 325.0
margin_bottom = 724.0
__meta__ = {
"_edit_use_anchors_": false
}
[node name="Sprite" type="Sprite" parent="."]
position = Vector2( 330, 55 )
centered = false
[node name="SearchModel" type="LineEdit" parent="."]
margin_top = 44.0
margin_right = 325.0
margin_bottom = 68.0
placeholder_text = "Search for textures..."
__meta__ = {
"_edit_use_anchors_": false
}
[node name="Loader" type="Panel" parent="."]
visible = false
margin_right = 1025.0
margin_bottom = 732.0
__meta__ = {
"_edit_use_anchors_": false
}
[node name="Label" type="Label" parent="Loader"]
margin_top = 4.0
margin_right = 205.0
margin_bottom = 149.0
rect_scale = Vector2( 5, 5 )
text = "Loading..."
align = 1
valign = 1
uppercase = true
__meta__ = {
"_edit_use_anchors_": false
}
[connection signal="ready" from="." to="." method="_on_Node_ready"]
[connection signal="tab_changed" from="Tabs" to="." method="_on_Tabs_tab_changed"]
[connection signal="item_selected" from="ItemList" to="." method="_on_ItemList_item_selected"]
[connection signal="mouse_entered" from="ViewportContainer" to="." method="_on_ViewportContainer_mouse_entered"]
[connection signal="mouse_exited" from="ViewportContainer" to="." method="_on_ViewportContainer_mouse_exited"]
[connection signal="item_selected" from="TextureList" to="." method="_on_TextureList_item_selected"]
[connection signal="text_changed" from="SearchModel" to="." method="_on_SearchModel_text_changed"]