diff --git a/.editorconfig b/.editorconfig new file mode 100644 index 0000000..f28239b --- /dev/null +++ b/.editorconfig @@ -0,0 +1,4 @@ +root = true + +[*] +charset = utf-8 diff --git a/LoadedModContent/GreatTransformation/Models/Anita3st.glb b/LoadedModContent/GreatTransformation/Models/Anita3st.glb new file mode 100644 index 0000000..048b6be Binary files /dev/null and b/LoadedModContent/GreatTransformation/Models/Anita3st.glb differ diff --git a/LoadedModContent/GreatTransformation/Models/Anita3st.glb.import b/LoadedModContent/GreatTransformation/Models/Anita3st.glb.import new file mode 100644 index 0000000..3e6f55a --- /dev/null +++ b/LoadedModContent/GreatTransformation/Models/Anita3st.glb.import @@ -0,0 +1,37 @@ +[remap] + +importer="scene" +importer_version=1 +type="PackedScene" +uid="uid://c7g1gipglo0gx" +path="res://.godot/imported/Anita3st.glb-ff32b6134ac6bb4b90a65a4c2be45f29.scn" + +[deps] + +source_file="res://LoadedModContent/GreatTransformation/Models/Anita3st.glb" +dest_files=["res://.godot/imported/Anita3st.glb-ff32b6134ac6bb4b90a65a4c2be45f29.scn"] + +[params] + +nodes/root_type="" +nodes/root_name="" +nodes/apply_root_scale=true +nodes/root_scale=1.0 +nodes/import_as_skeleton_bones=false +nodes/use_node_type_suffixes=true +meshes/ensure_tangents=true +meshes/generate_lods=true +meshes/create_shadow_meshes=true +meshes/light_baking=1 +meshes/lightmap_texel_size=0.2 +meshes/force_disable_compression=false +skins/use_named_skins=true +animation/import=true +animation/fps=30 +animation/trimming=false +animation/remove_immutable_tracks=true +animation/import_rest_as_RESET=false +import_script/path="" +_subresources={} +gltf/naming_version=1 +gltf/embedded_image_handling=1 diff --git a/LoadedModContent/GreatTransformation/Stages/GreatTransformation.tscn b/LoadedModContent/GreatTransformation/Stages/GreatTransformation.tscn new file mode 100644 index 0000000..1fae472 --- /dev/null +++ b/LoadedModContent/GreatTransformation/Stages/GreatTransformation.tscn @@ -0,0 +1,61 @@ +[gd_scene load_steps=5 format=3 uid="uid://cwus7ucfs7krc"] + +[ext_resource type="PackedScene" uid="uid://c7g1gipglo0gx" path="res://LoadedModContent/GreatTransformation/Models/Anita3st.glb" id="1_psnof"] +[ext_resource type="Script" uid="uid://bu68w4jnh0n2b" path="res://Scripts/AnimatronicController.gd" id="2_jnn4e"] +[ext_resource type="Script" uid="uid://d1p4ite8ts2wi" path="res://Scripts/LightController.gd" id="3_f5t6i"] + +[sub_resource type="Environment" id="Environment_45het"] +ambient_light_source = 1 + +[node name="GreatTransformation" type="Node3D"] + +[node name="Anita" parent="." instance=ExtResource("1_psnof")] +transform = Transform3D(0.25, 0, 0, 0, 0.25, 0, 0, 0, 0.25, 0, 0, 0) +script = ExtResource("2_jnn4e") + +[node name="Spots" type="Node3D" parent="."] +script = ExtResource("3_f5t6i") + +[node name="Anita 1" type="SpotLight3D" parent="Spots"] +transform = Transform3D(-0.965926, -0.109382, 0.23457, -2.84193e-15, 0.906308, 0.422618, -0.258819, 0.408218, -0.875426, 0.45, 2.75, -2) +visible = false +light_color = Color(1, 0.529412, 0.85098, 1) +light_energy = 5.0 +spot_attenuation = 2.0 +spot_angle = 10.0 +spot_angle_attenuation = 0.15 + +[node name="Anita 2" type="SpotLight3D" parent="Spots"] +transform = Transform3D(-0.965926, 0.109382, -0.23457, -9.47311e-16, 0.906308, 0.422618, 0.258819, 0.408218, -0.875426, -0.5, 2.75, -2) +visible = false +light_color = Color(0.666667, 0.960784, 0.596078, 1) +light_energy = 5.0 +spot_attenuation = 2.0 +spot_angle = 10.0 +spot_angle_attenuation = 0.15 + +[node name="WorldEnvironment" type="WorldEnvironment" parent="."] +environment = SubResource("Environment_45het") + +[node name="Angle 1" type="Camera3D" parent="."] +transform = Transform3D(-1, -2.26267e-08, 8.44439e-08, 0, 0.965926, 0.258819, -8.74228e-08, 0.258819, -0.965926, 0, 1.75, -2) +current = true +fov = 60.0 + +[node name="Angle 2" type="Camera3D" parent="."] +transform = Transform3D(-1, -2.26267e-08, 8.44439e-08, 0, 0.965926, 0.258819, -8.74228e-08, 0.258819, -0.965926, 0, 2, -1) +fov = 60.0 + +[node name="Angle 3" type="Camera3D" parent="."] +transform = Transform3D(-0.866025, 0.25, -0.433013, 0, 0.866025, 0.5, 0.5, 0.433013, -0.75, -1, 2.75, -2) +fov = 60.0 + +[node name="OmniLight3D" type="OmniLight3D" parent="."] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 2, 1.5, -3) +light_color = Color(1, 0.960784, 0.85098, 1) +light_energy = 0.5 + +[node name="OmniLight3D2" type="OmniLight3D" parent="."] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -2, 1.5, -3) +light_color = Color(1, 0.960784, 0.85098, 1) +light_energy = 0.5 diff --git a/LoadedModContent/ModManifest/GreatTransformation.gd b/LoadedModContent/ModManifest/GreatTransformation.gd new file mode 100644 index 0000000..ffa2bae --- /dev/null +++ b/LoadedModContent/ModManifest/GreatTransformation.gd @@ -0,0 +1,45 @@ +extends Node + +var ModInfo = { + "mod_name": "Great Transformation", + "mod_creator": "Persephone (KawaiiZenbo)", + "mod_version": 1.0, + "mod_description": "Embark on a magical journey featuring the cutest cheerleader, Anita!\nSmells like a treated lake and waterlogged wood.\n\nAnita is from the game \"oneway.exe\".\nThis mod is not associated with Disordered Media or Adair Carnival of Family Magic.", + "implements_stages": + { + "Great Transformation": { + "bits": 19, + "scene": "res://LoadedModContent/GreatTransformation/Stages/GreatTransformation.tscn", + "scene_ref_base": "SubViewport/GreatTransformation/", + "camera_count": 3, + + "ust_type": "Rockafire Explosion/3-Stage", + + "bit_mapping": + { + 23: { "bot": "Anita", "movement": "Mouth", "flow_in": 3.0, "flow_out": 2.0 }, + 26: { "bot": "Anita", "movement": "Left Eyelid", "flow_in": 1.5, "flow_out": 2.0 }, + 27: { "bot": "Anita", "movement": "Right Eyelid", "flow_in": 1.5, "flow_out": 2.0 }, + 28: { "bot": "Anita", "movement": "Eyes Left", "flow_in": 3.5, "flow_out": 1.5 }, + 29: { "bot": "Anita", "movement": "Eyes Right", "flow_in": 3.5, "flow_out": 1.5 }, + 30: { "bot": "Anita", "movement": "Head Left", "flow_in": 1.5, "flow_out": 1.5 }, + 31: { "bot": "Anita", "movement": "Head Right", "flow_in": 1.5, "flow_out": 1.5 }, + 32: { "bot": "Anita", "movement": "Head Up", "flow_in": 1.0, "flow_out": 1.0 }, + 33: { "bot": "Anita", "movement": "Left Arm Up", "flow_in": 0.8, "flow_out": 0.6 }, + 34: { "bot": "Anita", "movement": "Left Arm Twist", "flow_in": 0.8, "flow_out": 0.8 }, + 35: { "bot": "Anita", "movement": "Left Elbow", "flow_in": 1.0, "flow_out": 1.0 }, + 36: { "bot": "Anita", "movement": "Right Arm Up", "flow_in": 0.8, "flow_out": 0.6 }, + 37: { "bot": "Anita", "movement": "Right Arm Twist", "flow_in": 0.8, "flow_out": 0.8 }, + 38: { "bot": "Anita", "movement": "Right Elbow", "flow_in": 1.0, "flow_out": 1.0 }, + 39: { "bot": "Anita", "movement": "Body Left", "flow_in": 0.7, "flow_out": 0.7 }, + 40: { "bot": "Anita", "movement": "Body Right", "flow_in": 0.7, "flow_out": 0.7 }, + 41: { "bot": "Anita", "movement": "Body Lean", "flow_in": 1.0, "flow_out": 0.8 }, + 125: { "bot": "Spots", "movement": "Anita 1", "flow_in": "None", "flow_out": "None" }, + 131: { "bot": "Spots", "movement": "Anita 2", "flow_in": "None", "flow_out": "None" }, + }, + + "cosmetics": [ ], + "cosmetic_defaults": [ ] + } + } +} diff --git a/LoadedModContent/ModManifest/GreatTransformation.gd.uid b/LoadedModContent/ModManifest/GreatTransformation.gd.uid new file mode 100644 index 0000000..5d94ff6 --- /dev/null +++ b/LoadedModContent/ModManifest/GreatTransformation.gd.uid @@ -0,0 +1 @@ +uid://cbpaav5uyn1sq diff --git a/Scripts/AnimatronicController.gd b/Scripts/AnimatronicController.gd new file mode 100644 index 0000000..5dc202b --- /dev/null +++ b/Scripts/AnimatronicController.gd @@ -0,0 +1,93 @@ +extends Node3D + +var animation_player : AnimationPlayer +var animation_tree : AnimationTree +var blend_tree : AnimationNodeBlendTree + +var movement_states : Dictionary + +func _ready(): + animation_player = $AnimationPlayer + + animation_tree = AnimationTree.new() + animation_tree.anim_player = animation_player.get_path() + add_child(animation_tree) + + animation_tree.tree_root = AnimationNodeBlendTree.new() + animation_tree.active = true + blend_tree = animation_tree.tree_root as AnimationNodeBlendTree + + animation_player.speed_scale = 0 + + var animations = animation_player.get_animation_list() + + for animation in animations: + movement_states[animation] = [false, 0.0, 0.0, 0.0] + + var prev_name = "Anim_" + animations[0] + var old_time_name = "Time_" + animations[0] + var old_seek_name = "Seek_" + animations[0] + + var prev_anim_node := AnimationNodeAnimation.new() + prev_anim_node.animation = animations[0] + blend_tree.add_node(prev_name, prev_anim_node) + + var old_time_node := AnimationNodeTimeScale.new() + blend_tree.add_node(old_time_name,old_time_node) + + var _old_seek_node := AnimationNodeTimeSeek.new() + blend_tree.add_node(old_seek_name,_old_seek_node) + + blend_tree.connect_node(old_time_name,0,prev_name) + blend_tree.connect_node(old_seek_name,0,old_time_name) + prev_name = old_seek_name + + for i in range(1, animations.size()): + var anim_name = "Anim_" + animations[i] + var add_name = "Add_" + animations[i] + var time_name = "Time_" + animations[i] + var seek_name = "Seek_" + animations[i] + + var new_anim_node := AnimationNodeAnimation.new() + new_anim_node.animation = animations[i] + blend_tree.add_node(anim_name, new_anim_node) + + var time_node := AnimationNodeTimeScale.new() + blend_tree.add_node(time_name,time_node) + + var seek_node := AnimationNodeTimeSeek.new() + blend_tree.add_node(seek_name,seek_node) + + var add_node := AnimationNodeAdd2.new() + blend_tree.add_node(add_name, add_node) + + blend_tree.connect_node(time_name, 0, anim_name) + blend_tree.connect_node(seek_name, 0, time_name) + blend_tree.connect_node(add_name, 0, prev_name) + blend_tree.connect_node(add_name, 1, seek_name) + prev_name = add_name + + blend_tree.connect_node("output", 0, prev_name) + + for i in range(0, animations.size()): + animation_tree.set("parameters/Add_" + str(animations[i]) + "/add_amount", 1.0) + animation_tree.set("parameters/Seek_" + str(animations[i]) + "/seek_request", 0) + animation_tree.set("parameters/Time_" + str(animations[i]) + "/scale", 0) + +func _physics_process(delta: float) -> void: + for key in movement_states: + var anim_path = "parameters/Seek_" + key + "/seek_request" + var state = movement_states[key] + if (state[0]): + state[1] = clamp(float(state[1]) + (delta * state[2]), 0, 1) + else: + state[1] = clamp(float(state[1]) - (delta * state[3]), 0, 1) + animation_tree.set(anim_path, state[1]) + +func _movement_in(movement, rate): + movement_states[movement][0] = true + movement_states[movement][2] = rate + +func _movement_out(movement, rate): + movement_states[movement][0] = false + movement_states[movement][3] = rate diff --git a/Scripts/AnimatronicController.gd.uid b/Scripts/AnimatronicController.gd.uid new file mode 100644 index 0000000..b63dd10 --- /dev/null +++ b/Scripts/AnimatronicController.gd.uid @@ -0,0 +1 @@ +uid://bu68w4jnh0n2b diff --git a/Scripts/LightController.gd b/Scripts/LightController.gd new file mode 100644 index 0000000..b5dc91d --- /dev/null +++ b/Scripts/LightController.gd @@ -0,0 +1,7 @@ +extends Node3D + +func _movement_in(movement, _rate): + get_node(movement).visible = true + +func _movement_out(movement, _rate): + get_node(movement).visible = false diff --git a/Scripts/LightController.gd.uid b/Scripts/LightController.gd.uid new file mode 100644 index 0000000..2a8204c --- /dev/null +++ b/Scripts/LightController.gd.uid @@ -0,0 +1 @@ +uid://d1p4ite8ts2wi diff --git a/project.godot b/project.godot new file mode 100644 index 0000000..395543a --- /dev/null +++ b/project.godot @@ -0,0 +1,19 @@ +; Engine configuration file. +; It's best edited using the editor UI and not directly, +; since the parameters that go here are not all obvious. +; +; Format: +; [section] ; section goes between [] +; param=value ; assign values to parameters + +config_version=5 + +[application] + +config/name="PneuMod-GreatTransformation" +config/features=PackedStringArray("4.4", "GL Compatibility") + +[rendering] + +renderer/rendering_method="gl_compatibility" +renderer/rendering_method.mobile="gl_compatibility"