Compare commits
9 Commits
77b9345f76
...
main
Author | SHA1 | Date | |
---|---|---|---|
f31a6ee0c2 | |||
fe0d76e370 | |||
beabc319e5 | |||
75a720eb45 | |||
9cf1956770 | |||
162fc09baa | |||
91d06311db | |||
a42c93ff6b | |||
5d2158fcaf |
7
.gitignore
vendored
7
.gitignore
vendored
@@ -1,2 +1,9 @@
|
|||||||
|
.DS_Store
|
||||||
|
|
||||||
# Godot 4+ specific ignores
|
# Godot 4+ specific ignores
|
||||||
.godot/
|
.godot/
|
||||||
|
|
||||||
|
export_presets.cfg
|
||||||
|
|
||||||
|
/AuthKey_VSYTQ75GZQ.p8
|
||||||
|
*.dds
|
||||||
|
72
AssetLoaders/Enums.gd
Normal file
72
AssetLoaders/Enums.gd
Normal file
@@ -0,0 +1,72 @@
|
|||||||
|
class_name Enums
|
||||||
|
|
||||||
|
enum TileID {
|
||||||
|
TileVoid = 0,
|
||||||
|
TileBlank = 1,
|
||||||
|
TileHome = 2,
|
||||||
|
TileBattle = 3,
|
||||||
|
TileDraw = 4,
|
||||||
|
TileBonus = 5,
|
||||||
|
TileDrop = 6,
|
||||||
|
TileWarp = 7,
|
||||||
|
TileDrawx2 = 8,
|
||||||
|
TileBonusx2 = 9,
|
||||||
|
TileDropx2 = 10,
|
||||||
|
TileFlatWall = 11,
|
||||||
|
TileVoid2 = 12, # i'm not sure why there's 8 voids, or if they're even used
|
||||||
|
TileVoid3 = 13,
|
||||||
|
TileVoid4 = 14,
|
||||||
|
TileVoid5 = 15,
|
||||||
|
TileVoid6 = 16,
|
||||||
|
TileVoid7 = 17,
|
||||||
|
TileDeck = 18,
|
||||||
|
TileVoid8 = 19,
|
||||||
|
TileBattlex2 = 20,
|
||||||
|
TileMove = 21,
|
||||||
|
TileMovex2 = 22,
|
||||||
|
TileWarpMove = 23,
|
||||||
|
TileWarpMovex2 = 24,
|
||||||
|
TileIce = 25,
|
||||||
|
TileSnow = 26,
|
||||||
|
TileHeal = 27,
|
||||||
|
TileHealx2 = 28,
|
||||||
|
TileEvent = 29, # OJEdit says "Event (Blank Tile)"
|
||||||
|
TileUnknown = 30,
|
||||||
|
TileCoopBoss = 31,
|
||||||
|
TileDamage = 32,
|
||||||
|
TileDamagex2 = 33,
|
||||||
|
TileMud = 34
|
||||||
|
}
|
||||||
|
|
||||||
|
static func get_tile_texture(id: int):
|
||||||
|
match id:
|
||||||
|
0: return ""
|
||||||
|
1: return "mass_common0.dat"
|
||||||
|
2: return "mass_check0.dat"
|
||||||
|
3: return "mass_encount0.dat"
|
||||||
|
4: return "mass_draw0.dat"
|
||||||
|
5: return "mass_bonus0.dat"
|
||||||
|
6: return "mass_drop0.dat"
|
||||||
|
7: return "mass_warp0.dat"
|
||||||
|
8: return "mass_drawL2.dat"
|
||||||
|
9: return "mass_bonusL2.dat"
|
||||||
|
10: return "mass_dropL2.dat"
|
||||||
|
11: return "mass_common0.dat"
|
||||||
|
12, 13, 14, 15, 16, 17: return ""
|
||||||
|
18: return "mass_editordeck.dat"
|
||||||
|
19: return ""
|
||||||
|
20: return "mass_encountL2.dat"
|
||||||
|
21: return "mass_move0.dat"
|
||||||
|
22: return "mass_moveL2.dat"
|
||||||
|
23: return "mass_warpmove0.dat"
|
||||||
|
24: return "mass_warpmoveL2.dat"
|
||||||
|
25: return "mass_snow0.dat"
|
||||||
|
26: return "mass_snow0.dat"
|
||||||
|
27: return "mass_heal.dat"
|
||||||
|
28: return "mass_healL2.dat"
|
||||||
|
29: return "mass_common0.dat"
|
||||||
|
30: return "mass_common0.dat"
|
||||||
|
31: return "mass_boss.dat"
|
||||||
|
32: return "mass_damage0.dat"
|
||||||
|
33: return "mass_damageL2.dat"
|
||||||
|
34: return "mass_mud.dat"
|
99
AssetLoaders/PakAssetLoader.gd
Normal file
99
AssetLoaders/PakAssetLoader.gd
Normal file
@@ -0,0 +1,99 @@
|
|||||||
|
class_name PakAssetLoader
|
||||||
|
|
||||||
|
static var key = "a8Yb5$IpVobR,1Xph!k(#!B9h$V[o[r-I'x.37Q%E;lt2wGgk)hNF_p_!mF?Ds54.*8ErbCK,30".to_utf8_buffer()
|
||||||
|
|
||||||
|
#loads a file from a .pak file.
|
||||||
|
static func load_file(path: String):
|
||||||
|
var split = path.split(".pak/")
|
||||||
|
var pak = split[0]
|
||||||
|
var filename = split[1]
|
||||||
|
|
||||||
|
var zip_reader = ZIPReader.new()
|
||||||
|
var err = zip_reader.open(pak + ".pak")
|
||||||
|
if err != OK:
|
||||||
|
report_errors(err, pak + ".pak")
|
||||||
|
zip_reader.close()
|
||||||
|
var bytes = zip_reader.read_file(filename)
|
||||||
|
zip_reader.close()
|
||||||
|
if bytes.size() == 0:
|
||||||
|
report_errors(ERR_FILE_NOT_FOUND, filename)
|
||||||
|
|
||||||
|
if filename.ends_with(".dat"):
|
||||||
|
var magic = bytes[0]+bytes[1]+bytes[2]+bytes[3]
|
||||||
|
if magic == 0x25 + 0x7C + 0x0A + 0x42: #XOR'ed DDS file
|
||||||
|
unXOR(bytes)
|
||||||
|
magic = bytes[0]+bytes[1]+bytes[2]+bytes[3]
|
||||||
|
|
||||||
|
if magic == 0x44 + 0x44 + 0x53 + 0x20: #DDS file
|
||||||
|
var header = bytes.slice(0, 0x80)
|
||||||
|
bytes = bytes.slice(0x80)
|
||||||
|
var height = header[0xc] + (header[0xd] * 256)
|
||||||
|
var width = header[0x10] + (header[0x11] * 256)
|
||||||
|
var format = header[0x54]+header[0x55]+header[0x56]+header[0x57]
|
||||||
|
if format == 0:
|
||||||
|
fix_BGRA(bytes)
|
||||||
|
var img = Image.create_from_data(width, height, false, Image.FORMAT_RGBA8, bytes)
|
||||||
|
return ImageTexture.create_from_image(img)
|
||||||
|
elif format == 0x44 + 0x58 + 0x54 + 0x35:
|
||||||
|
var img = Image.create_from_data(width, height, false, Image.FORMAT_DXT5, bytes)
|
||||||
|
return ImageTexture.create_from_image(img)
|
||||||
|
else:
|
||||||
|
report_errors(ERR_FILE_UNRECOGNIZED, filename)
|
||||||
|
return
|
||||||
|
else:
|
||||||
|
report_errors(ERR_FILE_UNRECOGNIZED, filename)
|
||||||
|
return
|
||||||
|
elif filename.ends_with(".ogg"):
|
||||||
|
var magic = bytes[0]+bytes[1]+bytes[2]+bytes[3]
|
||||||
|
|
||||||
|
if magic == 0x4F + 0x67 + 0x67 + 0x53:
|
||||||
|
var stream = AudioStreamOggVorbis.load_from_buffer(bytes)
|
||||||
|
stream.loop = true
|
||||||
|
stream.loop_offset = get_loop_off(filename)
|
||||||
|
return stream
|
||||||
|
else:
|
||||||
|
report_errors(ERR_FILE_UNRECOGNIZED, filename)
|
||||||
|
elif filename.ends_with(".fld"):
|
||||||
|
return bytes
|
||||||
|
|
||||||
|
|
||||||
|
static func fix_BGRA(bytes: PackedByteArray):
|
||||||
|
for i in range(0, bytes.size(), 4):
|
||||||
|
var tmp = bytes[i]
|
||||||
|
bytes[i] = bytes[i+2]
|
||||||
|
bytes[i+2] = tmp
|
||||||
|
|
||||||
|
static func unXOR(bytes: PackedByteArray):
|
||||||
|
for i in range(bytes.size()):
|
||||||
|
bytes[i] ^= key[i % key.size()]
|
||||||
|
|
||||||
|
|
||||||
|
static func get_loop_off(filename: String):
|
||||||
|
match filename:
|
||||||
|
"bgm/0.ogg":
|
||||||
|
return 1.72
|
||||||
|
"bgm/1.ogg":
|
||||||
|
return 2
|
||||||
|
|
||||||
|
|
||||||
|
static func report_errors(err: int, filepath):
|
||||||
|
# See: https://docs.godotengine.org/en/latest/classes/class_@globalscope.html#enum-globalscope-error
|
||||||
|
var result_hash = {
|
||||||
|
ERR_FILE_NOT_FOUND: "File: not found",
|
||||||
|
ERR_FILE_BAD_DRIVE: "File: Bad drive error",
|
||||||
|
ERR_FILE_BAD_PATH: "File: Bad path error.",
|
||||||
|
ERR_FILE_NO_PERMISSION: "File: No permission error.",
|
||||||
|
ERR_FILE_ALREADY_IN_USE: "File: Already in use error.",
|
||||||
|
ERR_FILE_CANT_OPEN: "File: Can't open error.",
|
||||||
|
ERR_FILE_CANT_WRITE: "File: Can't write error.",
|
||||||
|
ERR_FILE_CANT_READ: "File: Can't read error.",
|
||||||
|
ERR_FILE_UNRECOGNIZED: "File: Unrecognized error.",
|
||||||
|
ERR_FILE_CORRUPT: "File: Corrupt error.",
|
||||||
|
ERR_FILE_MISSING_DEPENDENCIES: "File: Missing dependencies error.",
|
||||||
|
ERR_FILE_EOF: "File: End of file (EOF) error."
|
||||||
|
}
|
||||||
|
if err in result_hash:
|
||||||
|
print("Error: ", result_hash[err], " ", filepath)
|
||||||
|
else:
|
||||||
|
print("Unknown error with file ", filepath, " error code: ", err)
|
||||||
|
|
53
Field/field.gd
Normal file
53
Field/field.gd
Normal file
@@ -0,0 +1,53 @@
|
|||||||
|
extends Node2D
|
||||||
|
|
||||||
|
var width: int
|
||||||
|
var height: int
|
||||||
|
var tiles: Array = []
|
||||||
|
var x = 1
|
||||||
|
var homes
|
||||||
|
var next_home
|
||||||
|
|
||||||
|
func _init():
|
||||||
|
var bytes = PakAssetLoader.load_file("user://data/fields.pak/field_practice.fld")
|
||||||
|
create_from_buffer(bytes)
|
||||||
|
|
||||||
|
# Called when the node enters the scene tree for the first time.
|
||||||
|
func _ready():
|
||||||
|
$BGSprite.texture = PakAssetLoader.load_file("user://data/fields.pak/practice_l.dat")
|
||||||
|
homes = tiles.filter(is_home)
|
||||||
|
$Unit.position = homes[0].position
|
||||||
|
next_home = homes[1].position
|
||||||
|
homes = [homes[0], homes[1], homes[3], homes[2]]
|
||||||
|
pass
|
||||||
|
|
||||||
|
func is_home(tile):
|
||||||
|
return tile.id == Enums.TileID.TileHome
|
||||||
|
|
||||||
|
|
||||||
|
# Called every frame. 'delta' is the elapsed time since the previous frame.
|
||||||
|
func _process(delta):
|
||||||
|
var move_speed = delta * 60.0
|
||||||
|
if $Unit.position != next_home:
|
||||||
|
$Unit.position = $Unit.position.move_toward(next_home, move_speed * 8)
|
||||||
|
else:
|
||||||
|
x += 1
|
||||||
|
next_home = homes[x % 4].position
|
||||||
|
pass
|
||||||
|
|
||||||
|
|
||||||
|
func create_from_buffer(bytes: PackedByteArray):
|
||||||
|
var num_tiles = bytes.size() / 8
|
||||||
|
|
||||||
|
# all boards are square
|
||||||
|
height = int(sqrt(num_tiles))
|
||||||
|
width = int(sqrt(num_tiles))
|
||||||
|
var j = 0;
|
||||||
|
for i in range(0, num_tiles):
|
||||||
|
var tile = load("res://Field/tile.tscn").instantiate()
|
||||||
|
tile.id = bytes.decode_u32(i * 8)
|
||||||
|
# var exit_bits = bytes.decode_u8((i * 8) + 4)
|
||||||
|
add_child.call_deferred(tile)
|
||||||
|
tile.position = Vector2(((i % width) * 158) + 64, (j * 158) + 64)
|
||||||
|
tiles.append(tile)
|
||||||
|
if i % height == height - 1:
|
||||||
|
j += 1
|
23
Field/field.tscn
Normal file
23
Field/field.tscn
Normal file
@@ -0,0 +1,23 @@
|
|||||||
|
[gd_scene load_steps=5 format=3 uid="uid://qipfodwbk1gf"]
|
||||||
|
|
||||||
|
[ext_resource type="Script" path="res://Field/field.gd" id="1_6uvjw"]
|
||||||
|
[ext_resource type="PackedScene" uid="uid://dtm0201qhcn4d" path="res://Unit/unit.tscn" id="2_jhvjp"]
|
||||||
|
[ext_resource type="Shader" path="res://PanningCamera/background.gdshader" id="3_l3ah4"]
|
||||||
|
|
||||||
|
[sub_resource type="ShaderMaterial" id="ShaderMaterial_jb3sl"]
|
||||||
|
shader = ExtResource("3_l3ah4")
|
||||||
|
|
||||||
|
[node name="Field" type="Node2D"]
|
||||||
|
script = ExtResource("1_6uvjw")
|
||||||
|
metadata/_edit_group_ = true
|
||||||
|
|
||||||
|
[node name="BGSprite" type="Sprite2D" parent="."]
|
||||||
|
texture_repeat = 2
|
||||||
|
material = SubResource("ShaderMaterial_jb3sl")
|
||||||
|
position = Vector2(900, 900)
|
||||||
|
scale = Vector2(2, 2)
|
||||||
|
offset = Vector2(2.08165e-12, 2.08165e-12)
|
||||||
|
region_enabled = true
|
||||||
|
region_rect = Rect2(2.08165e-12, -704, 6000, 6000)
|
||||||
|
|
||||||
|
[node name="Unit" parent="." instance=ExtResource("2_jhvjp")]
|
26
Field/tile.gd
Normal file
26
Field/tile.gd
Normal file
@@ -0,0 +1,26 @@
|
|||||||
|
extends Node2D
|
||||||
|
|
||||||
|
var id: Enums.TileID
|
||||||
|
var enter: Array
|
||||||
|
var exit: Array
|
||||||
|
|
||||||
|
# Called when the node enters the scene tree for the first time.
|
||||||
|
func _ready():
|
||||||
|
var tex = Enums.get_tile_texture(id)
|
||||||
|
if tex != "":
|
||||||
|
$Sprite2D.texture = PakAssetLoader.load_file("user://data/field.pak/" + tex)
|
||||||
|
$Base.texture = PakAssetLoader.load_file("user://data/field.pak/mass_base0.dat")
|
||||||
|
|
||||||
|
# if id == Enums.TileID.TileIce:
|
||||||
|
# var layer = Sprite2D.new()
|
||||||
|
# var snow = Enums.get_tile_texture(Enums.TileID.TileSnow)
|
||||||
|
# layer.texture = PakAssetLoader.load_file("user://data/field.pak/" + snow)
|
||||||
|
# layer.flip_v = true
|
||||||
|
# print($Sprite2D.z_index)
|
||||||
|
# $Sprite2D.add_child(layer)
|
||||||
|
# layer.show_behind_parent = true
|
||||||
|
|
||||||
|
|
||||||
|
# Called every frame. 'delta' is the elapsed time since the previous frame.
|
||||||
|
func _process(_delta):
|
||||||
|
pass
|
14
Field/tile.tscn
Normal file
14
Field/tile.tscn
Normal file
@@ -0,0 +1,14 @@
|
|||||||
|
[gd_scene load_steps=2 format=3 uid="uid://b8vsmp8c1wqv6"]
|
||||||
|
|
||||||
|
[ext_resource type="Script" path="res://Field/tile.gd" id="1_kltr3"]
|
||||||
|
|
||||||
|
[node name="Tile" type="Node2D"]
|
||||||
|
script = ExtResource("1_kltr3")
|
||||||
|
|
||||||
|
[node name="Base" type="Sprite2D" parent="."]
|
||||||
|
scale = Vector2(1.45, 1.45)
|
||||||
|
flip_v = true
|
||||||
|
|
||||||
|
[node name="Sprite2D" type="Sprite2D" parent="."]
|
||||||
|
scale = Vector2(1.2, 1.2)
|
||||||
|
flip_v = true
|
41
PanningCamera/PanningCamera2D.gd
Normal file
41
PanningCamera/PanningCamera2D.gd
Normal file
@@ -0,0 +1,41 @@
|
|||||||
|
extends Camera2D
|
||||||
|
|
||||||
|
@export var MIN_ZOOM: float = 0.5
|
||||||
|
@export var MAX_ZOOM: float = 3.0
|
||||||
|
@export var ZOOM_RATE: float = 8.0
|
||||||
|
@export var ZOOM_INCREMENT: float = 0.1
|
||||||
|
|
||||||
|
var target_zoom: float = 1.0
|
||||||
|
var reset_pos: Vector2 = Vector2(0.0, 0.0)
|
||||||
|
|
||||||
|
|
||||||
|
func _physics_process(delta: float) -> void:
|
||||||
|
zoom = lerp(zoom, target_zoom * Vector2.ONE, ZOOM_RATE * delta)
|
||||||
|
set_physics_process(not is_equal_approx(zoom.x, target_zoom))
|
||||||
|
|
||||||
|
|
||||||
|
func _unhandled_input(event: InputEvent) -> void:
|
||||||
|
if event is InputEventMouseButton:
|
||||||
|
if event.is_pressed():
|
||||||
|
if event.button_index == MOUSE_BUTTON_WHEEL_UP:
|
||||||
|
zoom_in()
|
||||||
|
if event.button_index == MOUSE_BUTTON_WHEEL_DOWN:
|
||||||
|
zoom_out()
|
||||||
|
if event is InputEventMouseMotion:
|
||||||
|
if event.button_mask == MOUSE_BUTTON_MASK_LEFT:
|
||||||
|
position -= event.relative / zoom
|
||||||
|
if event is InputEventKey:
|
||||||
|
if event.keycode == KEY_SPACE:
|
||||||
|
target_zoom = 1.0
|
||||||
|
zoom = Vector2(1.0, 1.0)
|
||||||
|
position = reset_pos
|
||||||
|
|
||||||
|
|
||||||
|
func zoom_in() -> void:
|
||||||
|
target_zoom = max(target_zoom - ZOOM_INCREMENT, MIN_ZOOM)
|
||||||
|
set_physics_process(true)
|
||||||
|
|
||||||
|
|
||||||
|
func zoom_out() -> void:
|
||||||
|
target_zoom = min(target_zoom + ZOOM_INCREMENT, MAX_ZOOM)
|
||||||
|
set_physics_process(true)
|
14
PanningCamera/background.gdshader
Normal file
14
PanningCamera/background.gdshader
Normal file
@@ -0,0 +1,14 @@
|
|||||||
|
shader_type canvas_item;
|
||||||
|
|
||||||
|
const float y_speed = 0.5 / 3.0;
|
||||||
|
const float x_speed = 0.1 / 3.0;
|
||||||
|
|
||||||
|
void fragment() {
|
||||||
|
vec2 new_uv = vec2(UV.x + TIME * x_speed, UV.y + TIME * y_speed);
|
||||||
|
COLOR = texture(TEXTURE, new_uv);
|
||||||
|
}
|
||||||
|
|
||||||
|
//void light() {
|
||||||
|
// Called for every pixel for every light affecting the CanvasItem.
|
||||||
|
// Uncomment to replace the default light processing function with this one.
|
||||||
|
//}
|
21
Unit/unit.gd
Normal file
21
Unit/unit.gd
Normal file
@@ -0,0 +1,21 @@
|
|||||||
|
extends Node2D
|
||||||
|
|
||||||
|
var yvel = 1
|
||||||
|
var yoff = 0
|
||||||
|
|
||||||
|
|
||||||
|
# Called when the node enters the scene tree for the first time.
|
||||||
|
func _ready():
|
||||||
|
$UnitSprite.texture = PakAssetLoader.load_file("user://data/units.pak/tomomo_00_00.dat")
|
||||||
|
$UnitSprite.position = get_parent().to_global(position)
|
||||||
|
$UnitSprite/AnimationPlayer.play("move")
|
||||||
|
$UnitSprite/AnimationPlayer.speed_scale = 1
|
||||||
|
|
||||||
|
$RingSprite.texture = PakAssetLoader.load_file("user://data/system.pak/playerring1.dat")
|
||||||
|
$RingSprite/AnimationPlayer.play("spin")
|
||||||
|
|
||||||
|
|
||||||
|
# Called every frame. 'delta' is the elapsed time since the previous frame.
|
||||||
|
func _process(_delta):
|
||||||
|
$UnitSprite.position = get_parent().to_global(position)
|
||||||
|
pass
|
134
Unit/unit.tscn
Normal file
134
Unit/unit.tscn
Normal file
@@ -0,0 +1,134 @@
|
|||||||
|
[gd_scene load_steps=9 format=3 uid="uid://dtm0201qhcn4d"]
|
||||||
|
|
||||||
|
[ext_resource type="Script" path="res://Unit/unit.gd" id="1_6ggpr"]
|
||||||
|
|
||||||
|
[sub_resource type="Animation" id="Animation_ijbbj"]
|
||||||
|
length = 0.001
|
||||||
|
tracks/0/type = "value"
|
||||||
|
tracks/0/imported = false
|
||||||
|
tracks/0/enabled = true
|
||||||
|
tracks/0/path = NodePath(".:rotation")
|
||||||
|
tracks/0/interp = 1
|
||||||
|
tracks/0/loop_wrap = true
|
||||||
|
tracks/0/keys = {
|
||||||
|
"times": PackedFloat32Array(0),
|
||||||
|
"transitions": PackedFloat32Array(1),
|
||||||
|
"update": 0,
|
||||||
|
"values": [0.0]
|
||||||
|
}
|
||||||
|
|
||||||
|
[sub_resource type="Animation" id="Animation_wu12n"]
|
||||||
|
resource_name = "spin"
|
||||||
|
length = 7.00001
|
||||||
|
loop_mode = 1
|
||||||
|
tracks/0/type = "value"
|
||||||
|
tracks/0/imported = false
|
||||||
|
tracks/0/enabled = true
|
||||||
|
tracks/0/path = NodePath(".:rotation")
|
||||||
|
tracks/0/interp = 1
|
||||||
|
tracks/0/loop_wrap = false
|
||||||
|
tracks/0/keys = {
|
||||||
|
"times": PackedFloat32Array(0, 7),
|
||||||
|
"transitions": PackedFloat32Array(1, 1),
|
||||||
|
"update": 0,
|
||||||
|
"values": [0.0, 6.28319]
|
||||||
|
}
|
||||||
|
|
||||||
|
[sub_resource type="AnimationLibrary" id="AnimationLibrary_fvvof"]
|
||||||
|
_data = {
|
||||||
|
"RESET": SubResource("Animation_ijbbj"),
|
||||||
|
"spin": SubResource("Animation_wu12n")
|
||||||
|
}
|
||||||
|
|
||||||
|
[sub_resource type="Animation" id="Animation_nsm8w"]
|
||||||
|
length = 0.001
|
||||||
|
tracks/0/type = "value"
|
||||||
|
tracks/0/imported = false
|
||||||
|
tracks/0/enabled = true
|
||||||
|
tracks/0/path = NodePath(".:scale")
|
||||||
|
tracks/0/interp = 1
|
||||||
|
tracks/0/loop_wrap = true
|
||||||
|
tracks/0/keys = {
|
||||||
|
"times": PackedFloat32Array(0),
|
||||||
|
"transitions": PackedFloat32Array(1),
|
||||||
|
"update": 0,
|
||||||
|
"values": [Vector2(1, 1)]
|
||||||
|
}
|
||||||
|
tracks/1/type = "value"
|
||||||
|
tracks/1/imported = false
|
||||||
|
tracks/1/enabled = true
|
||||||
|
tracks/1/path = NodePath(".:offset")
|
||||||
|
tracks/1/interp = 1
|
||||||
|
tracks/1/loop_wrap = true
|
||||||
|
tracks/1/keys = {
|
||||||
|
"times": PackedFloat32Array(0),
|
||||||
|
"transitions": PackedFloat32Array(1),
|
||||||
|
"update": 0,
|
||||||
|
"values": [Vector2(2.08165e-12, -128)]
|
||||||
|
}
|
||||||
|
|
||||||
|
[sub_resource type="Animation" id="Animation_yme65"]
|
||||||
|
resource_name = "idle"
|
||||||
|
length = 1.2
|
||||||
|
loop_mode = 2
|
||||||
|
tracks/0/type = "value"
|
||||||
|
tracks/0/imported = false
|
||||||
|
tracks/0/enabled = true
|
||||||
|
tracks/0/path = NodePath(".:scale")
|
||||||
|
tracks/0/interp = 1
|
||||||
|
tracks/0/loop_wrap = true
|
||||||
|
tracks/0/keys = {
|
||||||
|
"times": PackedFloat32Array(0, 1.2),
|
||||||
|
"transitions": PackedFloat32Array(-2, 1),
|
||||||
|
"update": 0,
|
||||||
|
"values": [Vector2(1, 1), Vector2(1.05, 0.97)]
|
||||||
|
}
|
||||||
|
|
||||||
|
[sub_resource type="Animation" id="Animation_mqx3b"]
|
||||||
|
resource_name = "move"
|
||||||
|
length = 0.116668
|
||||||
|
loop_mode = 2
|
||||||
|
step = 0.0166667
|
||||||
|
tracks/0/type = "value"
|
||||||
|
tracks/0/imported = false
|
||||||
|
tracks/0/enabled = true
|
||||||
|
tracks/0/path = NodePath(".:offset")
|
||||||
|
tracks/0/interp = 1
|
||||||
|
tracks/0/loop_wrap = true
|
||||||
|
tracks/0/keys = {
|
||||||
|
"times": PackedFloat32Array(0, 0.116667),
|
||||||
|
"transitions": PackedFloat32Array(0.435275, 1),
|
||||||
|
"update": 0,
|
||||||
|
"values": [Vector2(2.08165e-12, -128), Vector2(2.08165e-12, -158)]
|
||||||
|
}
|
||||||
|
|
||||||
|
[sub_resource type="AnimationLibrary" id="AnimationLibrary_8dthf"]
|
||||||
|
_data = {
|
||||||
|
"RESET": SubResource("Animation_nsm8w"),
|
||||||
|
"idle": SubResource("Animation_yme65"),
|
||||||
|
"move": SubResource("Animation_mqx3b")
|
||||||
|
}
|
||||||
|
|
||||||
|
[node name="Unit" type="Node2D"]
|
||||||
|
z_index = 1
|
||||||
|
script = ExtResource("1_6ggpr")
|
||||||
|
metadata/_edit_group_ = true
|
||||||
|
|
||||||
|
[node name="RingSprite" type="Sprite2D" parent="."]
|
||||||
|
flip_v = true
|
||||||
|
|
||||||
|
[node name="AnimationPlayer" type="AnimationPlayer" parent="RingSprite"]
|
||||||
|
libraries = {
|
||||||
|
"": SubResource("AnimationLibrary_fvvof")
|
||||||
|
}
|
||||||
|
|
||||||
|
[node name="UnitSprite" type="Sprite2D" parent="."]
|
||||||
|
top_level = true
|
||||||
|
z_index = 2
|
||||||
|
offset = Vector2(2.08165e-12, -128)
|
||||||
|
flip_h = true
|
||||||
|
|
||||||
|
[node name="AnimationPlayer" type="AnimationPlayer" parent="UnitSprite"]
|
||||||
|
libraries = {
|
||||||
|
"": SubResource("AnimationLibrary_8dthf")
|
||||||
|
}
|
12
main.gd
Normal file
12
main.gd
Normal file
@@ -0,0 +1,12 @@
|
|||||||
|
extends Node2D
|
||||||
|
|
||||||
|
|
||||||
|
# Called when the node enters the scene tree for the first time.
|
||||||
|
func _ready():
|
||||||
|
var center = $Field.to_global($Field.tiles[$Field.tiles.size() / 2].position)
|
||||||
|
$Camera2D.position = center
|
||||||
|
$Camera2D.reset_pos = center
|
||||||
|
|
||||||
|
# Called every frame. 'delta' is the elapsed time since the previous frame.
|
||||||
|
func _process(_delta):
|
||||||
|
pass
|
22
main.tscn
Normal file
22
main.tscn
Normal file
@@ -0,0 +1,22 @@
|
|||||||
|
[gd_scene load_steps=4 format=3 uid="uid://djirenq1psstj"]
|
||||||
|
|
||||||
|
[ext_resource type="Script" path="res://main.gd" id="1_2dcib"]
|
||||||
|
[ext_resource type="Script" path="res://PanningCamera/PanningCamera2D.gd" id="1_vtapg"]
|
||||||
|
[ext_resource type="PackedScene" uid="uid://qipfodwbk1gf" path="res://Field/field.tscn" id="1_y0qkv"]
|
||||||
|
|
||||||
|
[node name="Main" type="Node2D"]
|
||||||
|
script = ExtResource("1_2dcib")
|
||||||
|
metadata/_edit_group_ = true
|
||||||
|
|
||||||
|
[node name="Camera2D" type="Camera2D" parent="."]
|
||||||
|
limit_left = -5000
|
||||||
|
limit_top = -2000
|
||||||
|
limit_right = 5000
|
||||||
|
limit_bottom = 4000
|
||||||
|
editor_draw_limits = true
|
||||||
|
script = ExtResource("1_vtapg")
|
||||||
|
ZOOM_RATE = 5.0
|
||||||
|
|
||||||
|
[node name="Field" parent="." instance=ExtResource("1_y0qkv")]
|
||||||
|
rotation = 0.523599
|
||||||
|
skew = 0.523599
|
@@ -11,10 +11,22 @@ config_version=5
|
|||||||
[application]
|
[application]
|
||||||
|
|
||||||
config/name="Open100OJ"
|
config/name="Open100OJ"
|
||||||
|
run/main_scene="res://main.tscn"
|
||||||
config/features=PackedStringArray("4.2", "GL Compatibility")
|
config/features=PackedStringArray("4.2", "GL Compatibility")
|
||||||
config/icon="res://icon.svg"
|
config/icon="res://icon.svg"
|
||||||
|
|
||||||
|
[debug]
|
||||||
|
|
||||||
|
gdscript/warnings/integer_division=0
|
||||||
|
|
||||||
|
[display]
|
||||||
|
|
||||||
|
window/size/viewport_width=1920
|
||||||
|
window/size/viewport_height=1080
|
||||||
|
window/vsync/vsync_mode=0
|
||||||
|
|
||||||
[rendering]
|
[rendering]
|
||||||
|
|
||||||
renderer/rendering_method="gl_compatibility"
|
renderer/rendering_method="mobile"
|
||||||
renderer/rendering_method.mobile="gl_compatibility"
|
renderer/rendering_method.mobile="gl_compatibility"
|
||||||
|
textures/vram_compression/import_etc2_astc=true
|
||||||
|
Reference in New Issue
Block a user