#Instantiated Scene, Many Monsters.

9 messages · Page 1 of 1 (latest)

stone tusk
#

Hey, recently I've tackled creating a battle scene, and instead of tediously creating several individual monster scenes with stats I opted by creating one scene with every monster data, which as soon it's instantiated into battle a randomnumber is generated, and that number decides which monster it becomes.

It works, but upon generating 3 monsters, every monster has the same ID, so they're always the same monster.
This is the relevant code of the monster:

extends Node2D


var mon_name
var mon_id
var mon_anim

var mon_HP
var mon_AT
var mon_DF
var mon_check_text

var mon_exp
var mon_gold

var act_1
var act_2
var act_3

var act_1_text
var act_2_text
var act_3_text

var rng = RandomNumberGenerator.new()
var ruins_mon_pool = rng.randi_range(0,1)

func _ready():
    var monster_data = MonsterGroup.monData
    var monster_array = MonsterGroup.monID
    
    MonsterGroup.set_monster_stats(monster_data[monster_array[ruins_mon_pool]]["mon_id"],monster_data[monster_array[ruins_mon_pool]]["mon_anim"])
    mon_name = MonsterGroup.mon_name
    mon_anim = MonsterGroup.mon_anim
    mon_id = MonsterGroup.mon_id
    
    mon_HP = MonsterGroup.mon_HP
    mon_AT = MonsterGroup.mon_AT
    mon_DF = MonsterGroup.mon_DF
    
    act_1 = MonsterGroup.act_1
    act_2 = MonsterGroup.act_2
    act_3 = MonsterGroup.act_3
    
    act_1_text = MonsterGroup.act_1_text
    act_2_text = MonsterGroup.act_2_text
    act_3_text= MonsterGroup.act_3_text
    
    mon_gold = MonsterGroup.mon_gold
    mon_exp = MonsterGroup.mon_exp
#

This is the singleton that holds the mon data:

extends Node

var monData = {}
var monID = []
var data_file_path = "res://assets/dialog/monsters_list.json"
var mon_id_path = "res://assets/dialog/monster_id_list.json"


var mon_name
var mon_anim
var mon_id

var mon_HP
var mon_AT
var mon_DF
var mon_check_text

var mon_exp
var mon_gold

var act_1
var act_2
var act_3

var act_1_text
var act_2_text
var act_3_text

var rng = RandomNumberGenerator.new()
var ruins_mon_pool = rng.randi_range(0,1)

signal change_animation_mon(animation)


func _ready():
    monData = load_json_file(data_file_path)
    monID = load_json_file(mon_id_path)
    
    mon_id = monData[monID[ruins_mon_pool]]["mon_id"] 
    mon_anim = monData[monID[ruins_mon_pool]]["mon_anim"] 

func set_monster_stats(mon_id_true, anim):
    mon_name = monData[mon_id_true]["mon_name"]
    
    mon_HP = monData[mon_id_true]["mon_hp"]
    mon_AT = monData[mon_id_true]["mon_at"]
    mon_DF = monData[mon_id_true]["mon_df"]
    mon_check_text = monData[mon_id_true]["mon_check"]

    mon_exp = monData[mon_id_true]["mon_exp"]
    mon_gold = monData[mon_id_true]["mon_gold"]

    act_1 = monData[mon_id_true]["act_1"]
    act_2 = monData[mon_id_true]["act_2"]
    act_3 = monData[mon_id_true]["act_3"]

    act_1_text = monData[mon_id_true]["act_1_text"]
    act_2_text = monData[mon_id_true]["act_2_text"]
    act_3_text = monData[mon_id_true]["act_3_text"]
    
    change_animation_mon.emit(anim)


func load_json_file(filePath: String):
    if FileAccess.file_exists(filePath):
        
        var dataFile = FileAccess.open(filePath, FileAccess.READ)
        var parsedResult = JSON.parse_string(dataFile.get_as_text())
        
        if parsedResult is Dictionary:
            return parsedResult
        elif parsedResult is Array:
            return parsedResult
        else:
            print("Error reading file")
        
    else:
        print("File doesn't exist!")
#

This is the way I call the all-monster scene:

func _ready():
    SignalBus.button_change.emit("FIGHT")
    SignalBus.animation_ended.connect(turn_end)
    SignalBus.num_of_monsters = 3
    if SignalBus.num_of_monsters >= 1:
        instantiate_father_of_monsters(Vector2(0,0))
    if SignalBus.num_of_monsters >= 2:
        instantiate_father_of_monsters(Vector2(200,0))
    if SignalBus.num_of_monsters == 3:
        instantiate_father_of_monsters(Vector2(400,0))
func instantiate_father_of_monsters(pos):
    var instance = FoM.instantiate()
    instance.position = pos
    print(instance)
    add_child(instance)

I want to know how do I make these fellows unique between each other, there's currently only 2 test dummies but it's enough for visual reference.

stone tusk
#

So, it appears that they're unique, but their animations are not being updated together with their stats

#

Or rather, it seems that the animations are set the same for every monster equally

#

The first generated monster defines which animation every monster has

#

Ok, the signal that changes animations hits every monster

#

Did it.

#

It appears that using a global signal to change something changes something globally, who'd ever think of that?