update
This commit is contained in:
parent
c03e87bc21
commit
83b0ea3267
23
3d.gd
23
3d.gd
@ -21,8 +21,14 @@ func _ready() -> void:
|
||||
f.open("res://dir.txt", File.READ)
|
||||
var dir = f.get_as_text()
|
||||
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.GIANTS_PATH = dir
|
||||
# objmgr.GIANTS_PATH = dir
|
||||
# var giants_dir_browser = FileDialog.new()
|
||||
# giants_dir_browser.mode = FileDialog.MODE_OPEN_DIR
|
||||
# giants_dir_browser.window_title = "Select your Giants directory"
|
||||
@ -32,13 +38,12 @@ func _ready() -> void:
|
||||
objmgr.build()
|
||||
# var m = objmgr.load_model("mc_nothrust_l0.gbs")
|
||||
# var m = objmgr.load_model("ripper.gbs")
|
||||
var m = objmgr.load_model("RP_command.gbs")
|
||||
# print(m.tex)
|
||||
# print(m.point_uv)
|
||||
# print(m.tex)
|
||||
var meshinstance = objmgr.load_model_mesh(m)
|
||||
meshinstance.transform.origin.y = 50
|
||||
add_child(meshinstance)
|
||||
|
||||
#var m = objmgr.load_model("RP_command.gbs")
|
||||
|
||||
#var meshinstance = objmgr.load_model_mesh(m)
|
||||
#meshinstance.transform.origin.y = 50
|
||||
#add_child(meshinstance)
|
||||
|
||||
|
||||
func _input(event: InputEvent) -> void:
|
||||
@ -71,7 +76,7 @@ func _input(event: InputEvent) -> void:
|
||||
add_child(meshinstance)
|
||||
|
||||
|
||||
func _process(delta):
|
||||
func _process(_delta):
|
||||
var pos = camera.get_global_transform().origin
|
||||
get_node("Label").text = "X: "+str(pos.x)+", Y: "+str(pos.y)+", Z: "+str(pos.z)
|
||||
var rotation = camera.rotation
|
||||
|
@ -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)])
|
@ -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
56
UI.gd
@ -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
184
UI.tscn
@ -2,62 +2,156 @@
|
||||
|
||||
[ext_resource path="res://UI.gd" type="Script" id=1]
|
||||
|
||||
[node name="Panel" type="Panel"]
|
||||
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
|
||||
[node name="Node" type="Node"]
|
||||
script = ExtResource( 1 )
|
||||
__meta__ = {
|
||||
"_edit_use_anchors_": false
|
||||
}
|
||||
|
||||
[node name="Title" type="Label" parent="."]
|
||||
margin_left = 329.0
|
||||
margin_top = 37.0
|
||||
margin_right = 539.0
|
||||
margin_bottom = 51.0
|
||||
text = "Welcome to GiantsEditReloaded!"
|
||||
__meta__ = {
|
||||
"_edit_use_anchors_": false
|
||||
}
|
||||
anchor_left = 0.5
|
||||
anchor_right = 0.5
|
||||
margin_left = -280.5
|
||||
margin_top = 61.0
|
||||
margin_right = 280.5
|
||||
margin_bottom = 143.001
|
||||
grow_horizontal = 2
|
||||
grow_vertical = 2
|
||||
text = "Welcome to Giants Model Viewer!
|
||||
|
||||
[node name="New" type="Button" parent="."]
|
||||
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
|
||||
}
|
||||
This tool allows you to show Giants models and textures.
|
||||
|
||||
[node name="Open" type="Button" parent="."]
|
||||
margin_left = 366.0
|
||||
margin_top = 149.0
|
||||
margin_right = 481.0
|
||||
margin_bottom = 178.0
|
||||
rect_pivot_offset = Vector2( 82, 14.5 )
|
||||
text = "Open map"
|
||||
You can use it to explore the models and/or get the ID needed to be used in GiantsEdit!"
|
||||
align = 1
|
||||
__meta__ = {
|
||||
"_edit_use_anchors_": false
|
||||
}
|
||||
|
||||
[node name="Quit" type="Button" parent="."]
|
||||
margin_left = 614.0
|
||||
margin_top = 149.0
|
||||
margin_right = 729.0
|
||||
margin_bottom = 178.0
|
||||
rect_pivot_offset = Vector2( 82, 14.5 )
|
||||
anchor_left = 0.5
|
||||
anchor_top = 1.0
|
||||
anchor_right = 0.5
|
||||
anchor_bottom = 1.0
|
||||
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"
|
||||
__meta__ = {
|
||||
"_edit_use_anchors_": false
|
||||
}
|
||||
[connection signal="pressed" from="New" to="." method="_on_Button_pressed"]
|
||||
[connection signal="pressed" from="Open" to="." method="_on_Button_pressed"]
|
||||
[connection signal="pressed" from="Quit" to="." method="_on_Button_pressed"]
|
||||
|
||||
[node name="GCKFileDialog" type="FileDialog" parent="."]
|
||||
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
671
addons/gdunzip/gdunzip.gd
Normal 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']
|
6
addons/gdunzip/plugin.cfg
Normal file
6
addons/gdunzip/plugin.cfg
Normal 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
BIN
modelviewer.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 162 KiB |
34
modelviewer.png.import
Normal file
34
modelviewer.png.import
Normal 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
|
@ -23,14 +23,14 @@ class ObjectManager:
|
||||
assert(checksum == 0x6608F101)
|
||||
var meta_info_offset = file.get_32()
|
||||
file.seek(meta_info_offset)
|
||||
var unk = file.get_32()
|
||||
var _unk = file.get_32()
|
||||
var entries_count = file.get_32()
|
||||
for i in range(entries_count):
|
||||
var compressed_size = file.get_32()
|
||||
var original_size = file.get_32()
|
||||
var file_time = file.get_32()
|
||||
var content_offset = file.get_32() + 16
|
||||
var compression = file.get_8()
|
||||
for _i in range(entries_count):
|
||||
var _compressed_size = file.get_32()
|
||||
var _original_size = file.get_32()
|
||||
var _file_time = file.get_32()
|
||||
var _content_offset = file.get_32() + 16
|
||||
var _compression = file.get_8()
|
||||
var name_length = file.get_8()
|
||||
var name = file.get_buffer(name_length).get_string_from_ascii()
|
||||
name = name.to_lower()
|
||||
@ -51,12 +51,12 @@ class ObjectManager:
|
||||
assert(checksum == 0x6608F101)
|
||||
var meta_info_offset = file.get_32()
|
||||
file.seek(meta_info_offset)
|
||||
var unk = file.get_32()
|
||||
var _unk = 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 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 compression = file.get_8()
|
||||
var name_length = file.get_8()
|
||||
@ -77,8 +77,9 @@ class ObjectManager:
|
||||
|
||||
func load_model(gbs_file: String):
|
||||
gbs_file = gbs_file.to_lower()
|
||||
var pos = 0
|
||||
var gbs_stream = read_file_in_gzp(gbs_file)
|
||||
if not gbs_stream:
|
||||
return null
|
||||
var model = load("res://model.gd").Model.new()
|
||||
var modelitem_gd = load("res://modelitem.gd")
|
||||
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][1] = gbs_stream.get_float()
|
||||
|
||||
for s in range(model.points):
|
||||
for _s in range(model.points):
|
||||
var r = gbs_stream.get_8()
|
||||
var g = gbs_stream.get_8()
|
||||
var b = gbs_stream.get_8()
|
||||
@ -198,21 +199,21 @@ class ObjectManager:
|
||||
func load_texture(texture_file: String) -> ImageTexture:
|
||||
print("Loading texture "+texture_file)
|
||||
var tmpDirectory = Directory.new()
|
||||
if not tmpDirectory.dir_exists("res://tmp"):
|
||||
tmpDirectory.make_dir("res://tmp")
|
||||
if not tmpDirectory.dir_exists("user://tmp"):
|
||||
tmpDirectory.make_dir("user://tmp")
|
||||
var stream = read_file_in_gzp(texture_file)
|
||||
if stream == null:
|
||||
return null
|
||||
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)
|
||||
print("Saved to: "+tmpFile.get_path_absolute())
|
||||
tmpFile.close()
|
||||
var img = Image.new()
|
||||
var tex = ImageTexture.new()
|
||||
img.load("res://tmp/"+texture_file)
|
||||
img.load("user://tmp/"+texture_file)
|
||||
tex.create_from_image(img)
|
||||
tmpDirectory.remove("res://tmp/"+texture_file)
|
||||
tmpDirectory.remove("user://tmp/"+texture_file)
|
||||
return tex
|
||||
|
||||
func load_model_mesh(model) -> MeshInstance:
|
||||
|
950
objlist.txt
Normal file
950
objlist.txt
Normal 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
|
@ -26,17 +26,19 @@ export var deacceleration := 10
|
||||
export(float, 0.0, 1.0, 0.05) var air_control := 0.3
|
||||
export var jump_height := 10
|
||||
# Fly
|
||||
export var fly_speed := 1000
|
||||
export var fly_accel := 4
|
||||
export var fly_speed := 20
|
||||
export var fly_accel := 2
|
||||
var flying := true
|
||||
# Slopes
|
||||
export var floor_max_angle := 45.0
|
||||
|
||||
var mouse_press = false
|
||||
var capture_mouse = false
|
||||
|
||||
##################################################
|
||||
|
||||
# Called when the node enters the scene tree
|
||||
func _ready() -> void:
|
||||
Input.set_mouse_mode(Input.MOUSE_MODE_CAPTURED)
|
||||
cam.fov = FOV
|
||||
|
||||
|
||||
@ -60,6 +62,15 @@ func _physics_process(delta: float) -> void:
|
||||
func _input(event: InputEvent) -> void:
|
||||
if event is InputEventMouseMotion:
|
||||
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:
|
||||
@ -151,7 +162,7 @@ func fly(delta: float) -> void:
|
||||
|
||||
|
||||
func camera_rotation() -> void:
|
||||
if Input.get_mouse_mode() != Input.MOUSE_MODE_CAPTURED:
|
||||
if not (mouse_press and capture_mouse):
|
||||
return
|
||||
if mouse_axis.length() > 0:
|
||||
var _smoothness := 80
|
||||
|
@ -15,13 +15,15 @@ _global_script_class_icons={
|
||||
|
||||
[application]
|
||||
|
||||
config/name="GiantsEdit"
|
||||
run/main_scene="res://start.tscn"
|
||||
config/name="Giants ModelViewer"
|
||||
run/main_scene="res://UI.tscn"
|
||||
boot_splash/image="res://modelviewer.png"
|
||||
boot_splash/fullsize=false
|
||||
config/icon="res://icon.png"
|
||||
|
||||
[display]
|
||||
|
||||
window/size/resizable=false
|
||||
window/size/height=732
|
||||
window/stretch/mode="viewport"
|
||||
window/stretch/aspect="expand"
|
||||
|
||||
@ -30,6 +32,7 @@ window/stretch/aspect="expand"
|
||||
move_forward={
|
||||
"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)
|
||||
, 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={
|
||||
@ -40,6 +43,7 @@ move_backward={
|
||||
move_left={
|
||||
"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)
|
||||
, 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={
|
||||
|
@ -13,7 +13,7 @@ __meta__ = {
|
||||
margin_right = 307.0
|
||||
margin_bottom = 130.0
|
||||
popup_exclusive = true
|
||||
window_title = "Open Giants directory"
|
||||
window_title = "Open a Directory"
|
||||
resizable = true
|
||||
mode = 2
|
||||
access = 2
|
||||
|
@ -1,6 +1,4 @@
|
||||
tool
|
||||
|
||||
extends MeshInstance
|
||||
extends Node
|
||||
|
||||
var signature
|
||||
var u0
|
||||
@ -23,28 +21,18 @@ var u8
|
||||
var tex
|
||||
|
||||
var edges
|
||||
var file = File.new()
|
||||
var file
|
||||
|
||||
var vertices = []
|
||||
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()
|
||||
mesh = m
|
||||
|
||||
func fill():
|
||||
func _fill():
|
||||
# fill read values
|
||||
# print("fill")
|
||||
var p = 0
|
||||
while p < xverticesnumber * yverticesnumber:
|
||||
var b = file.get_8()
|
||||
var b = file.get_u8()
|
||||
if b >= 0x80:
|
||||
while b != 0x00:
|
||||
if p >= xverticesnumber * yverticesnumber:
|
||||
@ -57,34 +45,35 @@ func fill():
|
||||
return
|
||||
if version != 7:
|
||||
vertices[p][2] = file.get_float() * heightscale # 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
|
||||
#if -5000 > vertices[p][2] or vertices[p][2] > 5000:
|
||||
# print("wtf vertice was at "+str(vertices[p][2]))
|
||||
vertices[p][3] = file.get_u8() # triangulation
|
||||
vertices[p][4] = file.get_u8() # R
|
||||
vertices[p][5] = file.get_u8() # G
|
||||
vertices[p][6] = file.get_u8() # B
|
||||
else:
|
||||
vertices[p][2] = file.get_float() * heightscale # 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)+"]")
|
||||
#if -5000 > vertices[p][2] or vertices[p][2] > 5000:
|
||||
# print("wtf vertice was at "+str(vertices[p][2]))
|
||||
vertices[p][3] = file.get_u8() # triangulation
|
||||
vertices[p][4] = file.get_u8() # R
|
||||
vertices[p][5] = file.get_u8() # G
|
||||
vertices[p][6] = file.get_u8() # B
|
||||
var _unk = file.get_u8() # unk
|
||||
p+=1
|
||||
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):
|
||||
file.open(filename, File.READ)
|
||||
if not file.is_open():
|
||||
get_tree().quit()
|
||||
return
|
||||
signature = file.get_32()
|
||||
u0 = file.get_32()
|
||||
func _readgti(f: StreamPeerBuffer):
|
||||
self.file = f
|
||||
signature = file.get_u32()
|
||||
u0 = file.get_u32()
|
||||
xoffset = file.get_float()
|
||||
yoffset = file.get_float()
|
||||
minheight = file.get_float()
|
||||
maxheight = file.get_float()
|
||||
xverticesnumber = file.get_32()
|
||||
yverticesnumber = file.get_32()
|
||||
xverticesnumber = file.get_u32()
|
||||
yverticesnumber = file.get_u32()
|
||||
stretch = file.get_float()
|
||||
stretch = 40.0
|
||||
heightscale = stretch/40.0 # normal stretch
|
||||
@ -92,11 +81,13 @@ func readgti(filename):
|
||||
u2 = file.get_float()
|
||||
u3 = file.get_float()
|
||||
u4 = file.get_float()
|
||||
version = file.get_16()
|
||||
u6 = file.get_16()
|
||||
version = file.get_u16()
|
||||
u6 = file.get_u16()
|
||||
u7 = 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)
|
||||
|
||||
@ -114,12 +105,10 @@ func readgti(filename):
|
||||
vertices[y * xverticesnumber + x].append(0) # 6: B
|
||||
|
||||
|
||||
fill()
|
||||
file.close()
|
||||
_fill()
|
||||
|
||||
# sort triangles
|
||||
# print("sort")
|
||||
var i = 0
|
||||
# triangles.resize(2*len(vertices))
|
||||
for y in range(yverticesnumber-1):
|
||||
for x in range(xverticesnumber-1):
|
134
terrainmanager.gd
Normal file
134
terrainmanager.gd
Normal 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
113
viewer.gd
Normal 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
100
viewer.tscn
Normal 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"]
|
Loading…
Reference in New Issue
Block a user