Skip to content

Commit

Permalink
respawn added for falling down as undead of when in death realm; addi…
Browse files Browse the repository at this point in the history
…tions to planner knowledge (shield, stamina), not added logic to actions yet; grant spells on skill allocation
  • Loading branch information
taminob committed Oct 15, 2021
1 parent 5fd4a36 commit 8f4d1d8
Show file tree
Hide file tree
Showing 26 changed files with 216 additions and 51 deletions.
3 changes: 2 additions & 1 deletion characters/persons/vladimir.gd
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,8 @@ func _init():
"endurance": 1
},
"inventory": {
"spells": ["fire_ring", "blood_sacrifice", "heal", "blood_storm"],
"spells": ["blood_sacrifice", "blood_storm"],
"skills": ["base_fire", "base_life", "base_ice", "base_darkness"]
#"spell_slots": ["fire_ring", "heal", "", "", ""]
},
"look": {
Expand Down
6 changes: 3 additions & 3 deletions characters/player/death_environment.tres
Original file line number Diff line number Diff line change
Expand Up @@ -5,9 +5,9 @@
[resource]
background_mode = 1
background_sky = SubResource( 1 )
background_sky_orientation = Basis( -1, -1.50996e-07, 0, 1.50996e-07, -1, 0, 0, 0, 1 )
background_sky_rotation = Vector3( 0, 0, 3.14159 )
background_sky_rotation_degrees = Vector3( 0, 0, 180 )
background_sky_orientation = Basis( -1, 8.74228e-08, 0, -8.74228e-08, -1, 0, 0, 0, 1 )
background_sky_rotation = Vector3( 0, 0, -3.14159 )
background_sky_rotation_degrees = Vector3( 0, 0, -180 )
background_color = Color( 0.835294, 0.835294, 0.835294, 1 )
background_energy = 0.5
ambient_light_color = Color( 0.364706, 0.364706, 0.364706, 1 )
Expand Down
2 changes: 1 addition & 1 deletion characters/state/ai/actions/roam_action.gd
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,7 @@ func choose_target():
var nav: Navigation = game.levels.current_level.get_node("navigation")
if(nav):
var destination: Vector3 = Vector3(rand_range(-1, 1), 0, rand_range(-1, 1))
target.global_transform.origin = nav.get_closest_point(pawn.global_transform.origin + 50 * destination)
target.global_transform.origin = nav.get_closest_point(pawn.global_transform.origin + 10 * destination)

func do() -> bool:
return true
2 changes: 1 addition & 1 deletion characters/state/ai/actions/rotate_action.gd
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ static func precondition() -> planner.knowledge:
return planner.knowledge.new()

static func postcondition() -> planner.knowledge:
return planner.knowledge.new(0, 0, planner.knowledge_mask.facing_target)
return planner.knowledge.new(0, 0, 0, 0, planner.knowledge_mask.facing_target)

static func precondition_mask() -> int:
return planner.knowledge_mask.facing_target
Expand Down
4 changes: 2 additions & 2 deletions characters/state/ai/actions/spell_blood_storm_action.gd
Original file line number Diff line number Diff line change
Expand Up @@ -5,11 +5,11 @@ static func spell_id() -> String:

static func precondition() -> planner.knowledge:
var spell = skill_data.spells[spell_id()]
return planner.knowledge.new(spell.self_pain() + spell.self_pain_per_second(), -spell.self_focus() - spell.self_focus_per_second(), planner.knowledge_mask.enemy_in_near)
return planner.knowledge.new(spell.self_pain() + spell.self_pain_per_second(), -spell.self_focus() - spell.self_focus_per_second(), 0, 0, planner.knowledge_mask.enemy_in_near)

static func postcondition() -> planner.knowledge:
var spell = skill_data.spells[spell_id()]
return planner.knowledge.new(spell.self_pain(), spell.self_focus(), planner.knowledge_mask.enemy_damaged)
return planner.knowledge.new(spell.self_pain(), spell.self_focus(), 0, 0, planner.knowledge_mask.enemy_damaged)

static func precondition_mask() -> int:
return planner.knowledge_mask.focus | planner.knowledge_mask.focus_toggle | planner.knowledge_mask.pain | planner.knowledge_mask.enemy_in_near
Expand Down
36 changes: 36 additions & 0 deletions characters/state/ai/actions/spell_element_shield_action.gd
Original file line number Diff line number Diff line change
@@ -0,0 +1,36 @@
extends abstract_action

static func spell_id() -> String:
return element_shield_spell.id()

static func precondition() -> planner.knowledge:
var spell = skill_data.spells[spell_id()]
return planner.knowledge.new(spell.self_pain() + spell.self_pain_per_second() * spell.duration(), -(spell.self_focus() + spell.self_focus_per_second() * spell.duration()), 0, 0, planner.knowledge_mask.enemy_in_near)

static func postcondition() -> planner.knowledge:
var spell = skill_data.spells[spell_id()]
return planner.knowledge.new(spell.self_pain() + spell.self_pain_per_second() * spell.duration(), spell.self_focus() + spell.self_focus_per_second() * spell.duration())

static func precondition_mask() -> int:
return planner.knowledge_mask.focus | planner.knowledge_mask.focus_toggle | planner.knowledge_mask.pain | planner.knowledge_mask.enemy_in_near

static func postcondition_mask() -> int:
return planner.knowledge_mask.focus | planner.knowledge_mask.pain | planner.knowledge_mask.enemy_damaged

func choose_target():
target = pawn.ai.brain.get_any_enemy()

func get_range_state() -> int:
if(!game.is_valid(target)):
return range_state.unreachable
var spell_range = skill_data.spells[spell_id()].range()
if(spell_range < 0):
return range_state.no_range_required
if(pawn.global_transform.origin.distance_squared_to(target.global_transform.origin) <= spell_range * spell_range):
return range_state.in_range
return range_state.out_of_range

func do() -> bool:
pawn.face_target(target)
pawn.skills.cast_spell(spell_id())
return true
4 changes: 2 additions & 2 deletions characters/state/ai/actions/spell_fire_ball_action.gd
Original file line number Diff line number Diff line change
Expand Up @@ -5,11 +5,11 @@ static func spell_id() -> String:

static func precondition() -> planner.knowledge:
var spell = skill_data.spells[spell_id()]
return planner.knowledge.new(spell.self_pain(), -spell.self_focus(), planner.knowledge_mask.enemy_in_sight)
return planner.knowledge.new(spell.self_pain() + spell.self_pain_per_second() * spell.duration(), -(spell.self_focus() + spell.self_focus_per_second() * spell.duration()), 0, 0, planner.knowledge_mask.enemy_in_sight)

static func postcondition() -> planner.knowledge:
var spell = skill_data.spells[spell_id()]
return planner.knowledge.new(spell.self_pain(), spell.self_focus(), planner.knowledge_mask.enemy_damaged)
return planner.knowledge.new(spell.self_pain() + spell.self_pain_per_second() * spell.duration(), spell.self_focus() + spell.self_focus_per_second() * spell.duration(), 0, 0, planner.knowledge_mask.enemy_damaged)

static func precondition_mask() -> int:
return planner.knowledge_mask.focus | planner.knowledge_mask.focus_toggle | planner.knowledge_mask.pain | planner.knowledge_mask.enemy_in_sight
Expand Down
4 changes: 2 additions & 2 deletions characters/state/ai/actions/spell_fire_ring_action.gd
Original file line number Diff line number Diff line change
Expand Up @@ -5,11 +5,11 @@ static func spell_id() -> String:

static func precondition() -> planner.knowledge:
var spell = skill_data.spells[spell_id()]
return planner.knowledge.new(spell.self_pain(), -spell.self_focus(), planner.knowledge_mask.enemy_in_sight)
return planner.knowledge.new(spell.self_pain() + spell.self_pain_per_second() * spell.duration(), -(spell.self_focus() + spell.self_focus_per_second() * spell.duration()), 0, 0, planner.knowledge_mask.enemy_in_sight)

static func postcondition() -> planner.knowledge:
var spell = skill_data.spells[spell_id()]
return planner.knowledge.new(spell.self_pain(), spell.self_focus(), planner.knowledge_mask.enemy_damaged)
return planner.knowledge.new(spell.self_pain() + spell.self_pain_per_second() * spell.duration(), spell.self_focus() + spell.self_focus_per_second() * spell.duration(), 0, 0, planner.knowledge_mask.enemy_damaged)

static func precondition_mask() -> int:
return planner.knowledge_mask.focus | planner.knowledge_mask.focus_toggle | planner.knowledge_mask.pain | planner.knowledge_mask.pain_toggle | planner.knowledge_mask.enemy_in_sight
Expand Down
9 changes: 1 addition & 8 deletions characters/state/ai/actions/spell_heal_action.gd
Original file line number Diff line number Diff line change
Expand Up @@ -18,14 +18,7 @@ static func postcondition_mask() -> int:
return planner.knowledge_mask.focus | planner.knowledge_mask.pain

func get_range_state() -> int:
if(!game.is_valid(target)):
return range_state.unreachable
var spell_range = skill_data.spells[spell_id()].range()
if(spell_range < 0):
return range_state.no_range_required
if(pawn.global_transform.origin.distance_squared_to(target.global_transform.origin) <= spell_range * spell_range):
return range_state.in_range
return range_state.out_of_range
return range_state.no_range_required

func do() -> bool:
pawn.skills.cast_spell(spell_id())
Expand Down
36 changes: 36 additions & 0 deletions characters/state/ai/actions/spell_summon_minion_action.gd
Original file line number Diff line number Diff line change
@@ -0,0 +1,36 @@
extends abstract_action

static func spell_id() -> String:
return summon_minion_spell.id()

static func precondition() -> planner.knowledge:
var spell = skill_data.spells[spell_id()]
return planner.knowledge.new(spell.self_pain() + spell.self_pain_per_second() * spell.duration(), -(spell.self_focus() + spell.self_focus_per_second() * spell.duration()), 0, 0, planner.knowledge_mask.enemy_in_near)

static func postcondition() -> planner.knowledge:
var spell = skill_data.spells[spell_id()]
return planner.knowledge.new(spell.self_pain() + spell.self_pain_per_second() * spell.duration(), spell.self_focus() + spell.self_focus_per_second() * spell.duration(), 0, 0, planner.knowledge_mask.enemy_damaged)

static func precondition_mask() -> int:
return planner.knowledge_mask.focus | planner.knowledge_mask.focus_toggle | planner.knowledge_mask.pain | planner.knowledge_mask.enemy_in_near

static func postcondition_mask() -> int:
return planner.knowledge_mask.focus | planner.knowledge_mask.pain | planner.knowledge_mask.enemy_damaged

func choose_target():
target = pawn.ai.brain.get_any_enemy()

func get_range_state() -> int:
if(!game.is_valid(target)):
return range_state.unreachable
var spell_range = skill_data.spells[spell_id()].range()
if(spell_range < 0):
return range_state.no_range_required
if(pawn.global_transform.origin.distance_squared_to(target.global_transform.origin) <= spell_range * spell_range):
return range_state.in_range
return range_state.out_of_range

func do() -> bool:
pawn.face_target(target)
pawn.skills.cast_spell(spell_id())
return true
4 changes: 2 additions & 2 deletions characters/state/ai/actions/talk_begin_action.gd
Original file line number Diff line number Diff line change
@@ -1,10 +1,10 @@
extends abstract_action

static func precondition() -> planner.knowledge:
return planner.knowledge.new(0, 0, planner.knowledge_mask.ally_in_sight)
return planner.knowledge.new(0, 0, 0, 0, planner.knowledge_mask.ally_in_sight)

static func postcondition() -> planner.knowledge:
return planner.knowledge.new(0, 0, planner.knowledge_mask.talking)
return planner.knowledge.new(0, 0, 0, 0, planner.knowledge_mask.talking)

static func precondition_mask() -> int:
return planner.knowledge_mask.ally_in_sight | planner.knowledge_mask.talking
Expand Down
4 changes: 2 additions & 2 deletions characters/state/ai/actions/wait_action.gd
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@ static func postcondition() -> planner.knowledge:
return planner.knowledge.new()

func get_range_state() -> int:
return range_state.no_range_required
return range_state.out_of_range

func do() -> bool:
return false
return true
37 changes: 31 additions & 6 deletions characters/state/ai/planner.gd
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,8 @@ class_name planner
class knowledge:
var pain: float
var focus: float
var stamina: float
var shield: float
var enemy_in_sight: bool
var enemy_in_near: bool
var enemy_damaged: bool
Expand All @@ -14,9 +16,11 @@ class knowledge:
var talking: bool
var facing_target: bool

func _init(new_pain: float=0.0, new_focus: float=0.0, bool_mask: int=0):
func _init(new_pain: float=0.0, new_focus: float=0.0, new_stamina: float=0.0, new_shield: float=0.0, bool_mask: int=0):
pain = new_pain
focus = new_focus
stamina = new_stamina
shield = new_shield
enemy_in_sight = bool_mask & knowledge_mask.enemy_in_sight
enemy_in_near = bool_mask & knowledge_mask.enemy_in_near
enemy_damaged = bool_mask & knowledge_mask.enemy_damaged
Expand All @@ -30,6 +34,8 @@ class knowledge:
var know: knowledge = knowledge.new()
know.pain = pain
know.focus = focus
know.stamina = stamina
know.shield = shield
know.enemy_in_sight = enemy_in_sight
know.enemy_in_near = enemy_in_near
know.enemy_damaged = enemy_damaged
Expand All @@ -53,10 +59,14 @@ enum knowledge_mask {
#_b = 0x20000000,
#_c = 0x40000000,
#_d = 0x80000000,
pain = 0x01000000,
pain_toggle = 0x02000000, # if set in precondition, pain has to be lower; if set in postcondition, pain is absolute
focus = 0x04000000,
focus_toggle = 0x08000000,
pain = 0x00100000,
pain_toggle = 0x00200000, # if set in precondition, pain has to be lower; if set in postcondition, pain is absolute
focus = 0x00400000,
focus_toggle = 0x00800000,
stamina = 0x01000000,
stamina_toggle = 0x02000000,
shield = 0x04000000,
shield_toggle = 0x08000000,

lock = 0x80000000,
ALL = 0x7FFFFFFF
Expand All @@ -76,10 +86,11 @@ enum actions {
rotate,
flee,
spell_heal,
spell_element_shield,
spell_fire_ring,
spell_fire_ball,
spell_blood_storm,
# wait,
wait,
}

var planning_graph: Array # contains all a_star_node instances; index of node equals position in array
Expand Down Expand Up @@ -141,6 +152,20 @@ class a_star_node:
else:
if(before.focus < know.focus):
return false
if(before_mask & knowledge_mask.stamina):
if(before_mask & knowledge_mask.stamina_toggle):
if(before.stamina > know.stamina):
return false
else:
if(before.stamina < know.stamina):
return false
if(before_mask & knowledge_mask.shield):
if(before_mask & knowledge_mask.shield_toggle):
if(before.shield > know.shield):
return false
else:
if(before.shield < know.shield):
return false
if(before_mask & knowledge_mask.enemy_in_sight):
if(before.enemy_in_sight != know.enemy_in_sight):
return false
Expand Down
10 changes: 4 additions & 6 deletions characters/state/ai_state.gd
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,7 @@ func _ready():
_steps_since_consider = 0

func _process(_delta: float):
if(state.is_player || (stats.dead && !stats.undead)):
if(state.is_player || (stats.dead && !stats.undead && !game.levels.current_level_death_realm)):
return
machine.process_state()
if(_steps_since_consider == 0):
Expand All @@ -40,7 +40,7 @@ func _process(_delta: float):
should_reconsider = false

func get_current_knowledge() -> planner.knowledge:
var know = planner.knowledge.new(stats.pain, stats.focus)
var know = planner.knowledge.new(stats.pain, stats.focus, stats.stamina, stats.shield)
know.enemy_in_sight = !brain.enemies_in_sight.empty()
know.enemy_in_near = !brain.enemies_in_sight.empty() || !brain.enemies_out_of_sight.empty()
know.ally_in_sight = !brain.allies_in_sight.empty()
Expand Down Expand Up @@ -69,15 +69,13 @@ func get_idle_action() -> abstract_action:
var idle_action: abstract_action
match dialogue.job:
"thief":
#idle_action = load("res://characters/state/ai/actions/wait_action.gd").new()
idle_action = load("res://characters/state/ai/actions/roam_action.gd").new()
idle_action = load("res://characters/state/ai/actions/wait_action.gd").new()
"guard":
idle_action = load("res://characters/state/ai/actions/roam_action.gd").new()
"mage":
idle_action = load("res://characters/state/ai/actions/wait_action.gd").new()
_:
idle_action = load("res://characters/state/ai/actions/roam_action.gd").new()
#idle_action = load("res://characters/state/ai/actions/wait_action.gd").new()
idle_action = load("res://characters/state/ai/actions/wait_action.gd").new()
idle_action.init(pawn)
return idle_action

Expand Down
4 changes: 3 additions & 1 deletion characters/state/inventory_state.gd
Original file line number Diff line number Diff line change
Expand Up @@ -74,7 +74,7 @@ func save(state_dict: Dictionary):

var DEFAULT_SPELL_SLOTS: Dictionary = {
abstract_spell.element_type.raw: ["", "", "", "", ""],
abstract_spell.element_type.life: ["element_shield", "", "summon_minion", "", "invert_gravity"],
abstract_spell.element_type.life: ["element_shield", "heal", "summon_minion", "", "invert_gravity"],
abstract_spell.element_type.fire: ["element_shield", "", "fire_ball", "fire_storm", "fire_ring"],
abstract_spell.element_type.ice: ["element_shield", "", "ice_ball", "ice_wave", ""],
abstract_spell.element_type.darkness: ["element_shield", "", "", "", ""],
Expand All @@ -83,6 +83,8 @@ func init(state_dict: Dictionary):
var _inventory_state = state_dict.get("inventory", {})
spells = _inventory_state.get("spells", [""])
skills = _inventory_state.get("skills", [""]) # todo? enable do_nothing skill?
for x in skills:
skill_data.skills[x].on_allocated(pawn)
skill_points = _inventory_state.get("skill_points", 5) # TODO? balance start skill points?
things = _inventory_state.get("things", [])
spell_slots = _inventory_state.get("spell_slots", DEFAULT_SPELL_SLOTS)
Expand Down
2 changes: 1 addition & 1 deletion characters/state/skills_state.gd
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,7 @@ class active_spell:
spell.start_effect(pawn)

func can_tick(pawn: KinematicBody, delta: float) -> bool:
return duration > 0 && pawn.stats.focus + spell.self_focus_per_second() * delta >= 0
return duration > 0 && (pawn.stats.focus + spell.self_focus_per_second() * delta >= 0 || game.levels.current_level_death_realm)

func tick(pawn: KinematicBody, delta: float) -> bool:
duration -= delta
Expand Down
9 changes: 9 additions & 0 deletions project.godot
Original file line number Diff line number Diff line change
Expand Up @@ -374,6 +374,11 @@ _global_script_classes=[ {
"language": "GDScript",
"path": "res://characters/state/stats_state.gd"
}, {
"base": "abstract_skill",
"class": "summon_minion_skill",
"language": "GDScript",
"path": "res://skills/skills/life/summon_minion.gd"
}, {
"base": "abstract_spell",
"class": "summon_minion_spell",
"language": "GDScript",
Expand Down Expand Up @@ -488,6 +493,7 @@ _global_script_class_icons={
"sqlay_person": "",
"sqlykt_person": "",
"stats_state": "",
"summon_minion_skill": "",
"summon_minion_spell": "",
"task": "",
"toggle_spirit_task": "",
Expand Down Expand Up @@ -1711,16 +1717,19 @@ skill1={
skill2={
"deadzone": 0.5,
"events": [ Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":0,"alt":false,"shift":false,"control":false,"meta":false,"command":false,"pressed":false,"scancode":82,"unicode":0,"echo":false,"script":null)
, Object(InputEventMouseButton,"resource_local_to_scene":false,"resource_name":"","device":-1,"alt":false,"shift":false,"control":false,"meta":false,"command":false,"button_mask":0,"position":Vector2( 0, 0 ),"global_position":Vector2( 0, 0 ),"factor":1.0,"button_index":1,"pressed":false,"doubleclick":false,"script":null)
]
}
skill3={
"deadzone": 0.5,
"events": [ Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":0,"alt":false,"shift":false,"control":false,"meta":false,"command":false,"pressed":false,"scancode":84,"unicode":0,"echo":false,"script":null)
, Object(InputEventMouseButton,"resource_local_to_scene":false,"resource_name":"","device":-1,"alt":false,"shift":false,"control":false,"meta":false,"command":false,"button_mask":0,"position":Vector2( 0, 0 ),"global_position":Vector2( 0, 0 ),"factor":1.0,"button_index":2,"pressed":false,"doubleclick":false,"script":null)
]
}
skill4={
"deadzone": 0.5,
"events": [ Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":0,"alt":false,"shift":false,"control":false,"meta":false,"command":false,"pressed":false,"scancode":89,"unicode":0,"echo":false,"script":null)
, Object(InputEventMouseButton,"resource_local_to_scene":false,"resource_name":"","device":-1,"alt":false,"shift":false,"control":false,"meta":false,"command":false,"button_mask":0,"position":Vector2( 0, 0 ),"global_position":Vector2( 0, 0 ),"factor":1.0,"button_index":3,"pressed":false,"doubleclick":false,"script":null)
]
}
slot0={
Expand Down
1 change: 1 addition & 0 deletions skills/scenes/blood/blood_storm.gd
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@ func _ready():
errors.error_test(connect("body_exited", self, "_object_exit"))

func _physics_process(delta: float):
global_transform.origin = caster.global_transform.origin
for x in _affected_bodies:
x.damage(spell.target_pain_per_second() * delta, spell.target_element())
x.damage(spell.target_focus_per_second() * delta, abstract_spell.element_type.focus)
Expand Down
Loading

0 comments on commit 8f4d1d8

Please sign in to comment.