Basic events system started.
This commit is contained in:
@@ -1,21 +1,12 @@
|
||||
class_name BasicNPCEntity extends "res://scripts/Entities/OverworldEntity.gd"
|
||||
const Cutscene = preload("res://scripts/Cutscene/Cutscene.gd");
|
||||
const OverworldConversationEvent = preload("res://scripts/Cutscene/Scene/OverworldConversationEvent.gd");
|
||||
|
||||
enum BasicNPCInteractType {
|
||||
NONE,
|
||||
CUTSCENE,
|
||||
TEXTS
|
||||
};
|
||||
const Event = preload("res://scripts/Events/Event.gd");
|
||||
|
||||
enum BasicNPCMoveType {
|
||||
STILL,
|
||||
RANDOM_LOOK
|
||||
};
|
||||
|
||||
@export var interactType:BasicNPCInteractType = BasicNPCInteractType.NONE;
|
||||
@export var interactCutscene:GDScript;
|
||||
@export var interactTexts:Array[String];
|
||||
@export var interactEvent:Event;
|
||||
|
||||
@export var moveType:BasicNPCMoveType = BasicNPCMoveType.STILL;
|
||||
|
||||
@@ -24,22 +15,10 @@ enum BasicNPCMoveType {
|
||||
var randomLookTimer:float = 0.0;
|
||||
|
||||
func interact(interactor:OverworldEntity) -> void:
|
||||
if interactType == BasicNPCInteractType.NONE:
|
||||
if interactEvent == null:
|
||||
push_error("BasicNPCEntity: interactType EVENT but no event set");
|
||||
return
|
||||
|
||||
if interactType == BasicNPCInteractType.CUTSCENE:
|
||||
# Cutscene in this manner must take two entities
|
||||
# (self, speaker, and interactor, player)
|
||||
var cs:Cutscene = interactCutscene.new(self, interactor);
|
||||
CUTSCENE.setCurrentCutscene(cs);
|
||||
return
|
||||
|
||||
if interactType == BasicNPCInteractType.TEXTS:
|
||||
var cs:Cutscene = OverworldConversationEvent.new(self, interactor, interactTexts);
|
||||
CUTSCENE.setCurrentCutscene(cs);
|
||||
return
|
||||
|
||||
pass
|
||||
interactEvent.onEntityInteract(interactor, self);
|
||||
|
||||
func updateMovement(delta:float) -> void:
|
||||
if moveType == BasicNPCMoveType.STILL:
|
||||
|
@@ -7,7 +7,8 @@ enum Direction {
|
||||
EAST,
|
||||
}
|
||||
|
||||
var speed:float = 150;
|
||||
var speed:float = 200;
|
||||
var runSpeed:float = 400;
|
||||
var friction:float = 8.5;
|
||||
var gravity:float = 30;
|
||||
|
||||
|
@@ -1,6 +1,6 @@
|
||||
extends Camera3D
|
||||
|
||||
const PIXEL_SCALE:float = 4.0;
|
||||
const PIXEL_SCALE:float = 2.0;
|
||||
const WORLD_UNITS:float = 32.0;
|
||||
|
||||
func _ready() -> void:
|
||||
|
@@ -27,9 +27,16 @@ func updateOverworldLogic(delta) -> void:
|
||||
func updateMovement(delta) -> void:
|
||||
# User movement
|
||||
var dir:Vector2 = Input.get_vector("left", "right", "up", "down");
|
||||
|
||||
var moveSpeed:float;
|
||||
if Input.is_action_pressed("run"):
|
||||
moveSpeed = runSpeed;
|
||||
else:
|
||||
moveSpeed = speed;
|
||||
|
||||
if(dir.x != 0 or dir.y != 0):
|
||||
velocity.x = dir.x * speed * delta;
|
||||
velocity.z = dir.y * speed * delta;
|
||||
velocity.x = dir.x * moveSpeed * delta;
|
||||
velocity.z = dir.y * moveSpeed * delta;
|
||||
|
||||
# Update direction
|
||||
if(dir.x >= abs(dir.y) and(
|
||||
@@ -48,4 +55,3 @@ func updateMovement(delta) -> void:
|
||||
direction = Direction.SOUTH;
|
||||
elif (dir.y < 0):
|
||||
direction = Direction.NORTH;
|
||||
pass
|
||||
|
52
scripts/Events/Event.gd
Normal file
52
scripts/Events/Event.gd
Normal file
@@ -0,0 +1,52 @@
|
||||
class_name Event extends Node
|
||||
|
||||
const OverworldEntity = preload("res://scripts/Entities/OverworldEntity.gd");
|
||||
|
||||
|
||||
var started:bool = false;
|
||||
var ended:bool = false;
|
||||
var interactor:OverworldEntity = null
|
||||
var interactee:OverworldEntity = null
|
||||
|
||||
# Godot Methods
|
||||
func _init() -> void:
|
||||
pass
|
||||
|
||||
func _process(delta: float) -> void:
|
||||
if !started || ended:
|
||||
return
|
||||
self.update(delta)
|
||||
|
||||
if self.isDone():
|
||||
self.end()
|
||||
|
||||
# Event methods (cleaned up)
|
||||
func start() -> void:
|
||||
assert(started == false)
|
||||
started = true
|
||||
|
||||
func update(delta:float) -> void:
|
||||
assert(started == true)
|
||||
assert(ended == false)
|
||||
|
||||
func isDone() -> bool:
|
||||
return true
|
||||
|
||||
func end() -> void:
|
||||
assert(ended == false)
|
||||
ended = true
|
||||
|
||||
func reset() -> void:
|
||||
started = false
|
||||
ended = false
|
||||
interactor = null
|
||||
interactee = null
|
||||
|
||||
func onEntityInteract(
|
||||
interactor:OverworldEntity,
|
||||
interactee:OverworldEntity
|
||||
) -> void:
|
||||
self.reset()
|
||||
self.interactor = interactor
|
||||
self.interactee = interactee
|
||||
self.start()
|
1
scripts/Events/Event.gd.uid
Normal file
1
scripts/Events/Event.gd.uid
Normal file
@@ -0,0 +1 @@
|
||||
uid://cl3vqv8bwyoeu
|
1
scripts/Events/EventConversation.gd.uid
Normal file
1
scripts/Events/EventConversation.gd.uid
Normal file
@@ -0,0 +1 @@
|
||||
uid://tkfc88q8m86f
|
76
scripts/Events/EventGroup.gd
Normal file
76
scripts/Events/EventGroup.gd
Normal file
@@ -0,0 +1,76 @@
|
||||
class_name EventGroup extends "res://scripts/Events/EventWithChildren.gd"
|
||||
|
||||
enum ProcessType {
|
||||
SEQUENTIAL,
|
||||
PARALLEL,
|
||||
}
|
||||
|
||||
@export var processType:ProcessType = ProcessType.SEQUENTIAL;
|
||||
|
||||
var childIndex:int = 0
|
||||
|
||||
func start() -> void:
|
||||
super.start()
|
||||
|
||||
# If sequential, start first child
|
||||
if processType == ProcessType.SEQUENTIAL:
|
||||
childIndex = -1
|
||||
nextChild()
|
||||
|
||||
# If parallel, start all children
|
||||
elif processType == ProcessType.PARALLEL:
|
||||
for child in childEvents:
|
||||
startChild(child)
|
||||
|
||||
|
||||
func update(delta:float) -> void:
|
||||
super.update(delta)
|
||||
|
||||
# If sequential, see if the current child is done, if so go to next child
|
||||
if processType == ProcessType.SEQUENTIAL:
|
||||
if childIndex < 0 || childIndex >= childEvents.size():
|
||||
return
|
||||
if childEvents[childIndex].isDone():
|
||||
nextChild()
|
||||
|
||||
func nextChild() -> void:
|
||||
childIndex += 1
|
||||
if childIndex >= childEvents.size():
|
||||
return
|
||||
startChild(childEvents[childIndex])
|
||||
|
||||
func isDone() -> bool:
|
||||
if !super.isDone():
|
||||
return false
|
||||
|
||||
# If sequential, check if we've reached the end of the children
|
||||
if processType == ProcessType.SEQUENTIAL:
|
||||
return childIndex >= childEvents.size()
|
||||
|
||||
# If parallel, check if all children are done
|
||||
elif processType == ProcessType.PARALLEL:
|
||||
for child in childEvents:
|
||||
if !child.isDone():
|
||||
return false
|
||||
return true
|
||||
|
||||
return false
|
||||
|
||||
func end() -> void:
|
||||
super.end()
|
||||
for child in childEvents:
|
||||
if child.ended || !child.started:
|
||||
continue
|
||||
child.end()
|
||||
|
||||
func reset() -> void:
|
||||
super.reset()
|
||||
childIndex = -1
|
||||
for child in childEvents:
|
||||
child.reset()
|
||||
|
||||
func startChild(child:Event) -> void:
|
||||
# Inherits some properties from this event.
|
||||
child.interactee = self.interactee
|
||||
child.interactor = self.interactor
|
||||
child.start()
|
1
scripts/Events/EventGroup.gd.uid
Normal file
1
scripts/Events/EventGroup.gd.uid
Normal file
@@ -0,0 +1 @@
|
||||
uid://sqi2ehu4sqa1
|
16
scripts/Events/EventPause.gd
Normal file
16
scripts/Events/EventPause.gd
Normal file
@@ -0,0 +1,16 @@
|
||||
class_name EventPause extends "res://scripts/Events/Event.gd"
|
||||
|
||||
const PauseSystem = preload("res://scripts/Singletons/Pause.gd")
|
||||
|
||||
@export var pauseType:PauseSystem.PauseType = PauseSystem.PauseType.ENTITY_PAUSED
|
||||
@export var entities:Array[OverworldEntity] = []
|
||||
@export var includeInteractee:bool = true
|
||||
@export var includeInteractor:bool = true
|
||||
|
||||
func start() -> void:
|
||||
var ents:Array[OverworldEntity] = entities
|
||||
if interactor != null and includeInteractor:
|
||||
ents.append(interactor)
|
||||
if interactee != null and includeInteractee:
|
||||
ents.append(interactee)
|
||||
PAUSE.pause(pauseType, ents)
|
1
scripts/Events/EventPause.gd.uid
Normal file
1
scripts/Events/EventPause.gd.uid
Normal file
@@ -0,0 +1 @@
|
||||
uid://bv36suxm08vqe
|
11
scripts/Events/EventTextbox.gd
Normal file
11
scripts/Events/EventTextbox.gd
Normal file
@@ -0,0 +1,11 @@
|
||||
class_name EventTextbox extends "res://scripts/Events/Event.gd"
|
||||
|
||||
# @export var text:Array[String] = [ "Hello Text" ];
|
||||
@export var text:String = "Hello Text"
|
||||
|
||||
func start() -> void:
|
||||
super.start()
|
||||
VN.getTextbox().setText(self.text);
|
||||
|
||||
func isDone() -> bool:
|
||||
return super.isDone() && VN.getTextbox().isClosed;
|
1
scripts/Events/EventTextbox.gd.uid
Normal file
1
scripts/Events/EventTextbox.gd.uid
Normal file
@@ -0,0 +1 @@
|
||||
uid://y7ckj1tn5cro
|
22
scripts/Events/EventWithChildren.gd
Normal file
22
scripts/Events/EventWithChildren.gd
Normal file
@@ -0,0 +1,22 @@
|
||||
class_name EventWithChildren extends "res://scripts/Events/Event.gd"
|
||||
|
||||
var childEvents:Array[Event] = []
|
||||
|
||||
func _init() -> void:
|
||||
super._init()
|
||||
_updateChildEvents()
|
||||
_updateChildEvents()
|
||||
self.child_entered_tree.connect(onChildEntered)
|
||||
self.child_exiting_tree.connect(onChildExited)
|
||||
|
||||
func _updateChildEvents() -> void:
|
||||
childEvents = []
|
||||
for child in get_children():
|
||||
if child is Event:
|
||||
childEvents.append(child)
|
||||
|
||||
func onChildEntered(child:Node) -> void:
|
||||
_updateChildEvents()
|
||||
|
||||
func onChildExited(child:Node) -> void:
|
||||
_updateChildEvents()
|
1
scripts/Events/EventWithChildren.gd.uid
Normal file
1
scripts/Events/EventWithChildren.gd.uid
Normal file
@@ -0,0 +1 @@
|
||||
uid://dj5wl682sbohc
|
Reference in New Issue
Block a user