init
This commit is contained in:
@@ -0,0 +1,13 @@
|
|||||||
|
{
|
||||||
|
"id": "gdscript_test",
|
||||||
|
"name": "GDScript Integration Test Mod",
|
||||||
|
"version": "1.0.0",
|
||||||
|
"author": "ct",
|
||||||
|
"description": "Integration tests for GDScript mod actions. Exercises the full pipeline: .gd load -> compile -> action registration -> scenario execution.",
|
||||||
|
"gd_sources": [
|
||||||
|
"scripts/*.gd"
|
||||||
|
],
|
||||||
|
"depends": [
|
||||||
|
"core>=1"
|
||||||
|
]
|
||||||
|
}
|
||||||
@@ -0,0 +1,8 @@
|
|||||||
|
scene: home_kitchen
|
||||||
|
priority: 8
|
||||||
|
condition: true
|
||||||
|
is_one_run: true
|
||||||
|
---
|
||||||
|
action gds.greet name=Always
|
||||||
|
text "Fallback scene always runs."
|
||||||
|
end
|
||||||
@@ -0,0 +1,9 @@
|
|||||||
|
scene: home_kitchen
|
||||||
|
priority: 7
|
||||||
|
condition: gds.flag_equals("victory")
|
||||||
|
is_one_run: true
|
||||||
|
---
|
||||||
|
set custom_flag=victory
|
||||||
|
action gds.inventory_demo item_id=health_potion
|
||||||
|
text "GDScript condition with args and inventory action executed."
|
||||||
|
end
|
||||||
@@ -0,0 +1,9 @@
|
|||||||
|
scene: home_kitchen
|
||||||
|
priority: 6
|
||||||
|
condition: gds.is_rain
|
||||||
|
is_one_run: true
|
||||||
|
---
|
||||||
|
set weather=rain
|
||||||
|
action gds.greet name=RainVisitor
|
||||||
|
text "It's raining! GDScript condition gds.is_rain passed."
|
||||||
|
end
|
||||||
@@ -0,0 +1,10 @@
|
|||||||
|
scene: home_kitchen
|
||||||
|
priority: 5
|
||||||
|
condition: true
|
||||||
|
is_one_run: true
|
||||||
|
---
|
||||||
|
set my_name=Marao
|
||||||
|
action gds.greet name=my_name
|
||||||
|
action gds.quest_log quest_id=test_quest message=Scenario started from GDScript
|
||||||
|
text "GDScript test actions executed. Check logs."
|
||||||
|
end
|
||||||
@@ -0,0 +1,21 @@
|
|||||||
|
extends RefCounted
|
||||||
|
|
||||||
|
# Custom battle action executor: deals triple damage based on user's Attack
|
||||||
|
# ActionId must match the battle action ID in the character's JSON data
|
||||||
|
# The execute method returns a GDBattleResult with SourceDamage/TargetDamage etc.
|
||||||
|
|
||||||
|
func get_action_id():
|
||||||
|
return "gds.triple_attack"
|
||||||
|
|
||||||
|
func execute(action, user, target):
|
||||||
|
var result = GDBattleResult.new()
|
||||||
|
|
||||||
|
var damage = user.AttackValue * 3 - target.DefenceValue
|
||||||
|
if damage < 1:
|
||||||
|
damage = 1
|
||||||
|
|
||||||
|
result.TargetDamage = damage
|
||||||
|
result.TargetDefence = target.DefenceValue
|
||||||
|
result.Result = true
|
||||||
|
|
||||||
|
return result
|
||||||
@@ -0,0 +1,14 @@
|
|||||||
|
extends RefCounted
|
||||||
|
|
||||||
|
func get_name():
|
||||||
|
return "gds.char_welcome"
|
||||||
|
|
||||||
|
func run(ctx):
|
||||||
|
var char_type = ctx.GetParam("char_type")
|
||||||
|
if char_type == "":
|
||||||
|
ctx.LogWarning("GDS", "gds.char_welcome: missing char_type")
|
||||||
|
return
|
||||||
|
|
||||||
|
ctx.Character.AddToParty(char_type)
|
||||||
|
ctx.Character.SendNotification(char_type)
|
||||||
|
ctx.Log("GDS", "Character '" + char_type + "' added to party via GDScript")
|
||||||
@@ -0,0 +1,13 @@
|
|||||||
|
extends RefCounted
|
||||||
|
|
||||||
|
# Custom condition with arguments: checks if a flag equals the passed value
|
||||||
|
# Usage in scenario: condition: gds.flag_equals("expected_value")
|
||||||
|
|
||||||
|
func get_condition_name():
|
||||||
|
return "gds.flag_equals"
|
||||||
|
|
||||||
|
func evaluate(flags, args):
|
||||||
|
var expected = args.get("0", "")
|
||||||
|
if expected == "":
|
||||||
|
return false
|
||||||
|
return flags.get("custom_flag", "") == expected
|
||||||
@@ -0,0 +1,11 @@
|
|||||||
|
extends RefCounted
|
||||||
|
|
||||||
|
# Custom condition: checks if the "weather" flag equals "rain"
|
||||||
|
# Usage in scenario: condition: gds.is_rain
|
||||||
|
# Or: condition: gds.is_rain && Quest.hasTag("active")
|
||||||
|
|
||||||
|
func get_condition_name():
|
||||||
|
return "gds.is_rain"
|
||||||
|
|
||||||
|
func evaluate(flags, args):
|
||||||
|
return flags.get("weather", "") == "rain"
|
||||||
@@ -0,0 +1,10 @@
|
|||||||
|
extends RefCounted
|
||||||
|
|
||||||
|
func get_name():
|
||||||
|
return "gds.greet"
|
||||||
|
|
||||||
|
func run(ctx):
|
||||||
|
var name = ctx.GetParam("name")
|
||||||
|
if name == "":
|
||||||
|
name = "Stranger"
|
||||||
|
ctx.Log("EVENT", "GDScript greet action: Hello, " + name + "!")
|
||||||
@@ -0,0 +1,21 @@
|
|||||||
|
extends RefCounted
|
||||||
|
|
||||||
|
# Demonstrates inventory queries and mod presence checks from a scenario action
|
||||||
|
# Usage in scenario DSL: action gds.inventory_demo
|
||||||
|
|
||||||
|
func get_name():
|
||||||
|
return "gds.inventory_demo"
|
||||||
|
|
||||||
|
func run(ctx):
|
||||||
|
var itemId = ctx.GetParam("item_id")
|
||||||
|
|
||||||
|
if ctx.Inventory.HasItem(itemId):
|
||||||
|
var count = ctx.Inventory.CheckCount(itemId)
|
||||||
|
ctx.Log("EVENT", "Inventory has " + itemId + " x" + str(count))
|
||||||
|
else:
|
||||||
|
ctx.Log("EVENT", "Inventory does NOT have " + itemId)
|
||||||
|
|
||||||
|
if ctx.ModRegistry.IsLoaded("core"):
|
||||||
|
ctx.Log("EVENT", "Core mod is loaded")
|
||||||
|
else:
|
||||||
|
ctx.LogWarning("EVENT", "Core mod is NOT loaded")
|
||||||
@@ -0,0 +1,16 @@
|
|||||||
|
extends RefCounted
|
||||||
|
|
||||||
|
# Custom item action: heals the character by a fixed amount when the item is used
|
||||||
|
# ID must match the ItemAction field in the item's JSON data
|
||||||
|
# The use(item) method receives a GDItem (with fields Id, Name, Description, Cost, ItemType)
|
||||||
|
# Returns true on success
|
||||||
|
|
||||||
|
func get_item_action_id():
|
||||||
|
return "gds.heal_item"
|
||||||
|
|
||||||
|
func use(item):
|
||||||
|
print("[GDS_ITEM] Using item: " + item.Name + " (id=" + item.Id + ")")
|
||||||
|
|
||||||
|
# In a real mod, perform actual healing logic here (e.g. via player stats)
|
||||||
|
# For demonstration, simply return success
|
||||||
|
return true
|
||||||
@@ -0,0 +1,9 @@
|
|||||||
|
extends RefCounted
|
||||||
|
|
||||||
|
func get_name():
|
||||||
|
return "gds.light_reset"
|
||||||
|
|
||||||
|
func run(ctx):
|
||||||
|
ctx.Lighting.ClearDepthMap()
|
||||||
|
ctx.Lighting.SetUseTime(false)
|
||||||
|
ctx.Log("GDS", "Lighting reset via GDScript")
|
||||||
@@ -0,0 +1,12 @@
|
|||||||
|
extends RefCounted
|
||||||
|
|
||||||
|
func get_name():
|
||||||
|
return "gds.quest_log"
|
||||||
|
|
||||||
|
func run(ctx):
|
||||||
|
var quest_id = ctx.GetParam("quest_id")
|
||||||
|
var message = ctx.GetParam("message")
|
||||||
|
if quest_id == "":
|
||||||
|
ctx.LogWarning("GDS", "gds.quest_log: missing quest_id param")
|
||||||
|
return
|
||||||
|
ctx.Log("QUEST", "[" + quest_id + "] " + message)
|
||||||
@@ -0,0 +1,16 @@
|
|||||||
|
extends RefCounted
|
||||||
|
|
||||||
|
func get_name():
|
||||||
|
return "gds.quest_setup"
|
||||||
|
|
||||||
|
func run(ctx):
|
||||||
|
var quest_id = ctx.GetParam("quest_id")
|
||||||
|
if quest_id == "":
|
||||||
|
ctx.LogWarning("GDS", "gds.quest_setup: missing quest_id")
|
||||||
|
return
|
||||||
|
|
||||||
|
if ctx.Quests.Exists(quest_id):
|
||||||
|
ctx.Quests.SetStatus(quest_id, "Active")
|
||||||
|
ctx.Quests.AddTag(quest_id, "gds_started")
|
||||||
|
ctx.Quests.SendNotification(quest_id)
|
||||||
|
ctx.Log("GDS", "Quest '" + quest_id + "' activated by GDScript")
|
||||||
@@ -0,0 +1,7 @@
|
|||||||
|
extends RefCounted
|
||||||
|
|
||||||
|
func on_mod_loaded(mod_id):
|
||||||
|
print("[GDS_TEST] on_mod_loaded: " + mod_id)
|
||||||
|
|
||||||
|
func on_mod_resources_ready():
|
||||||
|
print("[GDS_TEST] on_mod_resources_ready: all mods loaded")
|
||||||
Reference in New Issue
Block a user