Files

92 lines
4.1 KiB
GDScript

@tool
extends Node2D
const FONT = preload("res://games/galaga/art/spr_galaga_screens_fonts.png")
const SHEET = preload("res://games/galaga/art/spr_galaga.png")
var attract_time := 0.0
var previous_state := ""
var high_score := 20000
var edge_mask: Node2D
func _ready() -> void:
texture_filter = CanvasItem.TEXTURE_FILTER_NEAREST
edge_mask = preload("res://games/galaga/galaga_edge_mask.gd").new()
edge_mask.z_index = 100
add_child(edge_mask)
func _process(delta: float) -> void:
var game = get_parent()
if game.state == "idle":
if previous_state != "idle": attract_time = 0.0
attract_time += delta
for actor in get_children():
if actor == edge_mask: continue
if game.state == "idle" and not Engine.is_editor_hint(): actor.visible = false
previous_state = game.state
high_score = maxi(high_score,game.score)
var size := get_viewport_rect().size
var factor := maxf(0.1,minf(size.x/224.0,size.y/288.0))
if factor >= 1: factor = floorf(factor)
scale = Vector2.ONE*factor
position = ((size-Vector2(224,288)*factor)/2).floor()
queue_redraw()
func _draw() -> void:
draw_rect(Rect2(-1000,-1000,2224,2288),Color.BLACK)
var star_clock: float = attract_time if get_parent().state=="idle" else get_parent().clock
for i in range(90):
var x := fposmod(i*73.0,224)
var y := fposmod(i*113.0+star_clock*(12+i%3*8),288)
if (int(star_clock*2)+i)%7!=0:
draw_rect(Rect2(Vector2(x,y).round(),Vector2.ONE),[Color.CYAN,Color.RED,Color.YELLOW,Color.BLUE,Color.MAGENTA,Color.WHITE][i%6]*0.7)
if get_parent().state == "idle" and not Engine.is_editor_hint():
_attract()
return
_text("1UP %06d" % get_parent().score,Vector2(8,4))
if get_parent().state != "intro":
for i in range(mini(5,maxi(0,get_parent().lives-1))):
draw_texture_rect_region(SHEET,Rect2(8+i*16,270,16,16),Rect2(109,1,16,16))
_text("STAGE %d" % get_parent().stage,Vector2(144,278))
var text: String = {"intro":"PLAYER 1","stage_card":"STAGE %d" % get_parent().stage,"ready":"PLAYER 1 STAGE %d" % get_parent().stage,"won":"YOU WIN!","lost":"GAME OVER","clear":"STAGE CLEAR"}.get(get_parent().state,"")
if text != "": _text(text,Vector2((224-text.length()*8)/2,180),Color.CYAN)
if get_parent().state=="captured_return": _center("FIGHTER CAPTURED",180,Color.CYAN)
elif get_parent().state=="capture_ready": _center("READY",180,Color.CYAN)
var game = get_parent()
if not game.beam.is_empty() and game.beam.mode=="beam":
var source_x := 289+int(game.clock*8)%3*50
draw_texture_rect_region(SHEET,Rect2(game.beam.node.position.round()+Vector2(-24,8),Vector2(48,79)),Rect2(source_x,36,48,79))
func _text(message: String, at: Vector2, tint := Color.WHITE) -> void:
var chars := "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"
for i in range(message.length()):
var index := chars.find(message[i])
if index<0: continue
var row := 0 if index<25 else 1
var col := index if row==0 else index-25
draw_texture_rect_region(FONT,Rect2(at+Vector2(i*8,0),Vector2(7,7)),Rect2(454+col*9,443+row*9,7,7),tint)
func _center(message: String, y: float, tint := Color.WHITE) -> void:
_text(message,Vector2((224-message.length()*8)/2,y),tint)
func _attract() -> void:
_text("1UP",Vector2(16,0),Color.RED)
_text("HIGH SCORE",Vector2(72,0),Color.RED)
_text("2UP",Vector2(184,0),Color.RED)
_center(str(high_score).pad_zeros(6),10)
if int(attract_time / 8.0) % 2 == 0:
_center("PUSH START BUTTON",104,Color.CYAN)
var bonus: int = get_parent().extra_life_score
var messages := ["1ST BONUS FOR %d PTS" % bonus,"2ND BONUS FOR %d PTS" % get_parent().second_extra_life_score,"AND FOR EVERY %d PTS" % get_parent().repeat_extra_life_interval]
for i in range(3):
_text(messages[i],Vector2(24,136+i*24),Color.YELLOW)
draw_texture_rect_region(SHEET,Rect2(8,132+i*24,16,16),Rect2(109,1,16,16))
else:
_center("THE GALACTIC HEROES",56,Color.BLUE)
_center("BEST 5",112,Color.RED)
_text("SCORE NAME",Vector2(64,152),Color.CYAN)
for i in range(5):
_text(["1ST","2ND","3RD","4TH","5TH"][i],Vector2(24,176+i*16),Color.CYAN)
_text(str(high_score if i==0 else (5-i)*1000).pad_zeros(6),Vector2(64,176+i*16),Color.CYAN)
_text(["AAA","BBB","CCC","DDD","EEE"][i],Vector2(144,176+i*16),Color.CYAN)
_text("CREDIT %d" % get_parent().credits,Vector2(8,278))