182 lines
3.9 KiB
GDScript
182 lines
3.9 KiB
GDScript
extends Node
|
|
signal room_event
|
|
signal next_day
|
|
signal next_period
|
|
signal level_up
|
|
signal start_training
|
|
|
|
var money: int = 2000
|
|
var master_node
|
|
var current_room
|
|
var team = {}
|
|
var cheer_team = {}
|
|
var room_events = {}
|
|
var line = {}
|
|
var training = false
|
|
var nav: Navigation
|
|
# warning-ignore:unused_class_variable
|
|
var quests : = []
|
|
# warning-ignore:unused_class_variable
|
|
var team_train_count : = 0
|
|
# warning-ignore:unused_class_variable
|
|
var arrow: Spatial
|
|
# warning-ignore:unused_class_variable
|
|
var next_scene: String
|
|
var player_visual = {
|
|
"gender": "male"
|
|
}
|
|
|
|
func room_event(ev: String):
|
|
if current_room:
|
|
if room_events.has(current_room.name):
|
|
if room_events[current_room.name].has(ev):
|
|
var evdata = room_events[current_room.name][ev]
|
|
evdata.obj.call_deferred(evdata.fname, evdata.name)
|
|
func register_room_event(roomobj, evname, fname):
|
|
if !room_events.has(roomobj.name):
|
|
room_events[roomobj.name] = {}
|
|
room_events[roomobj.name][evname] = {"obj": roomobj, "name": evname, "fname": fname}
|
|
|
|
func _ready():
|
|
connect("room_event", self, "room_event")
|
|
|
|
# warning-ignore:unused_class_variable
|
|
var master_stats:Dictionary = {
|
|
"type": 0,
|
|
"gender": 0,
|
|
"name": "John",
|
|
"lastname": "Smith",
|
|
"speed": 0.5,
|
|
"strength": 0.5,
|
|
"agression": 0.5,
|
|
"charisma": 0.5,
|
|
"obedience": 0.0,
|
|
"cost": 0,
|
|
"xp": 0,
|
|
"mext_xp": 100,
|
|
"points": 5,
|
|
"level": 1,
|
|
"look": {}
|
|
}
|
|
|
|
func new_candidate() -> Dictionary:
|
|
var gender = randi() % 2
|
|
var type = 0
|
|
if gender == 0:
|
|
type = 0
|
|
else:
|
|
type = randi() % 2
|
|
var ret = {}
|
|
if gender == 0:
|
|
ret.name = "John"
|
|
ret.lastname = "Doe"
|
|
else:
|
|
ret.name = "Jane"
|
|
ret.lastname = "Doe"
|
|
ret.gender = gender
|
|
ret.type = type
|
|
ret.speed = 0.3 + randf() * 0.7
|
|
ret.strength = 0.1 + randf() * 0.9
|
|
ret.agression = 0.1 + randf() * 0.9
|
|
ret.charisma = 0.1 + randf() * 0.9
|
|
ret.obedience = 0.1 + randf() * 0.9
|
|
if type == 0:
|
|
ret.cost = 2 + int(randf() * 20.0 * (ret.speed + ret.strength + ret.agression) / 3.0)
|
|
else:
|
|
ret.cost = 2 + int(randf() * 20.0 * (ret.speed + ret.strength + ret.charisma) / 3.0)
|
|
ret.xp = 0
|
|
ret.next_xp = 100
|
|
ret.points = 5
|
|
ret.level = 1
|
|
return ret
|
|
|
|
func auto_points(ch):
|
|
while ch.points > 0:
|
|
ch.points -= 1
|
|
var choice = randi() % 5
|
|
match(choice):
|
|
0:
|
|
if ch.type == 0:
|
|
ch.strength += 0.15
|
|
else:
|
|
ch.charisma += 0.15
|
|
1:
|
|
ch.speed += 0.2
|
|
2:
|
|
ch.agression += 0.2
|
|
3:
|
|
ch.obedience += 0.2
|
|
4:
|
|
if ch.type == 1:
|
|
ch.strength += 0.05
|
|
else:
|
|
ch.charisma += 0.05
|
|
|
|
func level_up(ch):
|
|
emit_signal("level_up", ch)
|
|
ch.points += 1 + randi() % 5
|
|
if ch.level < 20:
|
|
ch.next_xp *= 2
|
|
elif ch.level < 60:
|
|
ch.next_xp += (10 + ch.level) * 1000
|
|
else:
|
|
ch.next_xp += (20 + ch.level) * 2000
|
|
ch.level += 1
|
|
print("level up!, new level: ", ch.level, " next xp: ", ch.next_xp)
|
|
auto_points(ch)
|
|
|
|
func increase_xp(ch, num):
|
|
ch.xp += num
|
|
print("added ", num, " xp, xp = ", ch.xp)
|
|
if ch.xp >= ch.next_xp:
|
|
level_up(ch)
|
|
else:
|
|
print("next at ", ch.next_xp)
|
|
|
|
func init_data():
|
|
for ci in range(30):
|
|
var cd : = new_candidate()
|
|
line[ci] = cd
|
|
team = {}
|
|
cheer_team = {}
|
|
print(line)
|
|
|
|
|
|
func dialogue(npc):
|
|
pass
|
|
var day_period = 0
|
|
var day = 1
|
|
func next_day():
|
|
day += 1
|
|
emit_signal("next_day")
|
|
func next_period():
|
|
day_period += 1
|
|
emit_signal("next_period")
|
|
if day_period == 4:
|
|
day_period = 0
|
|
next_day()
|
|
|
|
func action1():
|
|
print("action1")
|
|
var obj = null
|
|
var dstc = 0.0
|
|
for k in get_tree().get_nodes_in_group("act") + get_tree().get_nodes_in_group("npc"):
|
|
if obj == null:
|
|
obj = k
|
|
dstc = master_node.global_position.distance_squared_to(obj.global_position)
|
|
continue
|
|
var dst = master_node.global_position.distance_squared_to(k.global_position)
|
|
if dstc > dst:
|
|
obj = k
|
|
dstc = master_node.global_position.distance_squared_to(obj.global_position)
|
|
continue
|
|
if obj && dstc < 400.0:
|
|
print("action1 obj")
|
|
if obj.is_in_group("npc"):
|
|
dialogue(obj)
|
|
else:
|
|
obj.call_deferred("activate")
|
|
else:
|
|
print("action1 room")
|
|
emit_signal("room_event", "action1")
|