Finished working on the minimap system for the test level, shows pawns, enemy and friendly traps, and unfinished 'items'
This commit is contained in:
@@ -1,15 +1,24 @@
|
||||
extends Node
|
||||
|
||||
|
||||
enum Modes{
|
||||
STORY,
|
||||
VS_COM,
|
||||
VS_MAN
|
||||
}
|
||||
|
||||
const blinder_template = preload("res://templates/blinder.tscn")
|
||||
const one_shot_template = preload("res://templates/one_shot.tscn")
|
||||
|
||||
const story_level = preload("res://scenes/test_level.tscn")
|
||||
const vs_com_level = preload("res://scenes/test_level.tscn")
|
||||
const vs_man_level = preload("res://scenes/test_level.tscn")
|
||||
const pawn_select_scene = preload("res://scenes/character_select.tscn")
|
||||
|
||||
var player : PawnController
|
||||
var hud : HUD
|
||||
var level : Level
|
||||
var mode : Modes = Modes.STORY
|
||||
var multiplayer_game : bool = false
|
||||
var num_players : int = 1
|
||||
var pawns_selected : Dictionary[int, PawnBaseData] = {}
|
||||
@@ -47,7 +56,13 @@ func start_level(pawns : Dictionary[int, PawnBaseData]) -> void:
|
||||
for i in Multiplayer.players.values():
|
||||
level_synced[i] = false
|
||||
level_synced[1] = true
|
||||
switch_scene(vs_man_level)
|
||||
match(mode):
|
||||
Modes.STORY:
|
||||
switch_scene(story_level, false)
|
||||
Modes.VS_COM:
|
||||
switch_scene(vs_com_level, false)
|
||||
Modes.VS_MAN:
|
||||
switch_scene(vs_man_level)
|
||||
|
||||
func switch_scene(packed_scene : PackedScene, spawn : bool = true) -> void:
|
||||
var blinder = blinder_template.instantiate() as TextureRect
|
||||
|
||||
1
scripts/item.gd
Normal file
1
scripts/item.gd
Normal file
@@ -0,0 +1 @@
|
||||
class_name Item extends Area3D
|
||||
1
scripts/item.gd.uid
Normal file
1
scripts/item.gd.uid
Normal file
@@ -0,0 +1 @@
|
||||
uid://bjgeppx4pmk66
|
||||
@@ -1,5 +1,14 @@
|
||||
class_name Level extends Node3D
|
||||
|
||||
|
||||
const map_marker_templates : Dictionary[String, PackedScene] = {
|
||||
"pawn" : preload("res://templates/markers/pawn_marker.tscn"),
|
||||
"friendly_trap":preload("res://templates/markers/friendly_trap_marker.tscn"),
|
||||
"enemy_trap": preload("res://templates/markers/enemy_trap_marker.tscn"),
|
||||
"item": preload("res://templates/markers/item_marker.tscn")
|
||||
}
|
||||
|
||||
|
||||
const pawn_controller = preload("res://templates/pawn_controller.tscn")
|
||||
const trap_template = preload("res://templates/trap.tscn")
|
||||
const camera_template = preload("res://templates/pawn_camera.tscn")
|
||||
@@ -13,13 +22,19 @@ const camera_offset = Vector3(0, 10, 5.25)
|
||||
@onready var pawns_node : Node3D = %Pawns
|
||||
@onready var traps_node : Node3D = %Traps
|
||||
@onready var cameras_node : Node3D = %Cameras
|
||||
@onready var map_markers_node : Node3D = %MapMarkers
|
||||
@export var difficulty : int = 1
|
||||
|
||||
var traps : Dictionary[Vector3i, Trap] = {}
|
||||
var pawns : Dictionary[int, PawnController] = {}
|
||||
var cameras : Dictionary[int, PawnCamera] = {}
|
||||
var map_markers : Dictionary[Object, MapMarker] = {}
|
||||
|
||||
func _ready() -> void:
|
||||
Game.level = self
|
||||
if Game.mode == Game.Modes.STORY:
|
||||
setup()
|
||||
add_level_trap.call_deferred(Trap.Type.MINE, Vector3.ZERO, Vector3i(5,0,3))
|
||||
|
||||
func setup() -> void:
|
||||
if Multiplayer.is_host():
|
||||
@@ -120,3 +135,37 @@ func disarm_trap(crd : Vector3i) -> void:
|
||||
var trap = traps[crd]
|
||||
trap.disarm()
|
||||
traps.erase(crd)
|
||||
|
||||
func remove_map_marker(target) -> void:
|
||||
if !map_markers.has(target):
|
||||
printerr("Tried to remove a map marker for %s but marker does not exist!" % target.name)
|
||||
else:
|
||||
map_markers[target].queue_free()
|
||||
map_markers[target] = null
|
||||
|
||||
func add_map_marker(target) -> void:
|
||||
var marker : MapMarker
|
||||
var height : float
|
||||
if target is PawnController:
|
||||
marker = map_marker_templates.pawn.instantiate()
|
||||
height += 40
|
||||
elif target is Trap:
|
||||
if target.trap_owner == Multiplayer.id:
|
||||
marker = map_marker_templates.friendly_trap.instantiate()
|
||||
else:
|
||||
marker = map_marker_templates.enemy_trap.instantiate()
|
||||
marker.visible = false
|
||||
target.revealed.connect(marker._on_trap_revealed)
|
||||
height += 30
|
||||
elif target is Item:
|
||||
marker = map_marker_templates.item.instantiate()
|
||||
height += 10
|
||||
marker.register_target(target)
|
||||
map_markers[target] = marker
|
||||
map_markers_node.add_child(marker)
|
||||
marker.position += Vector3(0, height,0)
|
||||
|
||||
func add_level_trap(type : Trap.Type, facing : Vector3, crd : Vector3i) -> void:
|
||||
var trap = trap_template.instantiate()
|
||||
trap.setup(type, facing, -1)
|
||||
add_trap(trap, crd)
|
||||
|
||||
15
scripts/map_marker.gd
Normal file
15
scripts/map_marker.gd
Normal file
@@ -0,0 +1,15 @@
|
||||
class_name MapMarker extends Node3D
|
||||
|
||||
var target : Node3D
|
||||
|
||||
func register_target(target : Node3D) -> void:
|
||||
self.target = target
|
||||
|
||||
|
||||
func _process(delta: float) -> void:
|
||||
if target:
|
||||
var loc = target.position
|
||||
position = Vector3(loc.x, position.y, loc.z)
|
||||
|
||||
func _on_trap_revealed(is_visible : bool) -> void:
|
||||
visible = is_visible
|
||||
1
scripts/map_marker.gd.uid
Normal file
1
scripts/map_marker.gd.uid
Normal file
@@ -0,0 +1 @@
|
||||
uid://cnrxwj03j5rw3
|
||||
@@ -9,7 +9,9 @@ enum State {
|
||||
DEAD
|
||||
}
|
||||
|
||||
|
||||
const trap_template = preload("res://templates/trap.tscn")
|
||||
|
||||
const remove_trap_modal = preload("res://templates/remove_trap_modal.tscn")
|
||||
const disarm_trap_modal = preload("res://templates/disarm_trap_modal.tscn")
|
||||
|
||||
@@ -74,6 +76,13 @@ signal combat_target_changed(melee : bool)
|
||||
signal ammo_changed(current : int, max : int)
|
||||
signal struggling(value : float)
|
||||
|
||||
|
||||
func _enter_tree() -> void:
|
||||
Game.level.add_map_marker(self)
|
||||
|
||||
func _exit_tree() -> void:
|
||||
Game.level.remove_map_marker(self)
|
||||
|
||||
func _physics_process(delta: float) -> void:
|
||||
if attack_timer > 0:
|
||||
attack_timer -= delta
|
||||
@@ -359,7 +368,7 @@ func start_detecting() -> void:
|
||||
detecting = true
|
||||
update_detect_region.rpc(false)
|
||||
|
||||
@rpc("authority")
|
||||
@rpc("authority", "call_local")
|
||||
func update_detect_region(update : bool) -> void:
|
||||
var new_square : Vector3i = (global_position - Vector3.ONE * .5).round()
|
||||
if update and new_square == current_square:
|
||||
|
||||
@@ -3,26 +3,32 @@ extends Control
|
||||
@onready var menu_list : Array = [
|
||||
{
|
||||
"option": %STORY,
|
||||
"mode" : Game.Modes.STORY,
|
||||
"scene" : preload("res://scenes/character_select.tscn")
|
||||
},
|
||||
{
|
||||
"option": %"VS-COM",
|
||||
"mode" : Game.Modes.VS_COM,
|
||||
"scene" : preload("res://scenes/character_select.tscn")
|
||||
},
|
||||
{
|
||||
"option": %"VS-MAN",
|
||||
"mode" : Game.Modes.VS_MAN,
|
||||
"scene" : preload("res://scenes/multiplayer_setup.tscn")
|
||||
},
|
||||
{
|
||||
"option": %STORY,
|
||||
"mode" : Game.Modes.STORY,
|
||||
"scene" : preload("res://scenes/character_select.tscn")
|
||||
},
|
||||
{
|
||||
"option": %RECORD,
|
||||
"mode" : Game.Modes.STORY,
|
||||
"scene" : preload("res://scenes/character_select.tscn")
|
||||
},
|
||||
{
|
||||
"option": %OPTION,
|
||||
"mode" : Game.Modes.STORY,
|
||||
"scene" : preload("res://scenes/character_select.tscn")
|
||||
}
|
||||
]
|
||||
@@ -60,7 +66,6 @@ func _process(delta: float) -> void:
|
||||
switch_menu(0)
|
||||
|
||||
if opened:
|
||||
|
||||
var menu_dir = 0
|
||||
menu_dir += 1 if Input.is_action_just_pressed("ui_down") else 0
|
||||
menu_dir -= 1 if Input.is_action_just_pressed("ui_up") else 0
|
||||
@@ -68,6 +73,7 @@ func _process(delta: float) -> void:
|
||||
switch_sound.play()
|
||||
switch_menu(wrapi(menu_choice + menu_dir, 0, len(menu_list)))
|
||||
if Input.is_action_just_pressed("ui_accept"):
|
||||
Game.mode = menu_list[menu_choice].mode
|
||||
Game.switch_scene(menu_list[menu_choice].scene, false)
|
||||
|
||||
|
||||
|
||||
@@ -61,6 +61,13 @@ var just_revealed : bool = false
|
||||
signal removed(type : Trap.Type)
|
||||
signal disarmed(type : Trap.Type)
|
||||
signal activated(type : Trap.Type)
|
||||
signal revealed(is_visible : bool)
|
||||
|
||||
func _enter_tree() -> void:
|
||||
Game.level.add_map_marker(self)
|
||||
|
||||
func _exit_tree() -> void:
|
||||
Game.level.remove_map_marker(self)
|
||||
|
||||
func setup(type : Type, direction : Vector3, trap_owner : int) -> void:
|
||||
self.type = type
|
||||
@@ -84,6 +91,7 @@ func reveal() -> void:
|
||||
model.visible = true
|
||||
reveal_timer.start(5)
|
||||
just_revealed = true
|
||||
revealed.emit(true)
|
||||
|
||||
func is_just_revealed() -> bool:
|
||||
return just_revealed
|
||||
@@ -96,6 +104,7 @@ func _on_reveal_timeout() -> void:
|
||||
reveal_timer.start(5)
|
||||
else:
|
||||
model.visible = false
|
||||
revealed.emit(false)
|
||||
|
||||
func _ready() -> void:
|
||||
var owns_trap = trap_owner == Multiplayer.id
|
||||
|
||||
Reference in New Issue
Block a user