Files
pixel-crusade/src/base_model.gd

84 lines
2.3 KiB
GDScript

extends Node
class_name Model
## Pixel to meters ratio.
const PIXEL_SIZE := 0.0048
## Scale from the miniature scale to real size.
const HEROIC_SCALE := 57.2
## Width to Height ratio of the image.
const W_H_RATIO := 1.4
# Basic Variables
@export var ModelName: String
@export var CustomName: String
@export var MovementDistance: int
## In mm.
@export var BaseSize: String
@export var MovementType: String
@export var RangeCharacteristic: DiceModifier
@export var MeleeCharacteristic: DiceModifier
@export var ArmorCharacteristic: DiceModifier
@export var KeywordsList: Array[String]
@export var CharacterSprite2D: CompressedTexture2D
func _init() -> void:
pass
# Called when the node enters the scene tree for the first time.
func _ready() -> void:
var base_model := _get_base_model(BaseSize)
var base_size = _get_base_size(BaseSize)
if $Pivot/Base.mesh == null and base_model != null:
$Pivot/Base.mesh = load(base_model)
$Pivot/Base.scale.x = HEROIC_SCALE / 1000
$Pivot/Base.scale.y = HEROIC_SCALE / 1000
$Pivot/Base.scale.z = HEROIC_SCALE / 1000
if $Pivot/Sprite2D.texture == null and CharacterSprite2D != null:
$Pivot/Sprite2D.texture = CharacterSprite2D
$Pivot/Sprite2D.pixel_size = PIXEL_SIZE
$Pivot/Sprite2D.position.y = base_size * W_H_RATIO * HEROIC_SCALE / 2
$CollisionShape3D.shape.radius = base_size / 2 * HEROIC_SCALE
$CollisionShape3D.shape.height = base_size * 1.4 * HEROIC_SCALE
$CollisionShape3D.position.y = base_size * 0.7 * HEROIC_SCALE * W_H_RATIO / 2
# Called every frame. 'delta' is the elapsed time since the previous frame.
func _process(_delta: float) -> void:
pass
# Utility functions
func _get_base_model(size: String) -> String:
match size:
"25":
return "res://assets/bases/base_25.glb"
"32":
return "res://assets/bases/base_32.obj"
"40":
return "res://assets/bases/base_40.glb"
"50":
return "res://assets/bases/base_50.glb"
"50":
return "res://assets/bases/base_60.glb"
"30x60":
return "res://assets/bases/base_30x60.glb"
return ""
func _get_base_size(size: String) -> float:
match size:
"25":
return 25.0 / 1000
"32":
return 32.0 / 1000
"40":
return 40.0 / 1000
"50":
return 50.0 / 1000
"50":
return 60.0 / 1000
"30x60":
return 60.0 / 1000
push_error("Not valid size of %s" % size)
return 0