From 9214d1305494f06f115335a8b370cef24c25187b Mon Sep 17 00:00:00 2001 From: Dan Date: Wed, 28 Jan 2026 13:22:04 +0000 Subject: [PATCH] Who knows what --- assets/audio/OGG/BGS Loops/.DS_Store | Bin 6148 -> 0 bytes .../audio/OGG/BGS Loops/Beach/Beach Rain.ogg | 3 - .../OGG/BGS Loops/Beach/Beach Rain.ogg.import | 19 - .../audio/OGG/BGS Loops/Beach/Beach Storm.ogg | 3 - .../BGS Loops/Beach/Beach Storm.ogg.import | 19 - assets/audio/OGG/BGS Loops/Beach/Beach.ogg | 3 - .../OGG/BGS Loops/Beach/Beach.ogg.import | 19 - assets/audio/OGG/BGS Loops/Cave/Cave Rain.ogg | 3 - .../OGG/BGS Loops/Cave/Cave Rain.ogg.import | 19 - .../audio/OGG/BGS Loops/Cave/Cave Storm.ogg | 3 - .../OGG/BGS Loops/Cave/Cave Storm.ogg.import | 19 - assets/audio/OGG/BGS Loops/Cave/Cave.ogg | 3 - .../audio/OGG/BGS Loops/Cave/Cave.ogg.import | 19 - .../BGS Loops/Forest Day/Forest Day Rain.ogg | 3 - .../Forest Day/Forest Day Rain.ogg.import | 19 - .../BGS Loops/Forest Day/Forest Day Storm.ogg | 3 - .../Forest Day/Forest Day Storm.ogg.import | 19 - .../OGG/BGS Loops/Forest Day/Forest Day.ogg | 3 - .../Forest Day/Forest Day.ogg.import | 19 - .../Forest Night/Forest Night Rain.ogg | 3 - .../Forest Night/Forest Night Rain.ogg.import | 19 - .../Forest Night/Forest Night Storm.ogg | 3 - .../Forest Night Storm.ogg.import | 19 - .../BGS Loops/Forest Night/Forest Night.ogg | 3 - .../Forest Night/Forest Night.ogg.import | 19 - .../Interior Day/Inside Day Rain.ogg | 3 - .../Interior Day/Inside Day Rain.ogg.import | 19 - .../Interior Day/Inside Day Storm.ogg | 3 - .../Interior Day/Inside Day Storm.ogg.import | 19 - .../OGG/BGS Loops/Interior Day/Inside Day.ogg | 3 - .../Interior Day/Inside Day.ogg.import | 19 - .../Interior Night/Inside Night Rain.ogg | 3 - .../Inside Night Rain.ogg.import | 19 - .../Interior Night/Inside Night Storm.ogg | 3 - .../Inside Night Storm.ogg.import | 19 - .../BGS Loops/Interior Night/Inside Night.ogg | 3 - .../Interior Night/Inside Night.ogg.import | 19 - assets/audio/OGG/BGS Loops/Sea/Sea Rain.ogg | 3 - .../OGG/BGS Loops/Sea/Sea Rain.ogg.import | 19 - assets/audio/OGG/BGS Loops/Sea/Sea Storm.ogg | 3 - .../OGG/BGS Loops/Sea/Sea Storm.ogg.import | 19 - assets/audio/OGG/BGS Loops/Sea/Sea.ogg | 3 - assets/audio/OGG/BGS Loops/Sea/Sea.ogg.import | 19 - assets/audio/OGG/SFX/.DS_Store | Bin 20484 -> 0 bytes assets/audio/OGG/SFX/Attacks/.DS_Store | Bin 12292 -> 0 bytes .../Bow Attacks Hits and Blocks/.DS_Store | Bin 6148 -> 0 bytes .../Bow Attack 1.ogg | 3 - .../Bow Attack 1.ogg.import | 19 - .../Bow Attack 2.ogg | 3 - .../Bow Attack 2.ogg.import | 19 - .../Bow Blocked 1.ogg | 3 - .../Bow Blocked 1.ogg.import | 19 - .../Bow Blocked 2.ogg | 3 - .../Bow Blocked 2.ogg.import | 19 - .../Bow Blocked 3.ogg | 3 - .../Bow Blocked 3.ogg.import | 19 - .../Bow Impact Hit 1.ogg | 3 - .../Bow Impact Hit 1.ogg.import | 19 - .../Bow Impact Hit 2.ogg | 3 - .../Bow Impact Hit 2.ogg.import | 19 - .../Bow Impact Hit 3.ogg | 3 - .../Bow Impact Hit 3.ogg.import | 19 - .../Bow Put Away 1.ogg | 3 - .../Bow Put Away 1.ogg.import | 19 - .../Bow Take Out 1.ogg | 3 - .../Bow Take Out 1.ogg.import | 19 - .../Sword Attacks Hits and Blocks/.DS_Store | Bin 6148 -> 0 bytes .../Sword Attack 1.ogg | 3 - .../Sword Attack 1.ogg.import | 19 - .../Sword Attack 2.ogg | 3 - .../Sword Attack 2.ogg.import | 19 - .../Sword Attack 3.ogg | 3 - .../Sword Attack 3.ogg.import | 19 - .../Sword Blocked 1.ogg | 3 - .../Sword Blocked 1.ogg.import | 19 - .../Sword Blocked 2.ogg | 3 - .../Sword Blocked 2.ogg.import | 19 - .../Sword Blocked 3.ogg | 3 - .../Sword Blocked 3.ogg.import | 19 - .../Sword Impact Hit 1.ogg | 3 - .../Sword Impact Hit 1.ogg.import | 19 - .../Sword Impact Hit 2.ogg | 3 - .../Sword Impact Hit 2.ogg.import | 19 - .../Sword Impact Hit 3.ogg | 3 - .../Sword Impact Hit 3.ogg.import | 19 - .../Sword Parry 1.ogg | 3 - .../Sword Parry 1.ogg.import | 19 - .../Sword Parry 2.ogg | 3 - .../Sword Parry 2.ogg.import | 19 - .../Sword Parry 3.ogg | 3 - .../Sword Parry 3.ogg.import | 19 - .../Sword Sheath 1.ogg | 3 - .../Sword Sheath 1.ogg.import | 19 - .../Sword Sheath 2.ogg | 3 - .../Sword Sheath 2.ogg.import | 19 - .../Sword Unsheath 1.ogg | 3 - .../Sword Unsheath 1.ogg.import | 19 - .../Sword Unsheath 2.ogg | 3 - .../Sword Unsheath 2.ogg.import | 19 - .../OGG/SFX/Doors Gates and Chests/.DS_Store | Bin 6148 -> 0 bytes .../Doors Gates and Chests/Chest Close 1.ogg | 3 - .../Chest Close 1.ogg.import | 19 - .../Doors Gates and Chests/Chest Close 2.ogg | 3 - .../Chest Close 2.ogg.import | 19 - .../Doors Gates and Chests/Chest Open 1.ogg | 3 - .../Chest Open 1.ogg.import | 19 - .../Doors Gates and Chests/Chest Open 2.ogg | 3 - .../Chest Open 2.ogg.import | 19 - .../Doors Gates and Chests/Door Close 1.ogg | 3 - .../Door Close 1.ogg.import | 19 - .../Doors Gates and Chests/Door Close 2.ogg | 3 - .../Door Close 2.ogg.import | 19 - .../Doors Gates and Chests/Door Open 1.ogg | 3 - .../Door Open 1.ogg.import | 19 - .../Doors Gates and Chests/Door Open 2.ogg | 3 - .../Door Open 2.ogg.import | 19 - .../SFX/Doors Gates and Chests/Gate Close.ogg | 3 - .../Gate Close.ogg.import | 19 - .../SFX/Doors Gates and Chests/Gate Open.ogg | 3 - .../Gate Open.ogg.import | 19 - .../Doors Gates and Chests/Lock Unlock.ogg | 3 - .../Lock Unlock.ogg.import | 19 - .../Portcullis Gate.ogg | 3 - .../Portcullis Gate.ogg.import | 19 - assets/audio/OGG/SFX/Footsteps/.DS_Store | Bin 14340 -> 0 bytes assets/audio/OGG/SFX/Footsteps/Dirt/.DS_Store | Bin 6148 -> 0 bytes .../SFX/Footsteps/Dirt/Dirt Chain Jump.ogg | 3 - .../Footsteps/Dirt/Dirt Chain Jump.ogg.import | 19 - .../SFX/Footsteps/Dirt/Dirt Chain Land.ogg | 3 - .../Footsteps/Dirt/Dirt Chain Land.ogg.import | 19 - .../SFX/Footsteps/Dirt/Dirt Chain Run 1.ogg | 3 - .../Dirt/Dirt Chain Run 1.ogg.import | 19 - .../SFX/Footsteps/Dirt/Dirt Chain Run 2.ogg | 3 - .../Dirt/Dirt Chain Run 2.ogg.import | 19 - .../SFX/Footsteps/Dirt/Dirt Chain Run 3.ogg | 3 - .../Dirt/Dirt Chain Run 3.ogg.import | 19 - .../SFX/Footsteps/Dirt/Dirt Chain Run 4.ogg | 3 - .../Dirt/Dirt Chain Run 4.ogg.import | 19 - .../SFX/Footsteps/Dirt/Dirt Chain Run 5.ogg | 3 - .../Dirt/Dirt Chain Run 5.ogg.import | 19 - .../SFX/Footsteps/Dirt/Dirt Chain Walk 1.ogg | 3 - .../Dirt/Dirt Chain Walk 1.ogg.import | 19 - .../SFX/Footsteps/Dirt/Dirt Chain Walk 2.ogg | 3 - .../Dirt/Dirt Chain Walk 2.ogg.import | 19 - .../SFX/Footsteps/Dirt/Dirt Chain Walk 3.ogg | 3 - .../Dirt/Dirt Chain Walk 3.ogg.import | 19 - .../SFX/Footsteps/Dirt/Dirt Chain Walk 4.ogg | 3 - .../Dirt/Dirt Chain Walk 4.ogg.import | 19 - .../SFX/Footsteps/Dirt/Dirt Chain Walk 5.ogg | 3 - .../Dirt/Dirt Chain Walk 5.ogg.import | 19 - .../OGG/SFX/Footsteps/Dirt/Dirt Jump.ogg | 3 - .../SFX/Footsteps/Dirt/Dirt Jump.ogg.import | 19 - .../OGG/SFX/Footsteps/Dirt/Dirt Land.ogg | 3 - .../SFX/Footsteps/Dirt/Dirt Land.ogg.import | 19 - .../OGG/SFX/Footsteps/Dirt/Dirt Run 1.ogg | 3 - .../SFX/Footsteps/Dirt/Dirt Run 1.ogg.import | 19 - .../OGG/SFX/Footsteps/Dirt/Dirt Run 2.ogg | 3 - .../SFX/Footsteps/Dirt/Dirt Run 2.ogg.import | 19 - .../OGG/SFX/Footsteps/Dirt/Dirt Run 3.ogg | 3 - .../SFX/Footsteps/Dirt/Dirt Run 3.ogg.import | 19 - .../OGG/SFX/Footsteps/Dirt/Dirt Run 4.ogg | 3 - .../SFX/Footsteps/Dirt/Dirt Run 4.ogg.import | 19 - .../OGG/SFX/Footsteps/Dirt/Dirt Run 5.ogg | 3 - .../SFX/Footsteps/Dirt/Dirt Run 5.ogg.import | 19 - .../OGG/SFX/Footsteps/Dirt/Dirt Walk 1.ogg | 3 - .../SFX/Footsteps/Dirt/Dirt Walk 1.ogg.import | 19 - .../OGG/SFX/Footsteps/Dirt/Dirt Walk 2.ogg | 3 - .../SFX/Footsteps/Dirt/Dirt Walk 2.ogg.import | 19 - .../OGG/SFX/Footsteps/Dirt/Dirt Walk 3.ogg | 3 - .../SFX/Footsteps/Dirt/Dirt Walk 3.ogg.import | 19 - .../OGG/SFX/Footsteps/Dirt/Dirt Walk 4.ogg | 3 - .../SFX/Footsteps/Dirt/Dirt Walk 4.ogg.import | 19 - .../OGG/SFX/Footsteps/Dirt/Dirt Walk 5.ogg | 3 - .../SFX/Footsteps/Dirt/Dirt Walk 5.ogg.import | 19 - .../audio/OGG/SFX/Footsteps/Stone/.DS_Store | Bin 6148 -> 0 bytes .../SFX/Footsteps/Stone/Stone Chain Jump.ogg | 3 - .../Stone/Stone Chain Jump.ogg.import | 19 - .../SFX/Footsteps/Stone/Stone Chain Land.ogg | 3 - .../Stone/Stone Chain Land.ogg.import | 19 - .../SFX/Footsteps/Stone/Stone Chain Run 1.ogg | 3 - .../Stone/Stone Chain Run 1.ogg.import | 19 - .../SFX/Footsteps/Stone/Stone Chain Run 2.ogg | 3 - .../Stone/Stone Chain Run 2.ogg.import | 19 - .../SFX/Footsteps/Stone/Stone Chain Run 3.ogg | 3 - .../Stone/Stone Chain Run 3.ogg.import | 19 - .../SFX/Footsteps/Stone/Stone Chain Run 4.ogg | 3 - .../Stone/Stone Chain Run 4.ogg.import | 19 - .../SFX/Footsteps/Stone/Stone Chain Run 5.ogg | 3 - .../Stone/Stone Chain Run 5.ogg.import | 19 - .../Footsteps/Stone/Stone Chain Walk 1.ogg | 3 - .../Stone/Stone Chain Walk 1.ogg.import | 19 - .../Footsteps/Stone/Stone Chain Walk 2.ogg | 3 - .../Stone/Stone Chain Walk 2.ogg.import | 19 - .../Footsteps/Stone/Stone Chain Walk 3.ogg | 3 - .../Stone/Stone Chain Walk 3.ogg.import | 19 - .../Footsteps/Stone/Stone Chain Walk 4.ogg | 3 - .../Stone/Stone Chain Walk 4.ogg.import | 19 - .../Footsteps/Stone/Stone Chain Walk 5.ogg | 3 - .../Stone/Stone Chain Walk 5.ogg.import | 19 - .../OGG/SFX/Footsteps/Stone/Stone Jump.ogg | 3 - .../SFX/Footsteps/Stone/Stone Jump.ogg.import | 19 - .../OGG/SFX/Footsteps/Stone/Stone Land.ogg | 3 - .../SFX/Footsteps/Stone/Stone Land.ogg.import | 19 - .../OGG/SFX/Footsteps/Stone/Stone Run 1.ogg | 3 - .../Footsteps/Stone/Stone Run 1.ogg.import | 19 - .../OGG/SFX/Footsteps/Stone/Stone Run 2.ogg | 3 - .../Footsteps/Stone/Stone Run 2.ogg.import | 19 - .../OGG/SFX/Footsteps/Stone/Stone Run 3.ogg | 3 - .../Footsteps/Stone/Stone Run 3.ogg.import | 19 - .../OGG/SFX/Footsteps/Stone/Stone Run 4.ogg | 3 - .../Footsteps/Stone/Stone Run 4.ogg.import | 19 - .../OGG/SFX/Footsteps/Stone/Stone Run 5.ogg | 3 - .../Footsteps/Stone/Stone Run 5.ogg.import | 19 - .../OGG/SFX/Footsteps/Stone/Stone Walk 1.ogg | 3 - .../Footsteps/Stone/Stone Walk 1.ogg.import | 19 - .../OGG/SFX/Footsteps/Stone/Stone Walk 2.ogg | 3 - .../Footsteps/Stone/Stone Walk 2.ogg.import | 19 - .../OGG/SFX/Footsteps/Stone/Stone Walk 3.ogg | 3 - .../Footsteps/Stone/Stone Walk 3.ogg.import | 19 - .../OGG/SFX/Footsteps/Stone/Stone Walk 4.ogg | 3 - .../Footsteps/Stone/Stone Walk 4.ogg.import | 19 - .../OGG/SFX/Footsteps/Stone/Stone Walk 5.ogg | 3 - .../Footsteps/Stone/Stone Walk 5.ogg.import | 19 - .../audio/OGG/SFX/Footsteps/Water/.DS_Store | Bin 6148 -> 0 bytes .../SFX/Footsteps/Water/Water Chain Jump.ogg | 3 - .../Water/Water Chain Jump.ogg.import | 19 - .../SFX/Footsteps/Water/Water Chain Land.ogg | 3 - .../Water/Water Chain Land.ogg.import | 19 - .../SFX/Footsteps/Water/Water Chain Run 1.ogg | 3 - .../Water/Water Chain Run 1.ogg.import | 19 - .../SFX/Footsteps/Water/Water Chain Run 2.ogg | 3 - .../Water/Water Chain Run 2.ogg.import | 19 - .../SFX/Footsteps/Water/Water Chain Run 3.ogg | 3 - .../Water/Water Chain Run 3.ogg.import | 19 - .../SFX/Footsteps/Water/Water Chain Run 4.ogg | 3 - .../Water/Water Chain Run 4.ogg.import | 19 - .../SFX/Footsteps/Water/Water Chain Run 5.ogg | 3 - .../Water/Water Chain Run 5.ogg.import | 19 - .../Footsteps/Water/Water Chain Walk 1.ogg | 3 - .../Water/Water Chain Walk 1.ogg.import | 19 - .../Footsteps/Water/Water Chain Walk 2.ogg | 3 - .../Water/Water Chain Walk 2.ogg.import | 19 - .../Footsteps/Water/Water Chain Walk 3.ogg | 3 - .../Water/Water Chain Walk 3.ogg.import | 19 - .../Footsteps/Water/Water Chain Walk 4.ogg | 3 - .../Water/Water Chain Walk 4.ogg.import | 19 - .../Footsteps/Water/Water Chain Walk 5.ogg | 3 - .../Water/Water Chain Walk 5.ogg.import | 19 - .../OGG/SFX/Footsteps/Water/Water Jump.ogg | 3 - .../SFX/Footsteps/Water/Water Jump.ogg.import | 19 - .../OGG/SFX/Footsteps/Water/Water Land.ogg | 3 - .../SFX/Footsteps/Water/Water Land.ogg.import | 19 - .../OGG/SFX/Footsteps/Water/Water Run 1.ogg | 3 - .../Footsteps/Water/Water Run 1.ogg.import | 19 - .../OGG/SFX/Footsteps/Water/Water Run 2.ogg | 3 - .../Footsteps/Water/Water Run 2.ogg.import | 19 - .../OGG/SFX/Footsteps/Water/Water Run 3.ogg | 3 - .../Footsteps/Water/Water Run 3.ogg.import | 19 - .../OGG/SFX/Footsteps/Water/Water Run 4.ogg | 3 - .../Footsteps/Water/Water Run 4.ogg.import | 19 - .../OGG/SFX/Footsteps/Water/Water Run 5.ogg | 3 - .../Footsteps/Water/Water Run 5.ogg.import | 19 - .../OGG/SFX/Footsteps/Water/Water Walk 1.ogg | 3 - .../Footsteps/Water/Water Walk 1.ogg.import | 19 - .../OGG/SFX/Footsteps/Water/Water Walk 2.ogg | 3 - .../Footsteps/Water/Water Walk 2.ogg.import | 19 - .../OGG/SFX/Footsteps/Water/Water Walk 3.ogg | 3 - .../Footsteps/Water/Water Walk 3.ogg.import | 19 - .../OGG/SFX/Footsteps/Water/Water Walk 4.ogg | 3 - .../Footsteps/Water/Water Walk 4.ogg.import | 19 - .../OGG/SFX/Footsteps/Water/Water Walk 5.ogg | 3 - .../Footsteps/Water/Water Walk 5.ogg.import | 19 - assets/audio/OGG/SFX/Footsteps/Wood/.DS_Store | Bin 6148 -> 0 bytes .../SFX/Footsteps/Wood/Wood Chain Jump.ogg | 3 - .../Footsteps/Wood/Wood Chain Jump.ogg.import | 19 - .../SFX/Footsteps/Wood/Wood Chain Land.ogg | 3 - .../Footsteps/Wood/Wood Chain Land.ogg.import | 19 - .../SFX/Footsteps/Wood/Wood Chain Run 1.ogg | 3 - .../Wood/Wood Chain Run 1.ogg.import | 19 - .../SFX/Footsteps/Wood/Wood Chain Run 2.ogg | 3 - .../Wood/Wood Chain Run 2.ogg.import | 19 - .../SFX/Footsteps/Wood/Wood Chain Run 3.ogg | 3 - .../Wood/Wood Chain Run 3.ogg.import | 19 - .../SFX/Footsteps/Wood/Wood Chain Run 4.ogg | 3 - .../Wood/Wood Chain Run 4.ogg.import | 19 - .../SFX/Footsteps/Wood/Wood Chain Run 5.ogg | 3 - .../Wood/Wood Chain Run 5.ogg.import | 19 - .../SFX/Footsteps/Wood/Wood Chain Walk 1.ogg | 3 - .../Wood/Wood Chain Walk 1.ogg.import | 19 - .../SFX/Footsteps/Wood/Wood Chain Walk 2.ogg | 3 - .../Wood/Wood Chain Walk 2.ogg.import | 19 - .../SFX/Footsteps/Wood/Wood Chain Walk 3.ogg | 3 - .../Wood/Wood Chain Walk 3.ogg.import | 19 - .../SFX/Footsteps/Wood/Wood Chain Walk 4.ogg | 3 - .../Wood/Wood Chain Walk 4.ogg.import | 19 - .../SFX/Footsteps/Wood/Wood Chain Walk 5.ogg | 3 - .../Wood/Wood Chain Walk 5.ogg.import | 19 - .../OGG/SFX/Footsteps/Wood/Wood Jump.ogg | 3 - .../SFX/Footsteps/Wood/Wood Jump.ogg.import | 19 - .../OGG/SFX/Footsteps/Wood/Wood Land.ogg | 3 - .../SFX/Footsteps/Wood/Wood Land.ogg.import | 19 - .../OGG/SFX/Footsteps/Wood/Wood Run 1.ogg | 3 - .../SFX/Footsteps/Wood/Wood Run 1.ogg.import | 19 - .../OGG/SFX/Footsteps/Wood/Wood Run 2.ogg | 3 - .../SFX/Footsteps/Wood/Wood Run 2.ogg.import | 19 - .../OGG/SFX/Footsteps/Wood/Wood Run 3.ogg | 3 - .../SFX/Footsteps/Wood/Wood Run 3.ogg.import | 19 - .../OGG/SFX/Footsteps/Wood/Wood Run 4.ogg | 3 - .../SFX/Footsteps/Wood/Wood Run 4.ogg.import | 19 - .../OGG/SFX/Footsteps/Wood/Wood Run 5.ogg | 3 - .../SFX/Footsteps/Wood/Wood Run 5.ogg.import | 19 - .../OGG/SFX/Footsteps/Wood/Wood Walk 1.ogg | 3 - .../SFX/Footsteps/Wood/Wood Walk 1.ogg.import | 19 - .../OGG/SFX/Footsteps/Wood/Wood Walk 2.ogg | 3 - .../SFX/Footsteps/Wood/Wood Walk 2.ogg.import | 19 - .../OGG/SFX/Footsteps/Wood/Wood Walk 3.ogg | 3 - .../SFX/Footsteps/Wood/Wood Walk 3.ogg.import | 19 - .../OGG/SFX/Footsteps/Wood/Wood Walk 4.ogg | 3 - .../SFX/Footsteps/Wood/Wood Walk 4.ogg.import | 19 - .../OGG/SFX/Footsteps/Wood/Wood Walk 5.ogg | 3 - .../SFX/Footsteps/Wood/Wood Walk 5.ogg.import | 19 - assets/audio/OGG/SFX/Spells/.DS_Store | Bin 6148 -> 0 bytes assets/audio/OGG/SFX/Spells/Fireball 1.ogg | 3 - .../OGG/SFX/Spells/Fireball 1.ogg.import | 19 - assets/audio/OGG/SFX/Spells/Fireball 2.ogg | 3 - .../OGG/SFX/Spells/Fireball 2.ogg.import | 19 - assets/audio/OGG/SFX/Spells/Fireball 3.ogg | 3 - .../OGG/SFX/Spells/Fireball 3.ogg.import | 19 - assets/audio/OGG/SFX/Spells/Firebuff 1.ogg | 3 - .../OGG/SFX/Spells/Firebuff 1.ogg.import | 19 - assets/audio/OGG/SFX/Spells/Firebuff 2.ogg | 3 - .../OGG/SFX/Spells/Firebuff 2.ogg.import | 19 - assets/audio/OGG/SFX/Spells/Firespray 1.ogg | 3 - .../OGG/SFX/Spells/Firespray 1.ogg.import | 19 - assets/audio/OGG/SFX/Spells/Firespray 2.ogg | 3 - .../OGG/SFX/Spells/Firespray 2.ogg.import | 19 - assets/audio/OGG/SFX/Spells/Ice Barrage 1.ogg | 3 - .../OGG/SFX/Spells/Ice Barrage 1.ogg.import | 19 - assets/audio/OGG/SFX/Spells/Ice Barrage 2.ogg | 3 - .../OGG/SFX/Spells/Ice Barrage 2.ogg.import | 19 - assets/audio/OGG/SFX/Spells/Ice Freeze 1.ogg | 3 - .../OGG/SFX/Spells/Ice Freeze 1.ogg.import | 19 - assets/audio/OGG/SFX/Spells/Ice Freeze 2.ogg | 3 - .../OGG/SFX/Spells/Ice Freeze 2.ogg.import | 19 - assets/audio/OGG/SFX/Spells/Ice Throw 1.ogg | 3 - .../OGG/SFX/Spells/Ice Throw 1.ogg.import | 19 - assets/audio/OGG/SFX/Spells/Ice Throw 2.ogg | 3 - .../OGG/SFX/Spells/Ice Throw 2.ogg.import | 19 - assets/audio/OGG/SFX/Spells/Ice Wall 1.ogg | 3 - .../OGG/SFX/Spells/Ice Wall 1.ogg.import | 19 - assets/audio/OGG/SFX/Spells/Ice Wall 2.ogg | 3 - .../OGG/SFX/Spells/Ice Wall 2.ogg.import | 19 - .../OGG/SFX/Spells/Rock Meteor Swarm 1.ogg | 3 - .../SFX/Spells/Rock Meteor Swarm 1.ogg.import | 19 - .../OGG/SFX/Spells/Rock Meteor Swarm 2.ogg | 3 - .../SFX/Spells/Rock Meteor Swarm 2.ogg.import | 19 - .../OGG/SFX/Spells/Rock Meteor Throw 1.ogg | 3 - .../SFX/Spells/Rock Meteor Throw 1.ogg.import | 19 - .../OGG/SFX/Spells/Rock Meteor Throw 2.ogg | 3 - .../SFX/Spells/Rock Meteor Throw 2.ogg.import | 19 - assets/audio/OGG/SFX/Spells/Rock Wall 1.ogg | 3 - .../OGG/SFX/Spells/Rock Wall 1.ogg.import | 19 - assets/audio/OGG/SFX/Spells/Rock Wall 2.ogg | 3 - .../OGG/SFX/Spells/Rock Wall 2.ogg.import | 19 - .../audio/OGG/SFX/Spells/Spell Impact 1.ogg | 3 - .../OGG/SFX/Spells/Spell Impact 1.ogg.import | 19 - .../audio/OGG/SFX/Spells/Spell Impact 2.ogg | 3 - .../OGG/SFX/Spells/Spell Impact 2.ogg.import | 19 - .../audio/OGG/SFX/Spells/Spell Impact 3.ogg | 3 - .../OGG/SFX/Spells/Spell Impact 3.ogg.import | 19 - assets/audio/OGG/SFX/Spells/Waterspray 1.ogg | 3 - .../OGG/SFX/Spells/Waterspray 1.ogg.import | 19 - assets/audio/OGG/SFX/Spells/Waterspray 2.ogg | 3 - .../OGG/SFX/Spells/Waterspray 2.ogg.import | 19 - assets/audio/OGG/SFX/Spells/Wave Attack 1.ogg | 3 - .../OGG/SFX/Spells/Wave Attack 1.ogg.import | 19 - assets/audio/OGG/SFX/Spells/Wave Attack 2.ogg | 3 - .../OGG/SFX/Spells/Wave Attack 2.ogg.import | 19 - assets/audio/OGG/SFX/Torch/.DS_Store | Bin 6148 -> 0 bytes assets/audio/OGG/SFX/Torch/Light Torch 1.ogg | 3 - .../OGG/SFX/Torch/Light Torch 1.ogg.import | 19 - assets/audio/OGG/SFX/Torch/Light Torch 2.ogg | 3 - .../OGG/SFX/Torch/Light Torch 2.ogg.import | 19 - .../Light Torch with Starting Loop 1.ogg | 3 - ...ight Torch with Starting Loop 1.ogg.import | 19 - .../Light Torch with Starting Loop 2.ogg | 3 - ...ight Torch with Starting Loop 2.ogg.import | 19 - .../OGG/SFX/Torch/Torch Attack Strike 1.ogg | 3 - .../Torch/Torch Attack Strike 1.ogg.import | 19 - .../OGG/SFX/Torch/Torch Attack Strike 2.ogg | 3 - .../Torch/Torch Attack Strike 2.ogg.import | 19 - assets/audio/OGG/SFX/Torch/Torch Impact 1.ogg | 3 - .../OGG/SFX/Torch/Torch Impact 1.ogg.import | 19 - assets/audio/OGG/SFX/Torch/Torch Impact 2.ogg | 3 - .../OGG/SFX/Torch/Torch Impact 2.ogg.import | 19 - assets/audio/OGG/SFX/Torch/Torch Loop.ogg | 3 - .../audio/OGG/SFX/Torch/Torch Loop.ogg.import | 19 - .../Waterfalls Rivers and Streams/.DS_Store | Bin 6148 -> 0 bytes .../River Loop.ogg | 3 - .../River Loop.ogg.import | 19 - .../River Stream Loop.ogg | 3 - .../River Stream Loop.ogg.import | 19 - .../Waterfall Loop.ogg | 3 - .../Waterfall Loop.ogg.import | 19 - assets/theme/clicker.theme | Bin 305 -> 411 bytes export_presets.cfg | 49 + project.godot | 8 +- resources/UnlockData.tres | 40 +- resources/UnlockDataResource.gd | 8 +- scenes/game2.tscn | 205 +++- scenes/scripts/button.gd | 4 +- scenes/scripts/ui_control.gd | 46 + scenes/simulator.tscn | 124 +++ scripts/audio.gd | 2 +- scripts/game_manager.gd | 23 +- scripts/globals.gd | 16 +- scripts/inventory.gd | 2 +- scripts/sim.gd | 417 -------- scripts/sim.gd.uid | 1 - scripts/sim_cached.gd | 931 ++++++++++++++++++ scripts/sim_cached.gd.uid | 1 + scripts/tick_process.gd | 28 +- 422 files changed, 1412 insertions(+), 4783 deletions(-) delete mode 100644 assets/audio/OGG/BGS Loops/.DS_Store delete mode 100644 assets/audio/OGG/BGS Loops/Beach/Beach Rain.ogg delete mode 100644 assets/audio/OGG/BGS Loops/Beach/Beach Rain.ogg.import delete mode 100644 assets/audio/OGG/BGS Loops/Beach/Beach Storm.ogg delete mode 100644 assets/audio/OGG/BGS Loops/Beach/Beach Storm.ogg.import delete mode 100644 assets/audio/OGG/BGS Loops/Beach/Beach.ogg delete mode 100644 assets/audio/OGG/BGS Loops/Beach/Beach.ogg.import delete mode 100644 assets/audio/OGG/BGS Loops/Cave/Cave Rain.ogg delete mode 100644 assets/audio/OGG/BGS Loops/Cave/Cave Rain.ogg.import delete mode 100644 assets/audio/OGG/BGS Loops/Cave/Cave Storm.ogg delete mode 100644 assets/audio/OGG/BGS Loops/Cave/Cave Storm.ogg.import delete mode 100644 assets/audio/OGG/BGS Loops/Cave/Cave.ogg delete mode 100644 assets/audio/OGG/BGS Loops/Cave/Cave.ogg.import delete mode 100644 assets/audio/OGG/BGS Loops/Forest Day/Forest Day Rain.ogg delete mode 100644 assets/audio/OGG/BGS Loops/Forest Day/Forest Day Rain.ogg.import delete mode 100644 assets/audio/OGG/BGS Loops/Forest Day/Forest Day Storm.ogg delete mode 100644 assets/audio/OGG/BGS Loops/Forest Day/Forest Day Storm.ogg.import delete mode 100644 assets/audio/OGG/BGS Loops/Forest Day/Forest Day.ogg delete mode 100644 assets/audio/OGG/BGS Loops/Forest Day/Forest Day.ogg.import delete mode 100644 assets/audio/OGG/BGS Loops/Forest Night/Forest Night Rain.ogg delete mode 100644 assets/audio/OGG/BGS Loops/Forest Night/Forest Night Rain.ogg.import delete mode 100644 assets/audio/OGG/BGS Loops/Forest Night/Forest Night Storm.ogg delete mode 100644 assets/audio/OGG/BGS Loops/Forest Night/Forest Night Storm.ogg.import delete mode 100644 assets/audio/OGG/BGS Loops/Forest Night/Forest Night.ogg delete mode 100644 assets/audio/OGG/BGS Loops/Forest Night/Forest Night.ogg.import delete mode 100644 assets/audio/OGG/BGS Loops/Interior Day/Inside Day Rain.ogg delete mode 100644 assets/audio/OGG/BGS Loops/Interior Day/Inside Day Rain.ogg.import delete mode 100644 assets/audio/OGG/BGS Loops/Interior Day/Inside Day Storm.ogg delete mode 100644 assets/audio/OGG/BGS Loops/Interior Day/Inside Day Storm.ogg.import delete mode 100644 assets/audio/OGG/BGS Loops/Interior Day/Inside Day.ogg delete mode 100644 assets/audio/OGG/BGS Loops/Interior Day/Inside Day.ogg.import delete mode 100644 assets/audio/OGG/BGS Loops/Interior Night/Inside Night Rain.ogg delete mode 100644 assets/audio/OGG/BGS Loops/Interior Night/Inside Night Rain.ogg.import delete mode 100644 assets/audio/OGG/BGS Loops/Interior Night/Inside Night Storm.ogg delete mode 100644 assets/audio/OGG/BGS Loops/Interior Night/Inside Night Storm.ogg.import delete mode 100644 assets/audio/OGG/BGS Loops/Interior Night/Inside Night.ogg delete mode 100644 assets/audio/OGG/BGS Loops/Interior Night/Inside Night.ogg.import delete mode 100644 assets/audio/OGG/BGS Loops/Sea/Sea Rain.ogg delete mode 100644 assets/audio/OGG/BGS Loops/Sea/Sea Rain.ogg.import delete mode 100644 assets/audio/OGG/BGS Loops/Sea/Sea Storm.ogg delete mode 100644 assets/audio/OGG/BGS Loops/Sea/Sea Storm.ogg.import delete mode 100644 assets/audio/OGG/BGS Loops/Sea/Sea.ogg delete mode 100644 assets/audio/OGG/BGS Loops/Sea/Sea.ogg.import delete mode 100644 assets/audio/OGG/SFX/.DS_Store delete mode 100644 assets/audio/OGG/SFX/Attacks/.DS_Store delete mode 100644 assets/audio/OGG/SFX/Attacks/Bow Attacks Hits and Blocks/.DS_Store delete mode 100644 assets/audio/OGG/SFX/Attacks/Bow Attacks Hits and Blocks/Bow Attack 1.ogg delete mode 100644 assets/audio/OGG/SFX/Attacks/Bow Attacks Hits and Blocks/Bow Attack 1.ogg.import delete mode 100644 assets/audio/OGG/SFX/Attacks/Bow Attacks Hits and Blocks/Bow Attack 2.ogg delete mode 100644 assets/audio/OGG/SFX/Attacks/Bow Attacks Hits and Blocks/Bow Attack 2.ogg.import delete mode 100644 assets/audio/OGG/SFX/Attacks/Bow Attacks Hits and Blocks/Bow Blocked 1.ogg delete mode 100644 assets/audio/OGG/SFX/Attacks/Bow Attacks Hits and Blocks/Bow Blocked 1.ogg.import delete mode 100644 assets/audio/OGG/SFX/Attacks/Bow Attacks Hits and Blocks/Bow Blocked 2.ogg delete mode 100644 assets/audio/OGG/SFX/Attacks/Bow Attacks Hits and Blocks/Bow Blocked 2.ogg.import delete mode 100644 assets/audio/OGG/SFX/Attacks/Bow Attacks Hits and Blocks/Bow Blocked 3.ogg delete mode 100644 assets/audio/OGG/SFX/Attacks/Bow Attacks Hits and Blocks/Bow Blocked 3.ogg.import delete mode 100644 assets/audio/OGG/SFX/Attacks/Bow Attacks Hits and Blocks/Bow Impact Hit 1.ogg delete mode 100644 assets/audio/OGG/SFX/Attacks/Bow Attacks Hits and Blocks/Bow Impact Hit 1.ogg.import delete mode 100644 assets/audio/OGG/SFX/Attacks/Bow Attacks Hits and Blocks/Bow Impact Hit 2.ogg delete mode 100644 assets/audio/OGG/SFX/Attacks/Bow Attacks Hits and Blocks/Bow Impact Hit 2.ogg.import delete mode 100644 assets/audio/OGG/SFX/Attacks/Bow Attacks Hits and Blocks/Bow Impact Hit 3.ogg delete mode 100644 assets/audio/OGG/SFX/Attacks/Bow Attacks Hits and Blocks/Bow Impact Hit 3.ogg.import delete mode 100644 assets/audio/OGG/SFX/Attacks/Bow Attacks Hits and Blocks/Bow Put Away 1.ogg delete mode 100644 assets/audio/OGG/SFX/Attacks/Bow Attacks Hits and Blocks/Bow Put Away 1.ogg.import delete mode 100644 assets/audio/OGG/SFX/Attacks/Bow Attacks Hits and Blocks/Bow Take Out 1.ogg delete mode 100644 assets/audio/OGG/SFX/Attacks/Bow Attacks Hits and Blocks/Bow Take Out 1.ogg.import delete mode 100644 assets/audio/OGG/SFX/Attacks/Sword Attacks Hits and Blocks/.DS_Store delete mode 100644 assets/audio/OGG/SFX/Attacks/Sword Attacks Hits and Blocks/Sword Attack 1.ogg delete mode 100644 assets/audio/OGG/SFX/Attacks/Sword Attacks Hits and Blocks/Sword Attack 1.ogg.import delete mode 100644 assets/audio/OGG/SFX/Attacks/Sword Attacks Hits and Blocks/Sword Attack 2.ogg delete mode 100644 assets/audio/OGG/SFX/Attacks/Sword Attacks Hits and Blocks/Sword Attack 2.ogg.import delete mode 100644 assets/audio/OGG/SFX/Attacks/Sword Attacks Hits and Blocks/Sword Attack 3.ogg delete mode 100644 assets/audio/OGG/SFX/Attacks/Sword Attacks Hits and Blocks/Sword Attack 3.ogg.import delete mode 100644 assets/audio/OGG/SFX/Attacks/Sword Attacks Hits and Blocks/Sword Blocked 1.ogg delete mode 100644 assets/audio/OGG/SFX/Attacks/Sword Attacks Hits and Blocks/Sword Blocked 1.ogg.import delete mode 100644 assets/audio/OGG/SFX/Attacks/Sword Attacks Hits and Blocks/Sword Blocked 2.ogg delete mode 100644 assets/audio/OGG/SFX/Attacks/Sword Attacks Hits and Blocks/Sword Blocked 2.ogg.import delete mode 100644 assets/audio/OGG/SFX/Attacks/Sword Attacks Hits and Blocks/Sword Blocked 3.ogg delete mode 100644 assets/audio/OGG/SFX/Attacks/Sword Attacks Hits and Blocks/Sword Blocked 3.ogg.import delete mode 100644 assets/audio/OGG/SFX/Attacks/Sword Attacks Hits and Blocks/Sword Impact Hit 1.ogg delete mode 100644 assets/audio/OGG/SFX/Attacks/Sword Attacks Hits and Blocks/Sword Impact Hit 1.ogg.import delete mode 100644 assets/audio/OGG/SFX/Attacks/Sword Attacks Hits and Blocks/Sword Impact Hit 2.ogg delete mode 100644 assets/audio/OGG/SFX/Attacks/Sword Attacks Hits and Blocks/Sword Impact Hit 2.ogg.import delete mode 100644 assets/audio/OGG/SFX/Attacks/Sword Attacks Hits and Blocks/Sword Impact Hit 3.ogg delete mode 100644 assets/audio/OGG/SFX/Attacks/Sword Attacks Hits and Blocks/Sword Impact Hit 3.ogg.import delete mode 100644 assets/audio/OGG/SFX/Attacks/Sword Attacks Hits and Blocks/Sword Parry 1.ogg delete mode 100644 assets/audio/OGG/SFX/Attacks/Sword Attacks Hits and Blocks/Sword Parry 1.ogg.import delete mode 100644 assets/audio/OGG/SFX/Attacks/Sword Attacks Hits and Blocks/Sword Parry 2.ogg delete mode 100644 assets/audio/OGG/SFX/Attacks/Sword Attacks Hits and Blocks/Sword Parry 2.ogg.import delete mode 100644 assets/audio/OGG/SFX/Attacks/Sword Attacks Hits and Blocks/Sword Parry 3.ogg delete mode 100644 assets/audio/OGG/SFX/Attacks/Sword Attacks Hits and Blocks/Sword Parry 3.ogg.import delete mode 100644 assets/audio/OGG/SFX/Attacks/Sword Attacks Hits and Blocks/Sword Sheath 1.ogg delete mode 100644 assets/audio/OGG/SFX/Attacks/Sword Attacks Hits and Blocks/Sword Sheath 1.ogg.import delete mode 100644 assets/audio/OGG/SFX/Attacks/Sword Attacks Hits and Blocks/Sword Sheath 2.ogg delete mode 100644 assets/audio/OGG/SFX/Attacks/Sword Attacks Hits and Blocks/Sword Sheath 2.ogg.import delete mode 100644 assets/audio/OGG/SFX/Attacks/Sword Attacks Hits and Blocks/Sword Unsheath 1.ogg delete mode 100644 assets/audio/OGG/SFX/Attacks/Sword Attacks Hits and Blocks/Sword Unsheath 1.ogg.import delete mode 100644 assets/audio/OGG/SFX/Attacks/Sword Attacks Hits and Blocks/Sword Unsheath 2.ogg delete mode 100644 assets/audio/OGG/SFX/Attacks/Sword Attacks Hits and Blocks/Sword Unsheath 2.ogg.import delete mode 100644 assets/audio/OGG/SFX/Doors Gates and Chests/.DS_Store delete mode 100644 assets/audio/OGG/SFX/Doors Gates and Chests/Chest Close 1.ogg delete mode 100644 assets/audio/OGG/SFX/Doors Gates and Chests/Chest Close 1.ogg.import delete mode 100644 assets/audio/OGG/SFX/Doors Gates and Chests/Chest Close 2.ogg delete mode 100644 assets/audio/OGG/SFX/Doors Gates and Chests/Chest Close 2.ogg.import delete mode 100644 assets/audio/OGG/SFX/Doors Gates and Chests/Chest Open 1.ogg delete mode 100644 assets/audio/OGG/SFX/Doors Gates and Chests/Chest Open 1.ogg.import delete mode 100644 assets/audio/OGG/SFX/Doors Gates and Chests/Chest Open 2.ogg delete mode 100644 assets/audio/OGG/SFX/Doors Gates and Chests/Chest Open 2.ogg.import delete mode 100644 assets/audio/OGG/SFX/Doors Gates and Chests/Door Close 1.ogg delete mode 100644 assets/audio/OGG/SFX/Doors Gates and Chests/Door Close 1.ogg.import delete mode 100644 assets/audio/OGG/SFX/Doors Gates and Chests/Door Close 2.ogg delete mode 100644 assets/audio/OGG/SFX/Doors Gates and Chests/Door Close 2.ogg.import delete mode 100644 assets/audio/OGG/SFX/Doors Gates and Chests/Door Open 1.ogg delete mode 100644 assets/audio/OGG/SFX/Doors Gates and Chests/Door Open 1.ogg.import delete mode 100644 assets/audio/OGG/SFX/Doors Gates and Chests/Door Open 2.ogg delete mode 100644 assets/audio/OGG/SFX/Doors Gates and Chests/Door Open 2.ogg.import delete mode 100644 assets/audio/OGG/SFX/Doors Gates and Chests/Gate Close.ogg delete mode 100644 assets/audio/OGG/SFX/Doors Gates and Chests/Gate Close.ogg.import delete mode 100644 assets/audio/OGG/SFX/Doors Gates and Chests/Gate Open.ogg delete mode 100644 assets/audio/OGG/SFX/Doors Gates and Chests/Gate Open.ogg.import delete mode 100644 assets/audio/OGG/SFX/Doors Gates and Chests/Lock Unlock.ogg delete mode 100644 assets/audio/OGG/SFX/Doors Gates and Chests/Lock Unlock.ogg.import delete mode 100644 assets/audio/OGG/SFX/Doors Gates and Chests/Portcullis Gate.ogg delete mode 100644 assets/audio/OGG/SFX/Doors Gates and Chests/Portcullis Gate.ogg.import delete mode 100644 assets/audio/OGG/SFX/Footsteps/.DS_Store delete mode 100644 assets/audio/OGG/SFX/Footsteps/Dirt/.DS_Store delete mode 100644 assets/audio/OGG/SFX/Footsteps/Dirt/Dirt Chain Jump.ogg delete mode 100644 assets/audio/OGG/SFX/Footsteps/Dirt/Dirt Chain Jump.ogg.import delete mode 100644 assets/audio/OGG/SFX/Footsteps/Dirt/Dirt Chain Land.ogg delete mode 100644 assets/audio/OGG/SFX/Footsteps/Dirt/Dirt Chain Land.ogg.import delete mode 100644 assets/audio/OGG/SFX/Footsteps/Dirt/Dirt Chain Run 1.ogg delete mode 100644 assets/audio/OGG/SFX/Footsteps/Dirt/Dirt Chain Run 1.ogg.import delete mode 100644 assets/audio/OGG/SFX/Footsteps/Dirt/Dirt Chain Run 2.ogg delete mode 100644 assets/audio/OGG/SFX/Footsteps/Dirt/Dirt Chain Run 2.ogg.import delete mode 100644 assets/audio/OGG/SFX/Footsteps/Dirt/Dirt Chain Run 3.ogg delete mode 100644 assets/audio/OGG/SFX/Footsteps/Dirt/Dirt Chain Run 3.ogg.import delete mode 100644 assets/audio/OGG/SFX/Footsteps/Dirt/Dirt Chain Run 4.ogg delete mode 100644 assets/audio/OGG/SFX/Footsteps/Dirt/Dirt Chain Run 4.ogg.import delete mode 100644 assets/audio/OGG/SFX/Footsteps/Dirt/Dirt Chain Run 5.ogg delete mode 100644 assets/audio/OGG/SFX/Footsteps/Dirt/Dirt Chain Run 5.ogg.import delete mode 100644 assets/audio/OGG/SFX/Footsteps/Dirt/Dirt Chain Walk 1.ogg delete mode 100644 assets/audio/OGG/SFX/Footsteps/Dirt/Dirt Chain Walk 1.ogg.import delete mode 100644 assets/audio/OGG/SFX/Footsteps/Dirt/Dirt Chain Walk 2.ogg delete mode 100644 assets/audio/OGG/SFX/Footsteps/Dirt/Dirt Chain Walk 2.ogg.import delete mode 100644 assets/audio/OGG/SFX/Footsteps/Dirt/Dirt Chain Walk 3.ogg delete mode 100644 assets/audio/OGG/SFX/Footsteps/Dirt/Dirt Chain Walk 3.ogg.import delete mode 100644 assets/audio/OGG/SFX/Footsteps/Dirt/Dirt Chain Walk 4.ogg delete mode 100644 assets/audio/OGG/SFX/Footsteps/Dirt/Dirt Chain Walk 4.ogg.import delete mode 100644 assets/audio/OGG/SFX/Footsteps/Dirt/Dirt Chain Walk 5.ogg delete mode 100644 assets/audio/OGG/SFX/Footsteps/Dirt/Dirt Chain Walk 5.ogg.import delete mode 100644 assets/audio/OGG/SFX/Footsteps/Dirt/Dirt Jump.ogg delete mode 100644 assets/audio/OGG/SFX/Footsteps/Dirt/Dirt Jump.ogg.import delete mode 100644 assets/audio/OGG/SFX/Footsteps/Dirt/Dirt Land.ogg delete mode 100644 assets/audio/OGG/SFX/Footsteps/Dirt/Dirt Land.ogg.import delete mode 100644 assets/audio/OGG/SFX/Footsteps/Dirt/Dirt Run 1.ogg delete mode 100644 assets/audio/OGG/SFX/Footsteps/Dirt/Dirt Run 1.ogg.import delete mode 100644 assets/audio/OGG/SFX/Footsteps/Dirt/Dirt Run 2.ogg delete mode 100644 assets/audio/OGG/SFX/Footsteps/Dirt/Dirt Run 2.ogg.import delete mode 100644 assets/audio/OGG/SFX/Footsteps/Dirt/Dirt Run 3.ogg delete mode 100644 assets/audio/OGG/SFX/Footsteps/Dirt/Dirt Run 3.ogg.import delete mode 100644 assets/audio/OGG/SFX/Footsteps/Dirt/Dirt Run 4.ogg delete mode 100644 assets/audio/OGG/SFX/Footsteps/Dirt/Dirt Run 4.ogg.import delete mode 100644 assets/audio/OGG/SFX/Footsteps/Dirt/Dirt Run 5.ogg delete mode 100644 assets/audio/OGG/SFX/Footsteps/Dirt/Dirt Run 5.ogg.import delete mode 100644 assets/audio/OGG/SFX/Footsteps/Dirt/Dirt Walk 1.ogg delete mode 100644 assets/audio/OGG/SFX/Footsteps/Dirt/Dirt Walk 1.ogg.import delete mode 100644 assets/audio/OGG/SFX/Footsteps/Dirt/Dirt Walk 2.ogg delete mode 100644 assets/audio/OGG/SFX/Footsteps/Dirt/Dirt Walk 2.ogg.import delete mode 100644 assets/audio/OGG/SFX/Footsteps/Dirt/Dirt Walk 3.ogg delete mode 100644 assets/audio/OGG/SFX/Footsteps/Dirt/Dirt Walk 3.ogg.import delete mode 100644 assets/audio/OGG/SFX/Footsteps/Dirt/Dirt Walk 4.ogg delete mode 100644 assets/audio/OGG/SFX/Footsteps/Dirt/Dirt Walk 4.ogg.import delete mode 100644 assets/audio/OGG/SFX/Footsteps/Dirt/Dirt Walk 5.ogg delete mode 100644 assets/audio/OGG/SFX/Footsteps/Dirt/Dirt Walk 5.ogg.import delete mode 100644 assets/audio/OGG/SFX/Footsteps/Stone/.DS_Store delete mode 100644 assets/audio/OGG/SFX/Footsteps/Stone/Stone Chain Jump.ogg delete mode 100644 assets/audio/OGG/SFX/Footsteps/Stone/Stone Chain Jump.ogg.import delete mode 100644 assets/audio/OGG/SFX/Footsteps/Stone/Stone Chain Land.ogg delete mode 100644 assets/audio/OGG/SFX/Footsteps/Stone/Stone Chain Land.ogg.import delete mode 100644 assets/audio/OGG/SFX/Footsteps/Stone/Stone Chain Run 1.ogg delete mode 100644 assets/audio/OGG/SFX/Footsteps/Stone/Stone Chain Run 1.ogg.import delete mode 100644 assets/audio/OGG/SFX/Footsteps/Stone/Stone Chain Run 2.ogg delete mode 100644 assets/audio/OGG/SFX/Footsteps/Stone/Stone Chain Run 2.ogg.import delete mode 100644 assets/audio/OGG/SFX/Footsteps/Stone/Stone Chain Run 3.ogg delete mode 100644 assets/audio/OGG/SFX/Footsteps/Stone/Stone Chain Run 3.ogg.import delete mode 100644 assets/audio/OGG/SFX/Footsteps/Stone/Stone Chain Run 4.ogg delete mode 100644 assets/audio/OGG/SFX/Footsteps/Stone/Stone Chain Run 4.ogg.import delete mode 100644 assets/audio/OGG/SFX/Footsteps/Stone/Stone Chain Run 5.ogg delete mode 100644 assets/audio/OGG/SFX/Footsteps/Stone/Stone Chain Run 5.ogg.import delete mode 100644 assets/audio/OGG/SFX/Footsteps/Stone/Stone Chain Walk 1.ogg delete mode 100644 assets/audio/OGG/SFX/Footsteps/Stone/Stone Chain Walk 1.ogg.import delete mode 100644 assets/audio/OGG/SFX/Footsteps/Stone/Stone Chain Walk 2.ogg delete mode 100644 assets/audio/OGG/SFX/Footsteps/Stone/Stone Chain Walk 2.ogg.import delete mode 100644 assets/audio/OGG/SFX/Footsteps/Stone/Stone Chain Walk 3.ogg delete mode 100644 assets/audio/OGG/SFX/Footsteps/Stone/Stone Chain Walk 3.ogg.import delete mode 100644 assets/audio/OGG/SFX/Footsteps/Stone/Stone Chain Walk 4.ogg delete mode 100644 assets/audio/OGG/SFX/Footsteps/Stone/Stone Chain Walk 4.ogg.import delete mode 100644 assets/audio/OGG/SFX/Footsteps/Stone/Stone Chain Walk 5.ogg delete mode 100644 assets/audio/OGG/SFX/Footsteps/Stone/Stone Chain Walk 5.ogg.import delete mode 100644 assets/audio/OGG/SFX/Footsteps/Stone/Stone Jump.ogg delete mode 100644 assets/audio/OGG/SFX/Footsteps/Stone/Stone Jump.ogg.import delete mode 100644 assets/audio/OGG/SFX/Footsteps/Stone/Stone Land.ogg delete mode 100644 assets/audio/OGG/SFX/Footsteps/Stone/Stone Land.ogg.import delete mode 100644 assets/audio/OGG/SFX/Footsteps/Stone/Stone Run 1.ogg delete mode 100644 assets/audio/OGG/SFX/Footsteps/Stone/Stone Run 1.ogg.import delete mode 100644 assets/audio/OGG/SFX/Footsteps/Stone/Stone Run 2.ogg delete mode 100644 assets/audio/OGG/SFX/Footsteps/Stone/Stone Run 2.ogg.import delete mode 100644 assets/audio/OGG/SFX/Footsteps/Stone/Stone Run 3.ogg delete mode 100644 assets/audio/OGG/SFX/Footsteps/Stone/Stone Run 3.ogg.import delete mode 100644 assets/audio/OGG/SFX/Footsteps/Stone/Stone Run 4.ogg delete mode 100644 assets/audio/OGG/SFX/Footsteps/Stone/Stone Run 4.ogg.import delete mode 100644 assets/audio/OGG/SFX/Footsteps/Stone/Stone Run 5.ogg delete mode 100644 assets/audio/OGG/SFX/Footsteps/Stone/Stone Run 5.ogg.import delete mode 100644 assets/audio/OGG/SFX/Footsteps/Stone/Stone Walk 1.ogg delete mode 100644 assets/audio/OGG/SFX/Footsteps/Stone/Stone Walk 1.ogg.import delete mode 100644 assets/audio/OGG/SFX/Footsteps/Stone/Stone Walk 2.ogg delete mode 100644 assets/audio/OGG/SFX/Footsteps/Stone/Stone Walk 2.ogg.import delete mode 100644 assets/audio/OGG/SFX/Footsteps/Stone/Stone Walk 3.ogg delete mode 100644 assets/audio/OGG/SFX/Footsteps/Stone/Stone Walk 3.ogg.import delete mode 100644 assets/audio/OGG/SFX/Footsteps/Stone/Stone Walk 4.ogg delete mode 100644 assets/audio/OGG/SFX/Footsteps/Stone/Stone Walk 4.ogg.import delete mode 100644 assets/audio/OGG/SFX/Footsteps/Stone/Stone Walk 5.ogg delete mode 100644 assets/audio/OGG/SFX/Footsteps/Stone/Stone Walk 5.ogg.import delete mode 100644 assets/audio/OGG/SFX/Footsteps/Water/.DS_Store delete mode 100644 assets/audio/OGG/SFX/Footsteps/Water/Water Chain Jump.ogg delete mode 100644 assets/audio/OGG/SFX/Footsteps/Water/Water Chain Jump.ogg.import delete mode 100644 assets/audio/OGG/SFX/Footsteps/Water/Water Chain Land.ogg delete mode 100644 assets/audio/OGG/SFX/Footsteps/Water/Water Chain Land.ogg.import delete mode 100644 assets/audio/OGG/SFX/Footsteps/Water/Water Chain Run 1.ogg delete mode 100644 assets/audio/OGG/SFX/Footsteps/Water/Water Chain Run 1.ogg.import delete mode 100644 assets/audio/OGG/SFX/Footsteps/Water/Water Chain Run 2.ogg delete mode 100644 assets/audio/OGG/SFX/Footsteps/Water/Water Chain Run 2.ogg.import delete mode 100644 assets/audio/OGG/SFX/Footsteps/Water/Water Chain Run 3.ogg delete mode 100644 assets/audio/OGG/SFX/Footsteps/Water/Water Chain Run 3.ogg.import delete mode 100644 assets/audio/OGG/SFX/Footsteps/Water/Water Chain Run 4.ogg delete mode 100644 assets/audio/OGG/SFX/Footsteps/Water/Water Chain Run 4.ogg.import delete mode 100644 assets/audio/OGG/SFX/Footsteps/Water/Water Chain Run 5.ogg delete mode 100644 assets/audio/OGG/SFX/Footsteps/Water/Water Chain Run 5.ogg.import delete mode 100644 assets/audio/OGG/SFX/Footsteps/Water/Water Chain Walk 1.ogg delete mode 100644 assets/audio/OGG/SFX/Footsteps/Water/Water Chain Walk 1.ogg.import delete mode 100644 assets/audio/OGG/SFX/Footsteps/Water/Water Chain Walk 2.ogg delete mode 100644 assets/audio/OGG/SFX/Footsteps/Water/Water Chain Walk 2.ogg.import delete mode 100644 assets/audio/OGG/SFX/Footsteps/Water/Water Chain Walk 3.ogg delete mode 100644 assets/audio/OGG/SFX/Footsteps/Water/Water Chain Walk 3.ogg.import delete mode 100644 assets/audio/OGG/SFX/Footsteps/Water/Water Chain Walk 4.ogg delete mode 100644 assets/audio/OGG/SFX/Footsteps/Water/Water Chain Walk 4.ogg.import delete mode 100644 assets/audio/OGG/SFX/Footsteps/Water/Water Chain Walk 5.ogg delete mode 100644 assets/audio/OGG/SFX/Footsteps/Water/Water Chain Walk 5.ogg.import delete mode 100644 assets/audio/OGG/SFX/Footsteps/Water/Water Jump.ogg delete mode 100644 assets/audio/OGG/SFX/Footsteps/Water/Water Jump.ogg.import delete mode 100644 assets/audio/OGG/SFX/Footsteps/Water/Water Land.ogg delete mode 100644 assets/audio/OGG/SFX/Footsteps/Water/Water Land.ogg.import delete mode 100644 assets/audio/OGG/SFX/Footsteps/Water/Water Run 1.ogg delete mode 100644 assets/audio/OGG/SFX/Footsteps/Water/Water Run 1.ogg.import delete mode 100644 assets/audio/OGG/SFX/Footsteps/Water/Water Run 2.ogg delete mode 100644 assets/audio/OGG/SFX/Footsteps/Water/Water Run 2.ogg.import delete mode 100644 assets/audio/OGG/SFX/Footsteps/Water/Water Run 3.ogg delete mode 100644 assets/audio/OGG/SFX/Footsteps/Water/Water Run 3.ogg.import delete mode 100644 assets/audio/OGG/SFX/Footsteps/Water/Water Run 4.ogg delete mode 100644 assets/audio/OGG/SFX/Footsteps/Water/Water Run 4.ogg.import delete mode 100644 assets/audio/OGG/SFX/Footsteps/Water/Water Run 5.ogg delete mode 100644 assets/audio/OGG/SFX/Footsteps/Water/Water Run 5.ogg.import delete mode 100644 assets/audio/OGG/SFX/Footsteps/Water/Water Walk 1.ogg delete mode 100644 assets/audio/OGG/SFX/Footsteps/Water/Water Walk 1.ogg.import delete mode 100644 assets/audio/OGG/SFX/Footsteps/Water/Water Walk 2.ogg delete mode 100644 assets/audio/OGG/SFX/Footsteps/Water/Water Walk 2.ogg.import delete mode 100644 assets/audio/OGG/SFX/Footsteps/Water/Water Walk 3.ogg delete mode 100644 assets/audio/OGG/SFX/Footsteps/Water/Water Walk 3.ogg.import delete mode 100644 assets/audio/OGG/SFX/Footsteps/Water/Water Walk 4.ogg delete mode 100644 assets/audio/OGG/SFX/Footsteps/Water/Water Walk 4.ogg.import delete mode 100644 assets/audio/OGG/SFX/Footsteps/Water/Water Walk 5.ogg delete mode 100644 assets/audio/OGG/SFX/Footsteps/Water/Water Walk 5.ogg.import delete mode 100644 assets/audio/OGG/SFX/Footsteps/Wood/.DS_Store delete mode 100644 assets/audio/OGG/SFX/Footsteps/Wood/Wood Chain Jump.ogg delete mode 100644 assets/audio/OGG/SFX/Footsteps/Wood/Wood Chain Jump.ogg.import delete mode 100644 assets/audio/OGG/SFX/Footsteps/Wood/Wood Chain Land.ogg delete mode 100644 assets/audio/OGG/SFX/Footsteps/Wood/Wood Chain Land.ogg.import delete mode 100644 assets/audio/OGG/SFX/Footsteps/Wood/Wood Chain Run 1.ogg delete mode 100644 assets/audio/OGG/SFX/Footsteps/Wood/Wood Chain Run 1.ogg.import delete mode 100644 assets/audio/OGG/SFX/Footsteps/Wood/Wood Chain Run 2.ogg delete mode 100644 assets/audio/OGG/SFX/Footsteps/Wood/Wood Chain Run 2.ogg.import delete mode 100644 assets/audio/OGG/SFX/Footsteps/Wood/Wood Chain Run 3.ogg delete mode 100644 assets/audio/OGG/SFX/Footsteps/Wood/Wood Chain Run 3.ogg.import delete mode 100644 assets/audio/OGG/SFX/Footsteps/Wood/Wood Chain Run 4.ogg delete mode 100644 assets/audio/OGG/SFX/Footsteps/Wood/Wood Chain Run 4.ogg.import delete mode 100644 assets/audio/OGG/SFX/Footsteps/Wood/Wood Chain Run 5.ogg delete mode 100644 assets/audio/OGG/SFX/Footsteps/Wood/Wood Chain Run 5.ogg.import delete mode 100644 assets/audio/OGG/SFX/Footsteps/Wood/Wood Chain Walk 1.ogg delete mode 100644 assets/audio/OGG/SFX/Footsteps/Wood/Wood Chain Walk 1.ogg.import delete mode 100644 assets/audio/OGG/SFX/Footsteps/Wood/Wood Chain Walk 2.ogg delete mode 100644 assets/audio/OGG/SFX/Footsteps/Wood/Wood Chain Walk 2.ogg.import delete mode 100644 assets/audio/OGG/SFX/Footsteps/Wood/Wood Chain Walk 3.ogg delete mode 100644 assets/audio/OGG/SFX/Footsteps/Wood/Wood Chain Walk 3.ogg.import delete mode 100644 assets/audio/OGG/SFX/Footsteps/Wood/Wood Chain Walk 4.ogg delete mode 100644 assets/audio/OGG/SFX/Footsteps/Wood/Wood Chain Walk 4.ogg.import delete mode 100644 assets/audio/OGG/SFX/Footsteps/Wood/Wood Chain Walk 5.ogg delete mode 100644 assets/audio/OGG/SFX/Footsteps/Wood/Wood Chain Walk 5.ogg.import delete mode 100644 assets/audio/OGG/SFX/Footsteps/Wood/Wood Jump.ogg delete mode 100644 assets/audio/OGG/SFX/Footsteps/Wood/Wood Jump.ogg.import delete mode 100644 assets/audio/OGG/SFX/Footsteps/Wood/Wood Land.ogg delete mode 100644 assets/audio/OGG/SFX/Footsteps/Wood/Wood Land.ogg.import delete mode 100644 assets/audio/OGG/SFX/Footsteps/Wood/Wood Run 1.ogg delete mode 100644 assets/audio/OGG/SFX/Footsteps/Wood/Wood Run 1.ogg.import delete mode 100644 assets/audio/OGG/SFX/Footsteps/Wood/Wood Run 2.ogg delete mode 100644 assets/audio/OGG/SFX/Footsteps/Wood/Wood Run 2.ogg.import delete mode 100644 assets/audio/OGG/SFX/Footsteps/Wood/Wood Run 3.ogg delete mode 100644 assets/audio/OGG/SFX/Footsteps/Wood/Wood Run 3.ogg.import delete mode 100644 assets/audio/OGG/SFX/Footsteps/Wood/Wood Run 4.ogg delete mode 100644 assets/audio/OGG/SFX/Footsteps/Wood/Wood Run 4.ogg.import delete mode 100644 assets/audio/OGG/SFX/Footsteps/Wood/Wood Run 5.ogg delete mode 100644 assets/audio/OGG/SFX/Footsteps/Wood/Wood Run 5.ogg.import delete mode 100644 assets/audio/OGG/SFX/Footsteps/Wood/Wood Walk 1.ogg delete mode 100644 assets/audio/OGG/SFX/Footsteps/Wood/Wood Walk 1.ogg.import delete mode 100644 assets/audio/OGG/SFX/Footsteps/Wood/Wood Walk 2.ogg delete mode 100644 assets/audio/OGG/SFX/Footsteps/Wood/Wood Walk 2.ogg.import delete mode 100644 assets/audio/OGG/SFX/Footsteps/Wood/Wood Walk 3.ogg delete mode 100644 assets/audio/OGG/SFX/Footsteps/Wood/Wood Walk 3.ogg.import delete mode 100644 assets/audio/OGG/SFX/Footsteps/Wood/Wood Walk 4.ogg delete mode 100644 assets/audio/OGG/SFX/Footsteps/Wood/Wood Walk 4.ogg.import delete mode 100644 assets/audio/OGG/SFX/Footsteps/Wood/Wood Walk 5.ogg delete mode 100644 assets/audio/OGG/SFX/Footsteps/Wood/Wood Walk 5.ogg.import delete mode 100644 assets/audio/OGG/SFX/Spells/.DS_Store delete mode 100644 assets/audio/OGG/SFX/Spells/Fireball 1.ogg delete mode 100644 assets/audio/OGG/SFX/Spells/Fireball 1.ogg.import delete mode 100644 assets/audio/OGG/SFX/Spells/Fireball 2.ogg delete mode 100644 assets/audio/OGG/SFX/Spells/Fireball 2.ogg.import delete mode 100644 assets/audio/OGG/SFX/Spells/Fireball 3.ogg delete mode 100644 assets/audio/OGG/SFX/Spells/Fireball 3.ogg.import delete mode 100644 assets/audio/OGG/SFX/Spells/Firebuff 1.ogg delete mode 100644 assets/audio/OGG/SFX/Spells/Firebuff 1.ogg.import delete mode 100644 assets/audio/OGG/SFX/Spells/Firebuff 2.ogg delete mode 100644 assets/audio/OGG/SFX/Spells/Firebuff 2.ogg.import delete mode 100644 assets/audio/OGG/SFX/Spells/Firespray 1.ogg delete mode 100644 assets/audio/OGG/SFX/Spells/Firespray 1.ogg.import delete mode 100644 assets/audio/OGG/SFX/Spells/Firespray 2.ogg delete mode 100644 assets/audio/OGG/SFX/Spells/Firespray 2.ogg.import delete mode 100644 assets/audio/OGG/SFX/Spells/Ice Barrage 1.ogg delete mode 100644 assets/audio/OGG/SFX/Spells/Ice Barrage 1.ogg.import delete mode 100644 assets/audio/OGG/SFX/Spells/Ice Barrage 2.ogg delete mode 100644 assets/audio/OGG/SFX/Spells/Ice Barrage 2.ogg.import delete mode 100644 assets/audio/OGG/SFX/Spells/Ice Freeze 1.ogg delete mode 100644 assets/audio/OGG/SFX/Spells/Ice Freeze 1.ogg.import delete mode 100644 assets/audio/OGG/SFX/Spells/Ice Freeze 2.ogg delete mode 100644 assets/audio/OGG/SFX/Spells/Ice Freeze 2.ogg.import delete mode 100644 assets/audio/OGG/SFX/Spells/Ice Throw 1.ogg delete mode 100644 assets/audio/OGG/SFX/Spells/Ice Throw 1.ogg.import delete mode 100644 assets/audio/OGG/SFX/Spells/Ice Throw 2.ogg delete mode 100644 assets/audio/OGG/SFX/Spells/Ice Throw 2.ogg.import delete mode 100644 assets/audio/OGG/SFX/Spells/Ice Wall 1.ogg delete mode 100644 assets/audio/OGG/SFX/Spells/Ice Wall 1.ogg.import delete mode 100644 assets/audio/OGG/SFX/Spells/Ice Wall 2.ogg delete mode 100644 assets/audio/OGG/SFX/Spells/Ice Wall 2.ogg.import delete mode 100644 assets/audio/OGG/SFX/Spells/Rock Meteor Swarm 1.ogg delete mode 100644 assets/audio/OGG/SFX/Spells/Rock Meteor Swarm 1.ogg.import delete mode 100644 assets/audio/OGG/SFX/Spells/Rock Meteor Swarm 2.ogg delete mode 100644 assets/audio/OGG/SFX/Spells/Rock Meteor Swarm 2.ogg.import delete mode 100644 assets/audio/OGG/SFX/Spells/Rock Meteor Throw 1.ogg delete mode 100644 assets/audio/OGG/SFX/Spells/Rock Meteor Throw 1.ogg.import delete mode 100644 assets/audio/OGG/SFX/Spells/Rock Meteor Throw 2.ogg delete mode 100644 assets/audio/OGG/SFX/Spells/Rock Meteor Throw 2.ogg.import delete mode 100644 assets/audio/OGG/SFX/Spells/Rock Wall 1.ogg delete mode 100644 assets/audio/OGG/SFX/Spells/Rock Wall 1.ogg.import delete mode 100644 assets/audio/OGG/SFX/Spells/Rock Wall 2.ogg delete mode 100644 assets/audio/OGG/SFX/Spells/Rock Wall 2.ogg.import delete mode 100644 assets/audio/OGG/SFX/Spells/Spell Impact 1.ogg delete mode 100644 assets/audio/OGG/SFX/Spells/Spell Impact 1.ogg.import delete mode 100644 assets/audio/OGG/SFX/Spells/Spell Impact 2.ogg delete mode 100644 assets/audio/OGG/SFX/Spells/Spell Impact 2.ogg.import delete mode 100644 assets/audio/OGG/SFX/Spells/Spell Impact 3.ogg delete mode 100644 assets/audio/OGG/SFX/Spells/Spell Impact 3.ogg.import delete mode 100644 assets/audio/OGG/SFX/Spells/Waterspray 1.ogg delete mode 100644 assets/audio/OGG/SFX/Spells/Waterspray 1.ogg.import delete mode 100644 assets/audio/OGG/SFX/Spells/Waterspray 2.ogg delete mode 100644 assets/audio/OGG/SFX/Spells/Waterspray 2.ogg.import delete mode 100644 assets/audio/OGG/SFX/Spells/Wave Attack 1.ogg delete mode 100644 assets/audio/OGG/SFX/Spells/Wave Attack 1.ogg.import delete mode 100644 assets/audio/OGG/SFX/Spells/Wave Attack 2.ogg delete mode 100644 assets/audio/OGG/SFX/Spells/Wave Attack 2.ogg.import delete mode 100644 assets/audio/OGG/SFX/Torch/.DS_Store delete mode 100644 assets/audio/OGG/SFX/Torch/Light Torch 1.ogg delete mode 100644 assets/audio/OGG/SFX/Torch/Light Torch 1.ogg.import delete mode 100644 assets/audio/OGG/SFX/Torch/Light Torch 2.ogg delete mode 100644 assets/audio/OGG/SFX/Torch/Light Torch 2.ogg.import delete mode 100644 assets/audio/OGG/SFX/Torch/Light Torch with Starting Loop 1.ogg delete mode 100644 assets/audio/OGG/SFX/Torch/Light Torch with Starting Loop 1.ogg.import delete mode 100644 assets/audio/OGG/SFX/Torch/Light Torch with Starting Loop 2.ogg delete mode 100644 assets/audio/OGG/SFX/Torch/Light Torch with Starting Loop 2.ogg.import delete mode 100644 assets/audio/OGG/SFX/Torch/Torch Attack Strike 1.ogg delete mode 100644 assets/audio/OGG/SFX/Torch/Torch Attack Strike 1.ogg.import delete mode 100644 assets/audio/OGG/SFX/Torch/Torch Attack Strike 2.ogg delete mode 100644 assets/audio/OGG/SFX/Torch/Torch Attack Strike 2.ogg.import delete mode 100644 assets/audio/OGG/SFX/Torch/Torch Impact 1.ogg delete mode 100644 assets/audio/OGG/SFX/Torch/Torch Impact 1.ogg.import delete mode 100644 assets/audio/OGG/SFX/Torch/Torch Impact 2.ogg delete mode 100644 assets/audio/OGG/SFX/Torch/Torch Impact 2.ogg.import delete mode 100644 assets/audio/OGG/SFX/Torch/Torch Loop.ogg delete mode 100644 assets/audio/OGG/SFX/Torch/Torch Loop.ogg.import delete mode 100644 assets/audio/OGG/SFX/Waterfalls Rivers and Streams/.DS_Store delete mode 100644 assets/audio/OGG/SFX/Waterfalls Rivers and Streams/River Loop.ogg delete mode 100644 assets/audio/OGG/SFX/Waterfalls Rivers and Streams/River Loop.ogg.import delete mode 100644 assets/audio/OGG/SFX/Waterfalls Rivers and Streams/River Stream Loop.ogg delete mode 100644 assets/audio/OGG/SFX/Waterfalls Rivers and Streams/River Stream Loop.ogg.import delete mode 100644 assets/audio/OGG/SFX/Waterfalls Rivers and Streams/Waterfall Loop.ogg delete mode 100644 assets/audio/OGG/SFX/Waterfalls Rivers and Streams/Waterfall Loop.ogg.import create mode 100644 export_presets.cfg create mode 100644 scenes/simulator.tscn delete mode 100644 scripts/sim.gd delete mode 100644 scripts/sim.gd.uid create mode 100644 scripts/sim_cached.gd create mode 100644 scripts/sim_cached.gd.uid diff --git a/assets/audio/OGG/BGS Loops/.DS_Store b/assets/audio/OGG/BGS Loops/.DS_Store deleted file mode 100644 index 46e869f79554b6d8f5903e9406e34fcf8f9f3095..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6148 zcmeHK!A`?441HlmOn}gi9P^ofla(KcPYiw{FIz8fz@eMO=Q@%{58=N|2vrVv& z{r49bC)vI$XTTY72AqLWFu*rkWO}9Oy))npI0HWn$o&x61WUtCF=Y%7*i$&se*_XC-Z=w*z`z%q`aCND diff --git a/assets/audio/OGG/BGS Loops/Beach/Beach Rain.ogg b/assets/audio/OGG/BGS Loops/Beach/Beach Rain.ogg deleted file mode 100644 index 3b7236e..0000000 --- a/assets/audio/OGG/BGS Loops/Beach/Beach Rain.ogg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:a450a07a0377581c6a6a5d0aea55b0573e420f7d61e5bab8c9cb537a98e7d702 -size 3902838 diff --git a/assets/audio/OGG/BGS Loops/Beach/Beach Rain.ogg.import b/assets/audio/OGG/BGS Loops/Beach/Beach Rain.ogg.import deleted file mode 100644 index 59ab6cc..0000000 --- a/assets/audio/OGG/BGS Loops/Beach/Beach Rain.ogg.import +++ /dev/null @@ -1,19 +0,0 @@ -[remap] - -importer="oggvorbisstr" -type="AudioStreamOggVorbis" -uid="uid://b2p065yn3fkmr" -path="res://.godot/imported/Beach Rain.ogg-3cf3d2bdaf0006b574b2382b35f099b1.oggvorbisstr" - -[deps] - -source_file="res://assets/audio/OGG/BGS Loops/Beach/Beach Rain.ogg" -dest_files=["res://.godot/imported/Beach Rain.ogg-3cf3d2bdaf0006b574b2382b35f099b1.oggvorbisstr"] - -[params] - -loop=false -loop_offset=0 -bpm=0 -beat_count=0 -bar_beats=4 diff --git a/assets/audio/OGG/BGS Loops/Beach/Beach Storm.ogg b/assets/audio/OGG/BGS Loops/Beach/Beach Storm.ogg deleted file mode 100644 index fd2f8e2..0000000 --- a/assets/audio/OGG/BGS Loops/Beach/Beach Storm.ogg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:c1592a094af4cd83ff3a8b00ed5cb56b86771c0eb2db575b6416a8dbc80c56f4 -size 3894012 diff --git a/assets/audio/OGG/BGS Loops/Beach/Beach Storm.ogg.import b/assets/audio/OGG/BGS Loops/Beach/Beach Storm.ogg.import deleted file mode 100644 index 8b9c7f5..0000000 --- a/assets/audio/OGG/BGS Loops/Beach/Beach Storm.ogg.import +++ /dev/null @@ -1,19 +0,0 @@ -[remap] - -importer="oggvorbisstr" -type="AudioStreamOggVorbis" -uid="uid://cx7c627trpbkn" -path="res://.godot/imported/Beach Storm.ogg-2fdb485982ff8c57097c232bb37d4cfd.oggvorbisstr" - -[deps] - -source_file="res://assets/audio/OGG/BGS Loops/Beach/Beach Storm.ogg" -dest_files=["res://.godot/imported/Beach Storm.ogg-2fdb485982ff8c57097c232bb37d4cfd.oggvorbisstr"] - -[params] - -loop=false -loop_offset=0 -bpm=0 -beat_count=0 -bar_beats=4 diff --git a/assets/audio/OGG/BGS Loops/Beach/Beach.ogg b/assets/audio/OGG/BGS Loops/Beach/Beach.ogg deleted file mode 100644 index 12cf916..0000000 --- a/assets/audio/OGG/BGS Loops/Beach/Beach.ogg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:415f18577213bb89c0371ee384ef94a17be46aa72966baca38ec257263823714 -size 3384984 diff --git a/assets/audio/OGG/BGS Loops/Beach/Beach.ogg.import b/assets/audio/OGG/BGS Loops/Beach/Beach.ogg.import deleted file mode 100644 index de10fcc..0000000 --- a/assets/audio/OGG/BGS Loops/Beach/Beach.ogg.import +++ /dev/null @@ -1,19 +0,0 @@ -[remap] - -importer="oggvorbisstr" -type="AudioStreamOggVorbis" -uid="uid://bijfvt28virsw" -path="res://.godot/imported/Beach.ogg-f2dcd786f77ce9a9578991b83b60178f.oggvorbisstr" - -[deps] - -source_file="res://assets/audio/OGG/BGS Loops/Beach/Beach.ogg" -dest_files=["res://.godot/imported/Beach.ogg-f2dcd786f77ce9a9578991b83b60178f.oggvorbisstr"] - -[params] - -loop=false -loop_offset=0 -bpm=0 -beat_count=0 -bar_beats=4 diff --git a/assets/audio/OGG/BGS Loops/Cave/Cave Rain.ogg b/assets/audio/OGG/BGS Loops/Cave/Cave Rain.ogg deleted file mode 100644 index 2197092..0000000 --- a/assets/audio/OGG/BGS Loops/Cave/Cave Rain.ogg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:001ca52537bd2c201bee36e8db88e95e9887ba52b3237f5a3bc53eae5c4c4058 -size 3280736 diff --git a/assets/audio/OGG/BGS Loops/Cave/Cave Rain.ogg.import b/assets/audio/OGG/BGS Loops/Cave/Cave Rain.ogg.import deleted file mode 100644 index f95e91b..0000000 --- a/assets/audio/OGG/BGS Loops/Cave/Cave Rain.ogg.import +++ /dev/null @@ -1,19 +0,0 @@ -[remap] - -importer="oggvorbisstr" -type="AudioStreamOggVorbis" -uid="uid://mca3roqkbxtm" -path="res://.godot/imported/Cave Rain.ogg-7de26e9b92079c104b598e40099d4944.oggvorbisstr" - -[deps] - -source_file="res://assets/audio/OGG/BGS Loops/Cave/Cave Rain.ogg" -dest_files=["res://.godot/imported/Cave Rain.ogg-7de26e9b92079c104b598e40099d4944.oggvorbisstr"] - -[params] - -loop=false -loop_offset=0 -bpm=0 -beat_count=0 -bar_beats=4 diff --git a/assets/audio/OGG/BGS Loops/Cave/Cave Storm.ogg b/assets/audio/OGG/BGS Loops/Cave/Cave Storm.ogg deleted file mode 100644 index c20621d..0000000 --- a/assets/audio/OGG/BGS Loops/Cave/Cave Storm.ogg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:fbc213dc4f219e85eb9de4d106c7f932b8c66cae696a87e87b4f4087168d536f -size 3271491 diff --git a/assets/audio/OGG/BGS Loops/Cave/Cave Storm.ogg.import b/assets/audio/OGG/BGS Loops/Cave/Cave Storm.ogg.import deleted file mode 100644 index f20eba2..0000000 --- a/assets/audio/OGG/BGS Loops/Cave/Cave Storm.ogg.import +++ /dev/null @@ -1,19 +0,0 @@ -[remap] - -importer="oggvorbisstr" -type="AudioStreamOggVorbis" -uid="uid://dtnx4hcisp70a" -path="res://.godot/imported/Cave Storm.ogg-560a3a93a977971b3a617b7c44e9ebf5.oggvorbisstr" - -[deps] - -source_file="res://assets/audio/OGG/BGS Loops/Cave/Cave Storm.ogg" -dest_files=["res://.godot/imported/Cave Storm.ogg-560a3a93a977971b3a617b7c44e9ebf5.oggvorbisstr"] - -[params] - -loop=false -loop_offset=0 -bpm=0 -beat_count=0 -bar_beats=4 diff --git a/assets/audio/OGG/BGS Loops/Cave/Cave.ogg b/assets/audio/OGG/BGS Loops/Cave/Cave.ogg deleted file mode 100644 index 952228a..0000000 --- a/assets/audio/OGG/BGS Loops/Cave/Cave.ogg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:a03cd7cb1ec2de5d55cd55fb365dc4a3b6ed1373c069d4e2f6277e3b38764afd -size 3266684 diff --git a/assets/audio/OGG/BGS Loops/Cave/Cave.ogg.import b/assets/audio/OGG/BGS Loops/Cave/Cave.ogg.import deleted file mode 100644 index 7c85e2a..0000000 --- a/assets/audio/OGG/BGS Loops/Cave/Cave.ogg.import +++ /dev/null @@ -1,19 +0,0 @@ -[remap] - -importer="oggvorbisstr" -type="AudioStreamOggVorbis" -uid="uid://bvm0enafi4lid" -path="res://.godot/imported/Cave.ogg-ed24212a08ff0a145ad3a0f800f84462.oggvorbisstr" - -[deps] - -source_file="res://assets/audio/OGG/BGS Loops/Cave/Cave.ogg" -dest_files=["res://.godot/imported/Cave.ogg-ed24212a08ff0a145ad3a0f800f84462.oggvorbisstr"] - -[params] - -loop=false -loop_offset=0 -bpm=0 -beat_count=0 -bar_beats=4 diff --git a/assets/audio/OGG/BGS Loops/Forest Day/Forest Day Rain.ogg b/assets/audio/OGG/BGS Loops/Forest Day/Forest Day Rain.ogg deleted file mode 100644 index 837def6..0000000 --- a/assets/audio/OGG/BGS Loops/Forest Day/Forest Day Rain.ogg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:4984427563ec241d7fc8b8fb659476d0eaf8e1482229f3f3d12eefd0255a3541 -size 4309791 diff --git a/assets/audio/OGG/BGS Loops/Forest Day/Forest Day Rain.ogg.import b/assets/audio/OGG/BGS Loops/Forest Day/Forest Day Rain.ogg.import deleted file mode 100644 index 3be0f69..0000000 --- a/assets/audio/OGG/BGS Loops/Forest Day/Forest Day Rain.ogg.import +++ /dev/null @@ -1,19 +0,0 @@ -[remap] - -importer="oggvorbisstr" -type="AudioStreamOggVorbis" -uid="uid://bchjcw8ad4j1l" -path="res://.godot/imported/Forest Day Rain.ogg-b97d927820281ac58a1dede8f943ea87.oggvorbisstr" - -[deps] - -source_file="res://assets/audio/OGG/BGS Loops/Forest Day/Forest Day Rain.ogg" -dest_files=["res://.godot/imported/Forest Day Rain.ogg-b97d927820281ac58a1dede8f943ea87.oggvorbisstr"] - -[params] - -loop=false -loop_offset=0 -bpm=0 -beat_count=0 -bar_beats=4 diff --git a/assets/audio/OGG/BGS Loops/Forest Day/Forest Day Storm.ogg b/assets/audio/OGG/BGS Loops/Forest Day/Forest Day Storm.ogg deleted file mode 100644 index 681ff2b..0000000 --- a/assets/audio/OGG/BGS Loops/Forest Day/Forest Day Storm.ogg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:13b8de262284ddcea849d7729619e8feb2d7e620c62567d47415d5a8a821e21a -size 4280252 diff --git a/assets/audio/OGG/BGS Loops/Forest Day/Forest Day Storm.ogg.import b/assets/audio/OGG/BGS Loops/Forest Day/Forest Day Storm.ogg.import deleted file mode 100644 index 077fc2a..0000000 --- a/assets/audio/OGG/BGS Loops/Forest Day/Forest Day Storm.ogg.import +++ /dev/null @@ -1,19 +0,0 @@ -[remap] - -importer="oggvorbisstr" -type="AudioStreamOggVorbis" -uid="uid://jwky8uulu0lq" -path="res://.godot/imported/Forest Day Storm.ogg-9a27d5227196ae6da4d7634c836182bf.oggvorbisstr" - -[deps] - -source_file="res://assets/audio/OGG/BGS Loops/Forest Day/Forest Day Storm.ogg" -dest_files=["res://.godot/imported/Forest Day Storm.ogg-9a27d5227196ae6da4d7634c836182bf.oggvorbisstr"] - -[params] - -loop=false -loop_offset=0 -bpm=0 -beat_count=0 -bar_beats=4 diff --git a/assets/audio/OGG/BGS Loops/Forest Day/Forest Day.ogg b/assets/audio/OGG/BGS Loops/Forest Day/Forest Day.ogg deleted file mode 100644 index fada86b..0000000 --- a/assets/audio/OGG/BGS Loops/Forest Day/Forest Day.ogg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:6863e5d54bae219a864411483525366a7a2fd597b9989f4343f9d80bb5fcfc11 -size 3507282 diff --git a/assets/audio/OGG/BGS Loops/Forest Day/Forest Day.ogg.import b/assets/audio/OGG/BGS Loops/Forest Day/Forest Day.ogg.import deleted file mode 100644 index 9cfcc2f..0000000 --- a/assets/audio/OGG/BGS Loops/Forest Day/Forest Day.ogg.import +++ /dev/null @@ -1,19 +0,0 @@ -[remap] - -importer="oggvorbisstr" -type="AudioStreamOggVorbis" -uid="uid://qm25npqyo8kf" -path="res://.godot/imported/Forest Day.ogg-b4002b595fbe507830a5252141d8e24f.oggvorbisstr" - -[deps] - -source_file="res://assets/audio/OGG/BGS Loops/Forest Day/Forest Day.ogg" -dest_files=["res://.godot/imported/Forest Day.ogg-b4002b595fbe507830a5252141d8e24f.oggvorbisstr"] - -[params] - -loop=false -loop_offset=0 -bpm=0 -beat_count=0 -bar_beats=4 diff --git a/assets/audio/OGG/BGS Loops/Forest Night/Forest Night Rain.ogg b/assets/audio/OGG/BGS Loops/Forest Night/Forest Night Rain.ogg deleted file mode 100644 index 0d6e1e7..0000000 --- a/assets/audio/OGG/BGS Loops/Forest Night/Forest Night Rain.ogg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:909e5dc159ffdd850b5500d67a1f71278d9b456db82b272790eef91f1f4e6221 -size 4018361 diff --git a/assets/audio/OGG/BGS Loops/Forest Night/Forest Night Rain.ogg.import b/assets/audio/OGG/BGS Loops/Forest Night/Forest Night Rain.ogg.import deleted file mode 100644 index 8f9f08a..0000000 --- a/assets/audio/OGG/BGS Loops/Forest Night/Forest Night Rain.ogg.import +++ /dev/null @@ -1,19 +0,0 @@ -[remap] - -importer="oggvorbisstr" -type="AudioStreamOggVorbis" -uid="uid://bx64pv2382ffj" -path="res://.godot/imported/Forest Night Rain.ogg-3a6b589e255a5faf0c4c9a2d16b8deff.oggvorbisstr" - -[deps] - -source_file="res://assets/audio/OGG/BGS Loops/Forest Night/Forest Night Rain.ogg" -dest_files=["res://.godot/imported/Forest Night Rain.ogg-3a6b589e255a5faf0c4c9a2d16b8deff.oggvorbisstr"] - -[params] - -loop=false -loop_offset=0 -bpm=0 -beat_count=0 -bar_beats=4 diff --git a/assets/audio/OGG/BGS Loops/Forest Night/Forest Night Storm.ogg b/assets/audio/OGG/BGS Loops/Forest Night/Forest Night Storm.ogg deleted file mode 100644 index 991ec40..0000000 --- a/assets/audio/OGG/BGS Loops/Forest Night/Forest Night Storm.ogg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:7bd9022eb4a19b09b03ed8969a1c2714f1dd1d083b00ac8aad0ebffa361d2a83 -size 4002071 diff --git a/assets/audio/OGG/BGS Loops/Forest Night/Forest Night Storm.ogg.import b/assets/audio/OGG/BGS Loops/Forest Night/Forest Night Storm.ogg.import deleted file mode 100644 index 82dd967..0000000 --- a/assets/audio/OGG/BGS Loops/Forest Night/Forest Night Storm.ogg.import +++ /dev/null @@ -1,19 +0,0 @@ -[remap] - -importer="oggvorbisstr" -type="AudioStreamOggVorbis" -uid="uid://jse6gk4ude5h" -path="res://.godot/imported/Forest Night Storm.ogg-4beb0cffaf29ba3669f719811075c821.oggvorbisstr" - -[deps] - -source_file="res://assets/audio/OGG/BGS Loops/Forest Night/Forest Night Storm.ogg" -dest_files=["res://.godot/imported/Forest Night Storm.ogg-4beb0cffaf29ba3669f719811075c821.oggvorbisstr"] - -[params] - -loop=false -loop_offset=0 -bpm=0 -beat_count=0 -bar_beats=4 diff --git a/assets/audio/OGG/BGS Loops/Forest Night/Forest Night.ogg b/assets/audio/OGG/BGS Loops/Forest Night/Forest Night.ogg deleted file mode 100644 index f46620b..0000000 --- a/assets/audio/OGG/BGS Loops/Forest Night/Forest Night.ogg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:bd81628c98eecfbc99bdbf74f7bd9d78fec5015e7b0bc01139ac932765280978 -size 3733602 diff --git a/assets/audio/OGG/BGS Loops/Forest Night/Forest Night.ogg.import b/assets/audio/OGG/BGS Loops/Forest Night/Forest Night.ogg.import deleted file mode 100644 index 63ec8b8..0000000 --- a/assets/audio/OGG/BGS Loops/Forest Night/Forest Night.ogg.import +++ /dev/null @@ -1,19 +0,0 @@ -[remap] - -importer="oggvorbisstr" -type="AudioStreamOggVorbis" -uid="uid://btnkhrkfyrud0" -path="res://.godot/imported/Forest Night.ogg-ef10081668908103a1046b8872995b12.oggvorbisstr" - -[deps] - -source_file="res://assets/audio/OGG/BGS Loops/Forest Night/Forest Night.ogg" -dest_files=["res://.godot/imported/Forest Night.ogg-ef10081668908103a1046b8872995b12.oggvorbisstr"] - -[params] - -loop=false -loop_offset=0 -bpm=0 -beat_count=0 -bar_beats=4 diff --git a/assets/audio/OGG/BGS Loops/Interior Day/Inside Day Rain.ogg b/assets/audio/OGG/BGS Loops/Interior Day/Inside Day Rain.ogg deleted file mode 100644 index c57159f..0000000 --- a/assets/audio/OGG/BGS Loops/Interior Day/Inside Day Rain.ogg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:24f312a28c8520a3318f4b7e800558880971c95e619923aa49956f7d1908852a -size 3548606 diff --git a/assets/audio/OGG/BGS Loops/Interior Day/Inside Day Rain.ogg.import b/assets/audio/OGG/BGS Loops/Interior Day/Inside Day Rain.ogg.import deleted file mode 100644 index 6f711b4..0000000 --- a/assets/audio/OGG/BGS Loops/Interior Day/Inside Day Rain.ogg.import +++ /dev/null @@ -1,19 +0,0 @@ -[remap] - -importer="oggvorbisstr" -type="AudioStreamOggVorbis" -uid="uid://ct5njaa82imlk" -path="res://.godot/imported/Inside Day Rain.ogg-7e6acc06231cac5a8bcecea10b3dd300.oggvorbisstr" - -[deps] - -source_file="res://assets/audio/OGG/BGS Loops/Interior Day/Inside Day Rain.ogg" -dest_files=["res://.godot/imported/Inside Day Rain.ogg-7e6acc06231cac5a8bcecea10b3dd300.oggvorbisstr"] - -[params] - -loop=false -loop_offset=0 -bpm=0 -beat_count=0 -bar_beats=4 diff --git a/assets/audio/OGG/BGS Loops/Interior Day/Inside Day Storm.ogg b/assets/audio/OGG/BGS Loops/Interior Day/Inside Day Storm.ogg deleted file mode 100644 index 60c8cde..0000000 --- a/assets/audio/OGG/BGS Loops/Interior Day/Inside Day Storm.ogg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:d3a01af1bf52ae7212748ef1f71671b40ab0bb05e9d07c6a29400a37c3b659ce -size 3496576 diff --git a/assets/audio/OGG/BGS Loops/Interior Day/Inside Day Storm.ogg.import b/assets/audio/OGG/BGS Loops/Interior Day/Inside Day Storm.ogg.import deleted file mode 100644 index 2acc2b3..0000000 --- a/assets/audio/OGG/BGS Loops/Interior Day/Inside Day Storm.ogg.import +++ /dev/null @@ -1,19 +0,0 @@ -[remap] - -importer="oggvorbisstr" -type="AudioStreamOggVorbis" -uid="uid://gown1k3nl6rg" -path="res://.godot/imported/Inside Day Storm.ogg-0faca45ef8edd5ea1ece0e8c4406ac5e.oggvorbisstr" - -[deps] - -source_file="res://assets/audio/OGG/BGS Loops/Interior Day/Inside Day Storm.ogg" -dest_files=["res://.godot/imported/Inside Day Storm.ogg-0faca45ef8edd5ea1ece0e8c4406ac5e.oggvorbisstr"] - -[params] - -loop=false -loop_offset=0 -bpm=0 -beat_count=0 -bar_beats=4 diff --git a/assets/audio/OGG/BGS Loops/Interior Day/Inside Day.ogg b/assets/audio/OGG/BGS Loops/Interior Day/Inside Day.ogg deleted file mode 100644 index 73cbd4a..0000000 --- a/assets/audio/OGG/BGS Loops/Interior Day/Inside Day.ogg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:09cd1ee43b4bd33591f761e2b3f21ca06578a2dabe59dcd54a06844de4ceec6d -size 3086816 diff --git a/assets/audio/OGG/BGS Loops/Interior Day/Inside Day.ogg.import b/assets/audio/OGG/BGS Loops/Interior Day/Inside Day.ogg.import deleted file mode 100644 index 1f2fc36..0000000 --- a/assets/audio/OGG/BGS Loops/Interior Day/Inside Day.ogg.import +++ /dev/null @@ -1,19 +0,0 @@ -[remap] - -importer="oggvorbisstr" -type="AudioStreamOggVorbis" -uid="uid://32etm4omspbu" -path="res://.godot/imported/Inside Day.ogg-0e94bb354b2ce3a130f7273115a09d6d.oggvorbisstr" - -[deps] - -source_file="res://assets/audio/OGG/BGS Loops/Interior Day/Inside Day.ogg" -dest_files=["res://.godot/imported/Inside Day.ogg-0e94bb354b2ce3a130f7273115a09d6d.oggvorbisstr"] - -[params] - -loop=false -loop_offset=0 -bpm=0 -beat_count=0 -bar_beats=4 diff --git a/assets/audio/OGG/BGS Loops/Interior Night/Inside Night Rain.ogg b/assets/audio/OGG/BGS Loops/Interior Night/Inside Night Rain.ogg deleted file mode 100644 index b07ceda..0000000 --- a/assets/audio/OGG/BGS Loops/Interior Night/Inside Night Rain.ogg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:8ef7adfb2fcfd5736738d4ba737c15797e557bcbfc9cb4872bff5fad69bb5a2d -size 3505085 diff --git a/assets/audio/OGG/BGS Loops/Interior Night/Inside Night Rain.ogg.import b/assets/audio/OGG/BGS Loops/Interior Night/Inside Night Rain.ogg.import deleted file mode 100644 index 4773857..0000000 --- a/assets/audio/OGG/BGS Loops/Interior Night/Inside Night Rain.ogg.import +++ /dev/null @@ -1,19 +0,0 @@ -[remap] - -importer="oggvorbisstr" -type="AudioStreamOggVorbis" -uid="uid://f25kmpjr5tve" -path="res://.godot/imported/Inside Night Rain.ogg-e5809f01347b726e6555330c059d8ed1.oggvorbisstr" - -[deps] - -source_file="res://assets/audio/OGG/BGS Loops/Interior Night/Inside Night Rain.ogg" -dest_files=["res://.godot/imported/Inside Night Rain.ogg-e5809f01347b726e6555330c059d8ed1.oggvorbisstr"] - -[params] - -loop=false -loop_offset=0 -bpm=0 -beat_count=0 -bar_beats=4 diff --git a/assets/audio/OGG/BGS Loops/Interior Night/Inside Night Storm.ogg b/assets/audio/OGG/BGS Loops/Interior Night/Inside Night Storm.ogg deleted file mode 100644 index 9dbe0cd..0000000 --- a/assets/audio/OGG/BGS Loops/Interior Night/Inside Night Storm.ogg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:41f6679d445459524c1fb26ff754a8ccb9d73c2e7faae3c98f11951dbc7eaa05 -size 3462454 diff --git a/assets/audio/OGG/BGS Loops/Interior Night/Inside Night Storm.ogg.import b/assets/audio/OGG/BGS Loops/Interior Night/Inside Night Storm.ogg.import deleted file mode 100644 index 72791f5..0000000 --- a/assets/audio/OGG/BGS Loops/Interior Night/Inside Night Storm.ogg.import +++ /dev/null @@ -1,19 +0,0 @@ -[remap] - -importer="oggvorbisstr" -type="AudioStreamOggVorbis" -uid="uid://ckwyc2py0wajp" -path="res://.godot/imported/Inside Night Storm.ogg-c58f36c3031d57ca8002b2d7c843a355.oggvorbisstr" - -[deps] - -source_file="res://assets/audio/OGG/BGS Loops/Interior Night/Inside Night Storm.ogg" -dest_files=["res://.godot/imported/Inside Night Storm.ogg-c58f36c3031d57ca8002b2d7c843a355.oggvorbisstr"] - -[params] - -loop=false -loop_offset=0 -bpm=0 -beat_count=0 -bar_beats=4 diff --git a/assets/audio/OGG/BGS Loops/Interior Night/Inside Night.ogg b/assets/audio/OGG/BGS Loops/Interior Night/Inside Night.ogg deleted file mode 100644 index b6e83fb..0000000 --- a/assets/audio/OGG/BGS Loops/Interior Night/Inside Night.ogg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:8ecedb3e31c3c737d5633074ea498ae2f26df8ed6c20355a8b34aaed709effb6 -size 3416445 diff --git a/assets/audio/OGG/BGS Loops/Interior Night/Inside Night.ogg.import b/assets/audio/OGG/BGS Loops/Interior Night/Inside Night.ogg.import deleted file mode 100644 index 0bc1ca3..0000000 --- a/assets/audio/OGG/BGS Loops/Interior Night/Inside Night.ogg.import +++ /dev/null @@ -1,19 +0,0 @@ -[remap] - -importer="oggvorbisstr" -type="AudioStreamOggVorbis" -uid="uid://pbnj4s0grd11" -path="res://.godot/imported/Inside Night.ogg-21401659a3d868ed60a5105f4a6c6ec5.oggvorbisstr" - -[deps] - -source_file="res://assets/audio/OGG/BGS Loops/Interior Night/Inside Night.ogg" -dest_files=["res://.godot/imported/Inside Night.ogg-21401659a3d868ed60a5105f4a6c6ec5.oggvorbisstr"] - -[params] - -loop=false -loop_offset=0 -bpm=0 -beat_count=0 -bar_beats=4 diff --git a/assets/audio/OGG/BGS Loops/Sea/Sea Rain.ogg b/assets/audio/OGG/BGS Loops/Sea/Sea Rain.ogg deleted file mode 100644 index 1a3c132..0000000 --- a/assets/audio/OGG/BGS Loops/Sea/Sea Rain.ogg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:59b5837c7ae53e66399a121d2a8f2f1e46f35bd9d6ff7b5b658f73c483487794 -size 4111484 diff --git a/assets/audio/OGG/BGS Loops/Sea/Sea Rain.ogg.import b/assets/audio/OGG/BGS Loops/Sea/Sea Rain.ogg.import deleted file mode 100644 index cc17535..0000000 --- a/assets/audio/OGG/BGS Loops/Sea/Sea Rain.ogg.import +++ /dev/null @@ -1,19 +0,0 @@ -[remap] - -importer="oggvorbisstr" -type="AudioStreamOggVorbis" -uid="uid://ir0yr6rxnqd2" -path="res://.godot/imported/Sea Rain.ogg-cf01fe03108d2a570a90b3017f1b736d.oggvorbisstr" - -[deps] - -source_file="res://assets/audio/OGG/BGS Loops/Sea/Sea Rain.ogg" -dest_files=["res://.godot/imported/Sea Rain.ogg-cf01fe03108d2a570a90b3017f1b736d.oggvorbisstr"] - -[params] - -loop=false -loop_offset=0 -bpm=0 -beat_count=0 -bar_beats=4 diff --git a/assets/audio/OGG/BGS Loops/Sea/Sea Storm.ogg b/assets/audio/OGG/BGS Loops/Sea/Sea Storm.ogg deleted file mode 100644 index 2ddafd8..0000000 --- a/assets/audio/OGG/BGS Loops/Sea/Sea Storm.ogg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:2b42ff980baddc9c79c9ebbee36e897a86a38e6f5b81cea856d30203dc56873f -size 4091053 diff --git a/assets/audio/OGG/BGS Loops/Sea/Sea Storm.ogg.import b/assets/audio/OGG/BGS Loops/Sea/Sea Storm.ogg.import deleted file mode 100644 index 2f41707..0000000 --- a/assets/audio/OGG/BGS Loops/Sea/Sea Storm.ogg.import +++ /dev/null @@ -1,19 +0,0 @@ -[remap] - -importer="oggvorbisstr" -type="AudioStreamOggVorbis" -uid="uid://bsx1fnbb7yjwd" -path="res://.godot/imported/Sea Storm.ogg-aeaf55b766dc15a0d76c70ecfc82aa66.oggvorbisstr" - -[deps] - -source_file="res://assets/audio/OGG/BGS Loops/Sea/Sea Storm.ogg" -dest_files=["res://.godot/imported/Sea Storm.ogg-aeaf55b766dc15a0d76c70ecfc82aa66.oggvorbisstr"] - -[params] - -loop=false -loop_offset=0 -bpm=0 -beat_count=0 -bar_beats=4 diff --git a/assets/audio/OGG/BGS Loops/Sea/Sea.ogg b/assets/audio/OGG/BGS Loops/Sea/Sea.ogg deleted file mode 100644 index 13a5661..0000000 --- a/assets/audio/OGG/BGS Loops/Sea/Sea.ogg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:d82b62029aab242e41dd453b9050a8efc4cfd1ba0d85af13b35efe1d1cc15ba4 -size 3318621 diff --git a/assets/audio/OGG/BGS Loops/Sea/Sea.ogg.import b/assets/audio/OGG/BGS Loops/Sea/Sea.ogg.import deleted file mode 100644 index 912b3d9..0000000 --- a/assets/audio/OGG/BGS Loops/Sea/Sea.ogg.import +++ /dev/null @@ -1,19 +0,0 @@ -[remap] - -importer="oggvorbisstr" -type="AudioStreamOggVorbis" -uid="uid://ds1q1p8xkec0" -path="res://.godot/imported/Sea.ogg-c2c1aef5e5d5edecf3e9e360abb85a05.oggvorbisstr" - -[deps] - -source_file="res://assets/audio/OGG/BGS Loops/Sea/Sea.ogg" -dest_files=["res://.godot/imported/Sea.ogg-c2c1aef5e5d5edecf3e9e360abb85a05.oggvorbisstr"] - -[params] - -loop=false -loop_offset=0 -bpm=0 -beat_count=0 -bar_beats=4 diff --git a/assets/audio/OGG/SFX/.DS_Store b/assets/audio/OGG/SFX/.DS_Store deleted file mode 100644 index fe82285224f6ac864abf5c0a1921a2d2c5eeef9b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 20484 zcmeHP32+q075!ga(+ikEz_Jnu)*yip0_&DI1iCn5%ppKrMy#|8+OXOcnw12|IM@)9 ziVrF#m;~a)M=FVdBo!M{6(?~jCXOAG)1k_kTovc4a;j{{P8Cj^a`L--c6WAmBzBPy zGBu-`>Dm6>bM*ZA@4w%F1OQmm;VlGM4gdrmE%IL%I<)&JD`4M)ENqjvr|8}XbxBd?m#?!u)|61b-w>0Vd>qDVH zbl=mo(eLYORL9qbf?dP7|`p^l(e6UV8S0&${7)z#fSXI@FZ zyR7s;zPr1yu(*`(7aTail!-Zol`D3%?%Use&w+ctAa4_O>jYyAx6OA?(rUOxuhtxB zqKo7rLv>(R!k8JQT4${sm$dsL<8nDVE{>7TrOO;E8rAepy4}@nVSgy7ZS=KkR5q$( zG#a86&7t6$b|05FG=~BmtwF6(9oy^)G8^Dd&7Khixz4R*NTRX zs@kFX*7>NNztdMot+h>lIvj7NB0Do`Lgv)zxpRuj7gk>yecKq-k?t7Z(COFwO#$DA zF26V2ve~0G`+{D7aMuUm|GmrlDXucM6w3XG49Oq1?dX)7VU7b8co+F>B8e6}c z9=GgzhoewYy=+6k)8q@tsuD+;qJE4ubjneamGc}6l(Cr4Hjy&7(sgUHdXckAQD0WJ z^K;+n(ZZ|Se8JdN)hWtmE~)lV>N@N2jNzlGn!AK>rs4*V0|gMT5S14rU0bm8qd4YM%^ z^RO68unfy_AuhqCxExpDYTSgIaVu^^FScS3_h37A<6-$x_Gio1>bqkK+0`HhtXq2~(!eoLx{l ze{u9tnx0JPnMnKApK@SmYYqoG+mNEha^Ktm8Gn($dRQEBdwMF%E}!MbttK|lrC6E(&41Q zQd(6_Qs6HbyM7IP63)PLq^Jcggc z$M7_sG3nn5lm4BH*FPg@jk^4;+{Yzo88oyt6oV}578ZbI=x>6nENGw*cbMMRcGyXK z0y@DB>%b44qLzojJrD#hmG#uJooYSM3Yr1lUWvRbHw)e}y1NU@%JSWXB^ABn8^{ z8c<=qcvW!;b43iPFj~B_Vjgov&9gL^yt;Cc%Vjdw!g_L94PBK1Y?U62T@-CqPBk+i z9~Qw<*aFS;j&>2=K17In5}qP^_igwd{Df@YD}=beg4f{<_zV0M{swQuf8j&2eSi!n zpp)#Mo3M5!=92X*BCO?hZvocfO1u+S;a%7uY+e&ty#RLLUfhTK$qN0@MWX@I;HBJ0rb2AILtEmo=vSL=s zy-IbMlvc3$-0f6{N@*oq%pFX1_@#`AE@yQOW4!}(RA+nC*eBpLe3!KKRd|iO!Z+Ye z($e=yLx-a(G&B<@5kk)p2%Sd=U8*BA*Hh^kuGJB`0e9#Ky%R$^LU-W3Izk`Dhw!M5 z&&TmgN#S!J^wo&xCw{p5#HlPnLi=>Y821+aX~pbD5d2w2c@LAEP;S07*Oxkb!5*cb8Q zVq~0gGX9Zs4${_LlZ&%dxj0MU;w+CPaB-H%#hDcsXZ^>;1$T=Y*p!`uEATrqxZEjt z2i}GEgj2w2IClze$LU1Fxl>Rq46Zb`%ZP?^r(hFqAsWt|f>tuKdxTSP7>^JQ=S~5q z;nFF14li88DR?pQ-3@4+5uo30rIuNwmf5#B&|fzX&(6tWDn^<3tQ-RqpEH+aF(zJA z%#2LDyn>)S#>5v^k~GG|b)cu$%fQ6r^)EGmhYxWm-bMiLB6#N%dzjyA1Sum8cQ52J$@^V#`HE1Z{-{y+d0vvE?Lh-w1h0 zcCmoMWP8RS(js0xsQB~PbjA!}X){HLPzUkOiinyF0w?fi9%{7a&s<``pLumWf95su z{F&F7_%p9c;Lp6$fp7=AD^)r9|CY*!kiIH4{U%)R16@N}%Z6gqB5zDr@vTyGI zb7dYeXEm%&Octqdt@uuAP$OeR8Saj!<(XCbz*a8|8iRKy}$r>D*sX5DT; zx{T#iUNrucIHhN2&=@B5q8T*8rcsbaIC;~c1Qx;?*i4h`d-u?K1NLDyXj@{Sr>oke?ES|$3;0sAb>#S8XLN_cTc8-x0v2$eKRMi})DY`yn z&=9UVdWqZ_b7+c+<8o-qE8=o!7FNdP&{Wr0`?=sri85@k@j7IKhm`En-m?s zDoDmCiq}n{=rE5B=ipo{5b@y>ti;7wjWt5=?h<;()3ol!?WBDz_;C>@4q_KgA9v$D zlrnRK(zQM#wD35kZJoqZ_(e*Y`RX;N0XM&v2RwAjI+C&y#9)^7`$0!fS!;pb&nY`pC@_TEgFF>PGA9P@$wj$ zS;W=sJWx9ibRhFUlL)$-Ui6flVS^#C`9C)?DUF_mDUoJMZ22cNeC40eq;}Yt1+s9b zKbn)@NhG4%lizwq++dmf9!835hQ^39Z4tXCXWGs~xAV~ZH4i=M&t+`>AI^pnj?Ti>+0)j=-#l0`{N|RP3sO?`NG>B zl%?oG8{UN1i_h_?6rbZ$xkj(w!ArhS-9cH>9xVg@j{y4jJ2V^r2lNYC8~^(Y|Njq5 CxuWg> diff --git a/assets/audio/OGG/SFX/Attacks/.DS_Store b/assets/audio/OGG/SFX/Attacks/.DS_Store deleted file mode 100644 index 96bdab598b338cad52d64a0e053f27bec3bda13c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 12292 zcmeI2YitzP701spHq2c}8BC7LqMkxSy}nmU&cz zv@W5Q_Ems!h(QN<^rua0J-woWs(AlOT30|PI7R)_a2L2VUN4w59^ccz2AymtSkzYd z$NICj<=7|qNUqo1{3=$=tE`&8Kw(T_H?hz4k2vG~p62D;PAz+cm-cDiNQ(BUN3aAD z2qF+fAc#N^fsbPZ_`8=DrR04tYlCeNfgl1O>j?1YLyT5#lfFG8t$1|MhW~`;e*P0) zEVNG?AnIbiP5SnXw4y8Z5naj3uIM8M%I;Jjv;WTEoW}xXO0=& znrFDf>SC8>sW0u=`?AIu&CX!jv2vp}d8*TzmCjLPqrH zIAl^^UN@{R;r;h!Jkzn=gGSaR%h<(5%W7|~Z(6^peMiSDH+^EUTD^p^!!)zDXC60= z?16Dp_eKtBZrZSQ(>^gcX1Zp|G6rmI)Tpl5&zR^HULJ`IsrT~QZd zM|C>GI~<*lrmHU~vVE*B5;?*>U0H*+y5C`SLxc^ubhfJIH(axpv4OitdaCOmYQshr zIbdli!%}r7kJGZ5MFz*@C8@Xhm0Py5$Pi88C|!zMjd8zv=dMWPPJZOuHP_plF>E@k z%l_dz>8uWMUx%*qb5iP)JT*s)xZL_=vn;9neOUu>*abasm~vq@-N6sR!*CAH!_)9A zJP+T8AHh%I7w}8?6}%3AfIq<%_%pl<|Ac?RzY&n(G7RH#j9~*dViT^xP1ufGaT{*O zZoCz5$2;&dIEcfjVG7e|VGd8?DLjp5@lpH=eigrlkK?!S8N7&>@CAGkUy|omk-x8Q zmF4^vU#7kCB6i{p8YRE9;x$iMH*@sd+D%=^`-}>Q9JH zs!FIWuO>0?uaLTHYFDsmUi_su#R1Z%aZ=$TQy0kAvD#G%=}J{Zku}sdG7`Uv(%VqG zPEphf>Dy4-%t-I*Jn3s;tqLhyt&-j?Y#Sr(tCiBblii|_#MSxI+sV2azYA5EO{=pi z^+|XJzDp|o4ZI3(kV4-kb^e`{IUiM_%vxN5QT#Nia}BP=IJRONZXtzoeeT8{?8VRG zejLC9q|#%g(lqLL939MH7F|;7z4&>&5AVkZ@L@cMkNB#644*F1X^&325X5>b`Tne-B#jy-ZK?H&b1Q7@#5JVt|zy~k_JZ(0| zZ|~P&|7(1Izj5rZNcLZ!*bItE|WOKaVxw$T%!=^PeH!`{!m?bCFh(X z&XNg&y6`GRDMT*Wp&?9Qq$z^GWX;+TQIsp8Uv}LXN^l~QcqXehhuSy>JqTRHJC)-9%Iq#8F?s2l0#eb$kM!#HWb*zm4C)m+*)3xi%~J|9tMx z7|R{YGyn0KWE|by6Y70`WLyOOjq93Qx7{)|?Ikl^G?j%4ydLNeMJ3#qB7gplQ5VS6 z5>FA_9E(O(E;S$eS4Tr4;l+JTtI1d4d*bWKGf(8WxG%9O6jiH4Hj5YA+Cw3=QsldM zar+MP&KGGdUQBk77x>M{t|EWYC0>VGpMs0RV7+2 zW&h{ruGK>B&;H=bWuN=!_y8Yut}=i5qm}Z0W`wS@O2(pzfB)Y-`~UyRR>3xiKoEhC zWCXCXyT7}WE-jz9FTG0stvyETF9;u}EqQ7A czyA}!|McPN8b4!$_kZyIFZy5f57+zuKiuicP5=M^ diff --git a/assets/audio/OGG/SFX/Attacks/Bow Attacks Hits and Blocks/.DS_Store b/assets/audio/OGG/SFX/Attacks/Bow Attacks Hits and Blocks/.DS_Store deleted file mode 100644 index 5008ddfcf53c02e82d7eee2e57c38e5672ef89f6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6148 zcmeH~Jr2S!425mzP>H1@V-^m;4Wg<&0T*E43hX&L&p$$qDprKhvt+--jT7}7np#A3 zem<@ulZcFPQ@L2!n>{z**++&mCkOWA81W14cNZlEfg7;MkzE(HCqgga^y>{tEnwC%0;vJ&^%eQ zLs35+`xjp>T0H1@V-^m;4Wg<&0T*E43hX&L&p$$qDprKhvt+--jT7}7np#A3 zem<@ulZcFPQ@L2!n>{z**++&mCkOWA81W14cNZlEfg7;MkzE(HCqgga^y>{tEnwC%0;vJ&^%eQ zLs35+`xjp>T0H1@V-^m;4Wg<&0T*E43hX&L&p$$qDprKhvt+--jT7}7np#A3 zem<@ulZcFPQ@L2!n>{z**++&mCkOWA81W14cNZlEfg7;MkzE(HCqgga^y>{tEnwC%0;vJ&^%eQ zLs35+`xjp>T0ZXQ6wLnsLl3KH(k-NLmuchkE! z36O$d?PIjmM^*Z;PFt&E3yw1tu-0mw=`h8LS|v_j+Hq`a|L~925vO*Xs=ss2?&jQk zH-T0JMt3v2XZQT}?Bm?;{J!seSwaZ33`DC5sUn0(xYANpaC0XiL0Sq6jng%2nSeEb zYbma{uM(0X8c9Zt-grdMIy<`}2dilNTwL?WHWC)w>v0k@QdLziL(YWUyor+}k4N%M z@qDs#uRhe73a7F!=hnDA;P!yq18xtvJ>d4hCG-I0URD5?W*IWe!@Oiou?=gAC2tDm6a#p3tPj%Du?(5z zVP5j)1bA}-=AFTup#Zx(whOY;350m*ZrvVmdmy_9=x`C{-tj%voxOTrzi^@$H3nNF zaXo_L{^>}6oXyW)v*+jXWMzuKy`z2YI;BUQHW<@}Huk4tdcxSMB@HZl)O-Uc?;X8* zVpCG1@ol|&e4sC3^r!{B;dt*rJe<;+yF{|`C00Kp>5XiqOn1(4KHn|;5k0EFmPSjg37warq+>swP4!x8H#dK zEUG0^v72LBa?4OGn%cWPZ1if0Xe_a3+hELyMdDglBHX7Hz`Gs~Yvn8Q`@07sv0DdX zsr_n+B(d7!*?whb6z{Y_kJ76})l(8bf9`C*e+P}UCNwf|#VCLZvwCI7 z@83o5ygqECHuh@?e5$kN?c4CFw$oU1G)kXIDzSd|lF&T9oAx>-p(sunBI2&9DP@Lj-yu3VmR}01Uzq9EQ8$bMSe%2fhm5fJfmm_$HiyAHk2| zC-5Ach2Ow=7=hoy8}JTXfDict=9n}=Hdt@OOZX?2>4@$(5&f_;q62H%*L1ACh7tYh zR1V{r-ojwn{6#elE1GQ>Wc=`HKc)yrhCvQ820ja14D}-j_E~{qWsWr#GRMdkgsZks zqL@=B@w4X!N+pDuDzQVQJTTdVV}ZxY0~L~_=I}^mpxT4rS10gTol-9$%+)*|ZB&+f za3H9;Jldp$B*eQqkw;sVRUSGdRdSht`yx3{{)nLc2N0NufSrzDy$*p|35^V>t-~o6Lz7F4lZ^L)s2{;ZX z;S@X#KSU5e3uoY$@H)Je0o(N%uzfonwtaeA8;32C{;>P~JD!?zraAMB=ta)x-#cEa zAM8vf;(B5aUX>1|T(oC({EJ4040FJc7p(y^mPI>Yw1ks8sA0P)oZ1^P_q%jGZtsU9 zTagEP)ETXMA{CA$v?TL)F(2b8JGUXQ^r04gAQ3g#bvk)~dBHtu(eUu1B}*%UHFdQI zD}uw-)wN41f_1g^2M>Cr!m{ccI(GN%KQMgT!9x$?8{h&~Qpo4W_Vyv%v)_>0*JwYB zl@7dUH;9k2;(n`3UJ+Q)yLye>aTyrV=0Ab$dekhEvk8#0oifuur(_;W3L{f6QOMKe z8DkA&fd$#H;)9>I@)mlFBxE_8@%Xg@-r00ir)3ou@dmteB}q&$yg`|_oDO!DZFtQB z8FPl=VM&KKt(2>22H?qvSJlaw6xMmHq{J&5<>f5n*tw2ZH+eBdoRu;XACCpRZIUGL zolSD=O+7ZdA-NTi#W?Y3Cp+;U8vW#Uau2zee1SYf9w#TrQ{-9l0y#^5jx_gc@)~&^ zsqPIVyZ6Xn$Y03?0FW_vC@go(g;J!u1yBohP!A2T0#;!LX-CT22;Hz932!GOy9C?{ zNz5Ieg*#a8I0la}syhMSh0`=oaID(2ww51TTR4*jR%6g2wOvktEMB!*ZofK!d{v=% zqN;1=?2__@RZEtww12>i-z*JQB9_J{D{mpCE4i4HQYKYd*jFcUg+$Mu6D%%PDQKh- zdgv)FmYHs&2lGlXmSaXL7GY!plWH_pT_YE(c}$ei!}d4h$LxXW*e)06aWS05 zr37*Jf<+uxOWb*fhpQ@rjrHRzyJP&d$5eLri?5fi?96v|RCZQuRM{P|`a@K9zSV2m z<^K|q+A_{T;yEe1f@!iWD7dkRPw+9gvh(?DRmXe`T01M?lhf#z@ga=_13sU~#mJ1b zy0pwEkNOz2X8r0gC&j;jOAE2r=*Etd)PbUT8IFMrTK*R&((p@?tEYx~b z>CMAA#X_d^8ce0vhFXs*y&KV)=weEbV~;95oy{(&(mRB9+7YJoj=~pF>v5&`Bz!*u zeVIz{q=-II=`DV#d!McJ%(N*gJ*T*%(lgs;D7`$=i64dOBtbNRoPK6u{%VnvZ+N(_ zrXpBdbrIv?0p6`+(i1f%gjW;^N~m_AC^0%pQsbHO%KFQY53-#1OEl#jILziZCsSUT zp?Jp{-U7)9HpMixAV1rbr?t+eJdHS*^0YeLl&3Z6raZ05Fy(1gmMKpw9ZY#zJ(ej? zV;|L&PxCFZP5I-3DL;a4#arlazDIqED`?99EhD=)oAUNZ7uan)Q(jqj?IQaB(v+W7 zz`b&&{Asl0pAk&?-(|qo*_5|oE7IZ<6VKmmoASaLqZWws z84lDar1~s!w7;1a$nn~+<>?C<|C|Bc-% zx;^0bz%|nYklWVT)`E{?{eLv`$>_IsL0os^O3(Qzu5`hD)&w{76nelu$HN2qIo?uQ lXDt{D(S0lr^Ah)Px#AxJy7PZ`{;v;p{YPIO{143k{|!uu*6;uT diff --git a/assets/audio/OGG/SFX/Footsteps/Dirt/.DS_Store b/assets/audio/OGG/SFX/Footsteps/Dirt/.DS_Store deleted file mode 100644 index 5008ddfcf53c02e82d7eee2e57c38e5672ef89f6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6148 zcmeH~Jr2S!425mzP>H1@V-^m;4Wg<&0T*E43hX&L&p$$qDprKhvt+--jT7}7np#A3 zem<@ulZcFPQ@L2!n>{z**++&mCkOWA81W14cNZlEfg7;MkzE(HCqgga^y>{tEnwC%0;vJ&^%eQ zLs35+`xjp>T0H1@V-^m;4Wg<&0T*E43hX&L&p$$qDprKhvt+--jT7}7np#A3 zem<@ulZcFPQ@L2!n>{z**++&mCkOWA81W14cNZlEfg7;MkzE(HCqgga^y>{tEnwC%0;vJ&^%eQ zLs35+`xjp>T0H1@V-^m;4Wg<&0T*E43hX&L&p$$qDprKhvt+--jT7}7np#A3 zem<@ulZcFPQ@L2!n>{z**++&mCkOWA81W14cNZlEfg7;MkzE(HCqgga^y>{tEnwC%0;vJ&^%eQ zLs35+`xjp>T0H1@V-^m;4Wg<&0T*E43hX&L&p$$qDprKhvt+--jT7}7np#A3 zem<@ulZcFPQ@L2!n>{z**++&mCkOWA81W14cNZlEfg7;MkzE(HCqgga^y>{tEnwC%0;vJ&^%eQ zLs35+`xjp>T0H1@V-^m;4Wg<&0T*E43hX&L&p$$qDprKhvt+--jT7}7np#A3 zem<@ulZcFPQ@L2!n>{z**++&mCkOWA81W14cNZlEfg7;MkzE(HCqgga^y>{tEnwC%0;vJ&^%eQ zLs35+`xjp>T0H1@V-^m;4Wg<&0T*E43hX&L&p$$qDprKhvt+--jT7}7np#A3 zem<@ulZcFPQ@L2!n>{z**++&mCkOWA81W14cNZlEfg7;MkzE(HCqgga^y>{tEnwC%0;vJ&^%eQ zLs35+`xjp>T0H1@V-^m;4Wg<&0T*E43hX&L&p$$qDprKhvt+--jT7}7np#A3 zem<@ulZcFPQ@L2!n>{z**++&mCkOWA81W14cNZlEfg7;MkzE(HCqgga^y>{tEnwC%0;vJ&^%eQ zLs35+`xjp>T0!V? zEdVe8G61C~+Uv)>+S@ALZ6S5Cy7-`sZs9CRy7SlgCk}ytfCB&n%;u-O+G3!Gzu^Nf zRI`hunilkDw%Aj)u^S+-hf!D2DWil{+|V=mJKj@9-Nkj2B8oRYNZryGay14S2NXIJ zE{kf_jF?2UYAJnHwV^vVW}do9&u{q`uB2>2`a{gUqQn-yNCLUGlAHlXFrClI=OrwU z2NA3T1q4_PN-9KHEEFn%l}btAWGGlr`3uLu7{3GMuP{{B%pJij!fLg}YUYDLE+BA% zk%P4Z3dmT^VB$OqW52mwO?yUTjNiT?!_`10v`Uv;qnO+zry5d^>RmU|sPL)MWkv3<{gazpY01lGbo}xrZ?yedVIY92Qbj FLqkdPv1b4P literal 305 zcmV-10nYwXQ$s@n000005C8!80RR9Q0RR9fwJ-f(_W*qe0D{dfFko%c7$Hc?3IMDC z3b0srAJuL%ag&WKVI+Is^H76`sNT%o?mQUAI`FjjKStDB3YiVX<_DfKk>E&xJibW1 zXzn$oP^D>c*sy?%WJD-Ob6z4eAfVD+rW9sX>T{YoMUCW%;bhxi-~;`*g;z%GFlm=s z8DDJbDTht`4eQ74LU>LwDp((DyL1_6&F5i}cK*r=*<`Rz+IGdc9&7O}ZPF80<*)D) z{1DQ?VDVAG{Ll(js+jx%KfnhfAV2~{RBi{tgt@>VXB(&PEIN1NfGIly6@;K5^A2DxY#skvjp`-EaCzb$U_SH8bq8};Qd2`i D(Y%RZ diff --git a/export_presets.cfg b/export_presets.cfg new file mode 100644 index 0000000..93f5cbb --- /dev/null +++ b/export_presets.cfg @@ -0,0 +1,49 @@ +[preset.0] + +name="Whittler" +platform="Web" +runnable=true +dedicated_server=false +custom_features="" +export_filter="all_resources" +include_filter="" +exclude_filter="" +export_path="../../../../../../home/dan/Dev/Web/ritual.sh/static/games/clicker/index.html" +patches=PackedStringArray() +patch_delta_encoding=false +patch_delta_compression_level_zstd=19 +patch_delta_min_reduction=0.1 +patch_delta_include_filters="*" +patch_delta_exclude_filters="" +encryption_include_filters="" +encryption_exclude_filters="" +seed=0 +encrypt_pck=false +encrypt_directory=false +script_export_mode=2 + +[preset.0.options] + +custom_template/debug="" +custom_template/release="" +variant/extensions_support=false +variant/thread_support=false +vram_texture_compression/for_desktop=true +vram_texture_compression/for_mobile=false +html/export_icon=true +html/custom_html_shell="" +html/head_include="" +html/canvas_resize_policy=2 +html/focus_canvas_on_start=true +html/experimental_virtual_keyboard=false +progressive_web_app/enabled=true +progressive_web_app/ensure_cross_origin_isolation_headers=true +progressive_web_app/offline_page="" +progressive_web_app/display=1 +progressive_web_app/orientation=0 +progressive_web_app/icon_144x144="" +progressive_web_app/icon_180x180="" +progressive_web_app/icon_512x512="" +progressive_web_app/background_color=Color(0, 0, 0, 1) +threads/emscripten_pool_size=8 +threads/godot_pool_size=4 diff --git a/project.godot b/project.godot index 264fd27..581b109 100644 --- a/project.godot +++ b/project.godot @@ -8,11 +8,15 @@ config_version=5 +[animation] + +compatibility/default_parent_skeleton_in_mesh_instance_3d=true + [application] config/name="Clicker" run/main_scene="uid://bqtexca6cdr54" -config/features=PackedStringArray("4.5", "Forward Plus") +config/features=PackedStringArray("4.6", "Forward Plus") config/icon="res://icon.svg" [autoload] @@ -20,7 +24,7 @@ config/icon="res://icon.svg" InputOverride="*res://scripts/inputs.gd" GameManager="*res://scripts/game_manager.gd" Global="*res://scripts/globals.gd" -DebugMenu="*res://addons/debug_menu/debug_menu.tscn" +DebugMenu="*uid://cggqb75a8w8r" Inventory="*res://scripts/inventory.gd" Unlocks="*res://scripts/unlocks.gd" Audio="*res://scripts/audio.gd" diff --git a/resources/UnlockData.tres b/resources/UnlockData.tres index 87e526b..660ca88 100644 --- a/resources/UnlockData.tres +++ b/resources/UnlockData.tres @@ -8,10 +8,11 @@ script = ExtResource("2_1js7i") unlock_id = 1 unlock_name = "Marketing" unlock_description = "Affects the amount people are willing to pay for your whittling" -base_cost = 100 +base_cost = 200 is_scaling = true -cost_scaling_multiplier = 10.0 -effect_scaling_multiplier = 1.5 +max_rank = 5 +cost_ladder = [200, 1200, 6000, 25000, 80000] +effect_scaling_multiplier = 1.6 base_modifiers = { "sale_price_modifier": 1.5 } @@ -22,13 +23,14 @@ script = ExtResource("2_1js7i") unlock_id = 2 unlock_name = "Wood" unlock_description = "Increases the amount of wood produced per click" -base_cost = 10 +base_cost = 100 is_scaling = true -cost_scaling_multiplier = 2.0 +max_rank = 4 +cost_ladder = [100, 400, 2000, 8000] effect_scaling_type = 0 -effect_linear_increase = 1.0 +effect_linear_increase = 5.0 base_modifiers = { -"wood_per_click_modifier": 2.0 +"wood_per_click_modifier": 5.0 } metadata/_custom_type_script = "uid://biqqffne7dd8r" @@ -37,10 +39,11 @@ script = ExtResource("2_1js7i") unlock_id = 3 unlock_name = "Demand" unlock_description = "How many whittled products can be purchased per tick" -base_cost = 100 +base_cost = 300 is_scaling = true -cost_scaling_multiplier = 5.0 -effect_scaling_multiplier = 1.25 +max_rank = 4 +cost_ladder = [300, 1500, 8000, 35000] +effect_scaling_multiplier = 2.0 base_modifiers = { "purchase_rate_modifier": 2.0 } @@ -51,10 +54,10 @@ script = ExtResource("2_1js7i") unlock_id = 4 unlock_name = "Efficiency" unlock_description = "How many things you can produce per whittle" -base_cost = 1 +base_cost = 150 is_scaling = true max_rank = 5 -cost_scaling_multiplier = 10.0 +cost_ladder = [150, 800, 4000, 18000, 60000] effect_scaling_type = 0 effect_linear_increase = 1.0 base_modifiers = { @@ -67,7 +70,7 @@ script = ExtResource("2_1js7i") unlock_id = 5 unlock_name = "Wholesale" unlock_description = "Sell multiples of 100 at 20% extra income" -base_cost = 1 +base_cost = 18000 base_modifiers = { "UNLOCK_ONESHOT_WHOLESALE": 1.0 } @@ -78,9 +81,10 @@ script = ExtResource("2_1js7i") unlock_id = 6 unlock_name = "Multicraft" unlock_description = "Just craft more stuff" -base_cost = 1 +base_cost = 30000 +is_scaling = true max_rank = 2 -cost_scaling_multiplier = 10.0 +cost_ladder = [30000, 100000] effect_scaling_type = 0 effect_linear_increase = 1.0 base_modifiers = { @@ -93,12 +97,14 @@ script = ExtResource("2_1js7i") unlock_id = 7 unlock_name = "Autowood" unlock_description = "Automatically gather a percent of a clicks wood per tick" -base_cost = 1 +base_cost = 500 is_scaling = true max_rank = 5 +cost_ladder = [500, 2000, 8000, 25000, 70000] effect_scaling_type = 0 +effect_linear_increase = 0.15 base_modifiers = { -"autowood_modifier": 0.1 +"autowood_modifier": 0.15 } metadata/_custom_type_script = "uid://biqqffne7dd8r" diff --git a/resources/UnlockDataResource.gd b/resources/UnlockDataResource.gd index 7643d1e..3b5bdab 100644 --- a/resources/UnlockDataResource.gd +++ b/resources/UnlockDataResource.gd @@ -16,6 +16,7 @@ extends Resource @export_enum("Linear", "Exponential") var cost_scaling_type: int = 1 # Default to Exponential @export var cost_scaling_multiplier: float = 1.5 # Exponential: multiplier per rank, Linear: flat increase @export var cost_linear_increase: int = 100 # Only used if cost_scaling_type is Linear +@export var cost_ladder: Array[int] = [] # Fixed costs per rank (overrides scaling if defined) @export_subgroup("Effect Scaling") @export_enum("Linear", "Exponential") var effect_scaling_type: int = 1 # Default to Exponential @@ -29,7 +30,12 @@ extends Resource func get_next_cost() -> int: if not is_scaling: return base_cost - + + # Use fixed cost ladder if defined (overrides scaling) + if cost_ladder.size() > 0 and current_rank < cost_ladder.size(): + return cost_ladder[current_rank] + + # Fallback to scaling formulas for backwards compatibility # Cost scaling should start from rank 0 (first purchase at base_cost) if cost_scaling_type == 0: # Linear return base_cost + (cost_linear_increase * current_rank) diff --git a/scenes/game2.tscn b/scenes/game2.tscn index 38d73ee..22808b9 100644 --- a/scenes/game2.tscn +++ b/scenes/game2.tscn @@ -1,4 +1,4 @@ -[gd_scene load_steps=48 format=4 uid="uid://bqtexca6cdr54"] +[gd_scene format=4 uid="uid://bqtexca6cdr54"] [ext_resource type="Texture2D" uid="uid://dqb5n2pilr3ir" path="res://assets/tiles/Floor Tiles1.png" id="1_7pxbb"] [ext_resource type="Texture2D" uid="uid://ctifw6ryyyap" path="res://assets/tiles/GandalfHardcore Background layers/Autumn BG/GandalfHardcore Background layers_layer 5.png" id="1_xrrf0"] @@ -22,6 +22,10 @@ [ext_resource type="Script" uid="uid://cm84m3olmcc8o" path="res://scenes/scripts/ui_control.gd" id="17_q7h7c"] [ext_resource type="PackedScene" uid="uid://b0bmsqlrg77le" path="res://scenes/button.tscn" id="19_v4v8k"] [ext_resource type="Theme" uid="uid://bnbtwoxxd6cg5" path="res://assets/theme/clicker.theme" id="22_q7h7c"] +[ext_resource type="Texture2D" uid="uid://dx134esqj3kg3" path="res://assets/ui/buttonLong_brown.png" id="23_lv1cq"] +[ext_resource type="Texture2D" uid="uid://bmdc4875jf16r" path="res://assets/ui/buttonLong_brown_pressed.png" id="24_k8i0y"] +[ext_resource type="Texture2D" uid="uid://ddghl4cooepr1" path="res://assets/ui/buttonLong_blue.png" id="25_hcndq"] +[ext_resource type="Texture2D" uid="uid://f0tde4s55m2o" path="res://assets/ui/buttonLong_grey.png" id="26_chdjo"] [sub_resource type="TileSetAtlasSource" id="TileSetAtlasSource_u48pd"] texture = ExtResource("1_7pxbb") @@ -1942,55 +1946,58 @@ gradient = SubResource("Gradient_5kdtj") fill = 1 fill_from = Vector2(0.5, 0.5) -[node name="GameScene" type="Node2D"] +[sub_resource type="StyleBoxFlat" id="StyleBoxFlat_q7h7c"] +bg_color = Color(0, 0, 0, 0.7921569) -[node name="Scene" type="Node2D" parent="."] +[node name="GameScene" type="Node2D" unique_id=1879752572] + +[node name="Scene" type="Node2D" parent="." unique_id=1170541436] metadata/_edit_lock_ = true -[node name="Background" type="Node2D" parent="Scene"] +[node name="Background" type="Node2D" parent="Scene" unique_id=51384242] metadata/_edit_lock_ = true -[node name="Sprite2D" type="Sprite2D" parent="Scene/Background"] +[node name="Sprite2D" type="Sprite2D" parent="Scene/Background" unique_id=1234031660] position = Vector2(43, -45) texture = ExtResource("1_xrrf0") -[node name="Sprite2D2" type="Sprite2D" parent="Scene/Background"] +[node name="Sprite2D2" type="Sprite2D" parent="Scene/Background" unique_id=531673597] position = Vector2(43, -45) texture = ExtResource("2_kh4a2") -[node name="Sprite2D3" type="Sprite2D" parent="Scene/Background"] +[node name="Sprite2D3" type="Sprite2D" parent="Scene/Background" unique_id=1328011980] position = Vector2(43, -45) texture = ExtResource("3_8j387") -[node name="Sprite2D4" type="Sprite2D" parent="Scene/Background"] +[node name="Sprite2D4" type="Sprite2D" parent="Scene/Background" unique_id=236948197] position = Vector2(43, -45) texture = ExtResource("4_5dhap") -[node name="Sprite2D5" type="Sprite2D" parent="Scene/Background"] +[node name="Sprite2D5" type="Sprite2D" parent="Scene/Background" unique_id=1992550436] position = Vector2(44, -45) texture = ExtResource("5_s427y") -[node name="BGTrees2" type="TileMapLayer" parent="Scene"] +[node name="BGTrees2" type="TileMapLayer" parent="Scene" unique_id=1214041213] position = Vector2(-49, 59) tile_map_data = PackedByteArray("AAACAPr/BgAAAAEAAAACAPv/BgAAAAIAAAACAPz/BgAAAAMAAAACAP3/BgAAAAQAAAADAPn/BgABAAAAAAADAPr/BgABAAEAAAADAPv/BgABAAIAAAADAPz/BgABAAMAAAADAP3/BgABAAQAAAADAP7/BgABAAUAAAAEAPn/BgACAAAAAAAEAPr/BgACAAEAAAAEAPv/BgACAAIAAAAEAPz/BgACAAMAAAAEAP3/BgACAAQAAAAEAP7/BgACAAUAAAAEAP//BgACAAYAAAAFAPn/BgADAAAAAAAFAPr/BgADAAEAAAAFAPv/BgADAAIAAAAFAPz/BgADAAMAAAAFAP3/BgADAAQAAAAGAPr/BgAEAAEAAAAGAPv/BgAEAAIAAAAGAPz/BgAEAAMAAAAGAP3/BgAEAAQAAAAOAPr/BgAAAAEAAAAOAPv/BgAAAAIAAAAOAPz/BgAAAAMAAAAOAP3/BgAAAAQAAAAPAPn/BgABAAAAAAAPAPr/BgABAAEAAAAPAPv/BgABAAIAAAAPAPz/BgABAAMAAAAPAP3/BgABAAQAAAAPAP7/BgABAAUAAAAQAPn/BgACAAAAAAAQAPr/BgACAAEAAAAQAPv/BgACAAIAAAAQAPz/BgACAAMAAAAQAP3/BgACAAQAAAAQAP7/BgACAAUAAAAQAP//BgACAAYAAAARAPn/BgADAAAAAAARAPr/BgADAAEAAAARAPv/BgADAAIAAAARAPz/BgADAAMAAAARAP3/BgADAAQAAAASAPr/BgAEAAEAAAASAPv/BgAEAAIAAAASAPz/BgAEAAMAAAASAP3/BgAEAAQAAAD5//z/BwAAAAcAAAD5//3/BwAAAAgAAAD5//7/BwAAAAkAAAD5////BwAAAAoAAAD6//v/BwABAAYAAAD6//z/BwABAAcAAAD6//3/BwABAAgAAAD6//7/BwABAAkAAAD6////BwABAAoAAAD7//n/BwACAAQAAAD7//r/BwACAAUAAAD7//v/BwACAAYAAAD7//z/BwACAAcAAAD7//3/BwACAAgAAAD7//7/BwACAAkAAAD7////BwACAAoAAAD8//f/BwADAAIAAAD8//j/BwADAAMAAAD8//n/BwADAAQAAAD8//r/BwADAAUAAAD8//v/BwADAAYAAAD8//z/BwADAAcAAAD8//3/BwADAAgAAAD8//7/BwADAAkAAAD9//b/BwAEAAEAAAD9//f/BwAEAAIAAAD9//j/BwAEAAMAAAD9//n/BwAEAAQAAAD9//r/BwAEAAUAAAD9//v/BwAEAAYAAAD9//z/BwAEAAcAAAD9//3/BwAEAAgAAAD9//7/BwAEAAkAAAD+//b/BwAFAAEAAAD+//f/BwAFAAIAAAD+//j/BwAFAAMAAAD+//n/BwAFAAQAAAD+//r/BwAFAAUAAAD+//v/BwAFAAYAAAD+//z/BwAFAAcAAAD+//3/BwAFAAgAAAD+//7/BwAFAAkAAAD///X/BwAGAAAAAAD///b/BwAGAAEAAAD///f/BwAGAAIAAAD///j/BwAGAAMAAAD///n/BwAGAAQAAAD///r/BwAGAAUAAAD///v/BwAGAAYAAAD///z/BwAGAAcAAAD///3/BwAGAAgAAAAAAPj/BwAHAAMAAAAAAPn/BwAHAAQAAAAAAPr/BwAHAAUAAAAMAP7/AQAMABQAAAAMAP//AQAMABUAAAANAP7/AQANABQAAAANAP//AQANABUAAAAOAP7/AQAOABQAAAAOAP//AQAOABUAAAAPAP//AQAPABUAAAAKAP//AQAKABUAAAALAP//AQALABUAAAAAAP7/AQAAABwAAAAAAP//AQAAAB0AAAABAP7/AQABABwAAAABAP//AQABAB0AAAACAP7/AQACABwAAAACAP//AQACAB0AAAADAP//AQADAB0AAAAVAP//AQAGAB0AAAAWAP//AQAHAB0AAAA=") tile_set = SubResource("TileSet_btr28") -[node name="BGTrees1" type="TileMapLayer" parent="Scene"] +[node name="BGTrees1" type="TileMapLayer" parent="Scene" unique_id=232331490] position = Vector2(-49, 59) tile_map_data = PackedByteArray("AAD9//7/BAAKAAMAAAD9////BAAKAAQAAAD+////BAALAAQAAAAHAP7/AgAGAAsAAAAHAP//AgAGAAwAAAAIAP3/AgAHAAoAAAAIAP7/AgAHAAsAAAAIAP//AgAHAAwAAAAJAP7/AgAIAAsAAAAJAP//AgAIAAwAAAABAPj/AgAAAAUAAAABAPn/AgAAAAYAAAACAPf/AgABAAQAAAACAPj/AgABAAUAAAACAPn/AgABAAYAAAACAPr/AgABAAcAAAADAPf/AgACAAQAAAADAPj/AgACAAUAAAADAPn/AgACAAYAAAADAPr/AgACAAcAAAAEAPX/AgADAAIAAAAEAPb/AgADAAMAAAAEAPf/AgADAAQAAAAEAPj/AgADAAUAAAAEAPn/AgADAAYAAAAEAPr/AgADAAcAAAAEAPv/AgADAAgAAAAFAPT/AgAEAAEAAAAFAPX/AgAEAAIAAAAFAPb/AgAEAAMAAAAFAPf/AgAEAAQAAAAFAPj/AgAEAAUAAAAFAPn/AgAEAAYAAAAFAPr/AgAEAAcAAAAFAPv/AgAEAAgAAAAGAPT/AgAFAAEAAAAGAPX/AgAFAAIAAAAGAPb/AgAFAAMAAAAGAPf/AgAFAAQAAAAGAPj/AgAFAAUAAAAGAPn/AgAFAAYAAAAGAPr/AgAFAAcAAAAGAPv/AgAFAAgAAAAHAPP/AgAGAAAAAAAHAPT/AgAGAAEAAAAHAPX/AgAGAAIAAAAHAPb/AgAGAAMAAAAHAPf/AgAGAAQAAAAHAPj/AgAGAAUAAAAHAPn/AgAGAAYAAAAHAPr/AgAGAAcAAAAHAPv/AgAGAAgAAAAHAPz/AgAGAAkAAAAIAPP/AgAHAAAAAAAIAPT/AgAHAAEAAAAIAPX/AgAHAAIAAAAIAPb/AgAHAAMAAAAIAPf/AgAHAAQAAAAIAPj/AgAHAAUAAAAIAPn/AgAHAAYAAAAIAPr/AgAHAAcAAAAIAPv/AgAHAAgAAAAIAPz/AgAHAAkAAAAJAPP/AgAIAAAAAAAJAPT/AgAIAAEAAAAJAPX/AgAIAAIAAAAJAPb/AgAIAAMAAAAJAPf/AgAIAAQAAAAJAPj/AgAIAAUAAAAJAPn/AgAIAAYAAAAJAPr/AgAIAAcAAAAJAPv/AgAIAAgAAAAJAPz/AgAIAAkAAAAJAP3/AgAIAAoAAAAKAPP/AgAJAAAAAAAKAPT/AgAJAAEAAAAKAPX/AgAJAAIAAAAKAPb/AgAJAAMAAAAKAPf/AgAJAAQAAAAKAPj/AgAJAAUAAAAKAPn/AgAJAAYAAAAKAPr/AgAJAAcAAAAKAPv/AgAJAAgAAAAKAP//AgAJAAwAAAALAPP/AgAKAAAAAAALAPT/AgAKAAEAAAALAPX/AgAKAAIAAAALAPb/AgAKAAMAAAALAPf/AgAKAAQAAAALAPj/AgAKAAUAAAALAPn/AgAKAAYAAAALAPr/AgAKAAcAAAALAPv/AgAKAAgAAAAMAPT/AgALAAEAAAAMAPX/AgALAAIAAAAMAPb/AgALAAMAAAAMAPf/AgALAAQAAAAMAPj/AgALAAUAAAAMAPn/AgALAAYAAAAMAPr/AgALAAcAAAAMAPv/AgALAAgAAAAMAPz/AgALAAkAAAANAPT/AgAMAAEAAAANAPX/AgAMAAIAAAANAPb/AgAMAAMAAAANAPf/AgAMAAQAAAANAPj/AgAMAAUAAAANAPn/AgAMAAYAAAANAPr/AgAMAAcAAAANAPv/AgAMAAgAAAANAPz/AgAMAAkAAAAOAPf/AgANAAQAAAAOAPj/AgANAAUAAAAOAPn/AgANAAYAAAAOAPr/AgANAAcAAAAOAPv/AgANAAgAAAAPAPj/AgAOAAUAAAAPAPn/AgAOAAYAAAAPAPr/AgAOAAcAAAAPAPv/AgAOAAgAAAAQAPj/AgAPAAUAAAAQAPn/AgAPAAYAAAAQAPr/AgAPAAcAAAAQAPv/AgAPAAgAAAD5//v/BAAGAAAAAAD5//z/BAAGAAEAAAD5//3/BAAGAAIAAAD5//7/BAAGAAMAAAD6//v/BAAHAAAAAAD6//z/BAAHAAEAAAD6//3/BAAHAAIAAAD6//7/BAAHAAMAAAD7//v/BAAIAAAAAAD7//z/BAAIAAEAAAD7//3/BAAIAAIAAAD7//7/BAAIAAMAAAD7////BAAIAAQAAAD7/wAABAAIAAUAAAD8//z/BAAJAAEAAAD8//3/BAAJAAIAAAD8//7/BAAJAAMAAAD8////BAAJAAQAAAD8/wAABAAJAAUAAAD9/wAABAAKAAUAAAD+/wAABAALAAUAAAD5////BAAGAAMAAAD5/wAABAAGAAMAAAD6/wEABAAGAAMAAAD6/wIABAAGAAMAAAD6/wMABAAGAAMAAAD5/wMABAAGAAMAAAD5/wQABAAGAAMAAAD6/wQABAAGAAMAAAD7/wQABAAGAAMAAAD8/wQABAAGAAMAAAD9/wQABAAGAAMAAAD9/wMABAAGAAMAAAD8/wMABAAGAAMAAAD7/wMABAAGAAMAAAD4/wIABAAGAAMAAAD4/wEABAAGAAMAAAD5/wEABAAGAAMAAAD6/wAABAAGAAMAAAD6////BAAGAAMAAAD5/wIABAAGAAMAAAD7/wEABAAGAAMAAAD8/wEABAAGAAMAAAD9/wEABAAGAAMAAAD+/wEABAAGAAMAAAD+/wIABAAGAAMAAAD9/wIABAAGAAMAAAD8/wIABAAGAAMAAAD7/wIABAAGAAMAAAD+/wMABAAGAAMAAAD+/wQABAAGAAMAAAD4/wMABAAGAAMAAAD4/wQABAAGAAMAAAD4////BAAGAAMAAAD4//7/AAAEAA8AAAD4//3/AAAEAA4AAADx////AAACAA8AAADy////AAACAA8AAADz//7/AAADAA8AAADz////AAACAA8AAAD0//7/AAAEAA8AAAD0////AAACAA8AAAD1//7/AAABAA8AAAD1////AAACAA8AAAD2////AAACAA8AAAD1//v/AAABAAwAAAD1//z/AAABAA0AAAD1//3/AAABAA4AAAD2//v/AAACAAwAAAD2//z/AAACAA0AAAD2//3/AAACAA4AAAD2//7/AAACAA8AAAD3//v/AAADAAwAAAD3//z/AAADAA0AAAD3//3/AAADAA4AAAD3//7/AAADAA8AAAD4//v/AAAEAAwAAAD4//z/AAAEAA0AAADx//v/AAADAAwAAADx//z/AAADAA0AAADx//3/AAADAA4AAADx//7/AAADAA8AAADy//v/AAAEAAwAAADy//z/AAAEAA0AAADy//3/AAAEAA4AAADy//7/AAAEAA8AAADz//v/AAADAAwAAADz//z/AAADAA0AAADz//3/AAADAA4AAAD0//v/AAAEAAwAAAD0//z/AAAEAA0AAAD0//3/AAAEAA4AAADv//v/AAABAAwAAADv//z/AAABAA0AAADv//3/AAABAA4AAADv//7/AAABAA8AAADw//v/AAACAAwAAADw//z/AAACAA0AAADw//3/AAACAA4AAADw//7/AAACAA8AAAD3////AAACAA8AAADw////AAACAA8AAADv////AAACAA8AAAA=") tile_set = SubResource("TileSet_btr28") -[node name="BGTrees0" type="TileMapLayer" parent="Scene"] +[node name="BGTrees0" type="TileMapLayer" parent="Scene" unique_id=192241590] position = Vector2(-49, 59) tile_map_data = PackedByteArray("AAARAPn/BgAAAAEAAAARAPr/BgAAAAIAAAARAPv/BgAAAAMAAAARAPz/BgAAAAQAAAASAPj/BgABAAAAAAASAPn/BgABAAEAAAASAPr/BgABAAIAAAASAPv/BgABAAMAAAASAPz/BgABAAQAAAASAP3/BgABAAUAAAATAPj/BgACAAAAAAATAPn/BgACAAEAAAATAPr/BgACAAIAAAATAPv/BgACAAMAAAATAPz/BgACAAQAAAATAP3/BgACAAUAAAATAP7/BgACAAYAAAAUAPj/BgADAAAAAAAUAPn/BgADAAEAAAAUAPr/BgADAAIAAAAUAPv/BgADAAMAAAAUAPz/BgADAAQAAAAVAPn/BgAEAAEAAAAVAPr/BgAEAAIAAAAVAPv/BgAEAAMAAAAVAPz/BgAEAAQAAADx//n/BgAAAAEAAADx//r/BgAAAAIAAADx//v/BgAAAAMAAADx//z/BgAAAAQAAADy//j/BgABAAAAAADy//n/BgABAAEAAADy//r/BgABAAIAAADy//v/BgABAAMAAADy//z/BgABAAQAAADy//3/BgABAAUAAADz//j/BgACAAAAAADz//n/BgACAAEAAADz//r/BgACAAIAAADz//v/BgACAAMAAADz//z/BgACAAQAAADz//3/BgACAAUAAADz//7/BgACAAYAAAD0//j/BgADAAAAAAD0//n/BgADAAEAAAD0//r/BgADAAIAAAD0//v/BgADAAMAAAD0//z/BgADAAQAAAD1//n/BgAEAAEAAAD1//r/BgAEAAIAAAD1//v/BgAEAAMAAAD1//z/BgAEAAQAAAD1//7/AQAAABwAAAD1////AQAAAB0AAAD2//7/AQABABwAAAD2////AQABAB0AAAD3//7/AQACABwAAAD3////AQACAB0AAAD4////AQADAB0AAADv//7/AQAAABwAAADv////AQAAAB0AAADw//7/AQABABwAAADw////AQABAB0AAADx//7/AQACABwAAADx////AQACAB0AAADy////AQADAB0AAAD5//v/CAAWAAAAAAD5//z/CAAWAAEAAAD5//3/CAAWAAIAAAD5//7/CAAWAAMAAAD6//v/CAAXAAAAAAD6//z/CAAXAAEAAAD6//3/CAAXAAIAAAD6//7/CAAXAAMAAAD5////CAAUAAMAAAD6////CAAVAAMAAAD3//n/CAAaAAIAAAD3//r/CAAaAAMAAAD4//n/CAAbAAIAAAD4//r/CAAbAAMAAAA=") tile_set = SubResource("TileSet_btr28") -[node name="BackgroundDecor" type="TileMapLayer" parent="Scene"] +[node name="BackgroundDecor" type="TileMapLayer" parent="Scene" unique_id=1466162064] position = Vector2(-49, 59) tile_map_data = PackedByteArray("AAD9//7/AQAAAAQAAAD9////AQAAAAUAAAD+//3/AQABAAMAAAD+//7/AQABAAQAAAD+////AQABAAUAAAD///3/AQACAAMAAAD///7/AQACAAQAAAD/////AQACAAUAAAAAAP3/AQADAAMAAAAAAP7/AQADAAQAAAAAAP//AQADAAUAAAABAP3/AQAEAAMAAAABAP7/AQAEAAQAAAABAP//AQAEAAUAAAACAP7/AQAFAAQAAAACAP//AQAFAAUAAAAEAP7/AQAGAAQAAAAEAP//AQAGAAUAAAAFAP3/AQAHAAMAAAAFAP7/AQAHAAQAAAAFAP//AQAHAAUAAAAGAP3/AQAIAAMAAAAGAP7/AQAIAAQAAAAGAP//AQAIAAUAAAAHAP3/AQAJAAMAAAAHAP7/AQAJAAQAAAAHAP//AQAJAAUAAAAIAP3/AQAKAAMAAAAIAP7/AQAKAAQAAAAIAP//AQAKAAUAAAAJAP7/AQALAAQAAAAJAP//AQALAAUAAADx////AQAKABUAAADy////AQALABUAAADz//7/AQAMABQAAADz////AQAMABUAAAD0//7/AQANABQAAAD0////AQANABUAAAD1//7/AQAOABQAAAD1////AQAOABUAAAD2////AQAPABUAAAARAP//AQAKABUAAAASAP//AQALABUAAAATAP7/AQAMABQAAAATAP//AQAMABUAAAAUAP7/AQANABQAAAAUAP//AQANABUAAAAVAP7/AQAOABQAAAAVAP//AQAOABUAAAAWAP//AQAPABUAAAA=") tile_set = SubResource("TileSet_btr28") -[node name="LeafParticles" type="GPUParticles2D" parent="Scene"] +[node name="LeafParticles" type="GPUParticles2D" parent="Scene" unique_id=420003071] material = SubResource("CanvasItemMaterial_w330p") amount = 2 texture = ExtResource("14_w330p") @@ -1999,10 +2006,10 @@ visibility_rect = Rect2(-250, -100, 500, 200) process_material = SubResource("ParticleProcessMaterial_8brng") metadata/_edit_lock_ = true -[node name="FireContainer" type="Node2D" parent="Scene"] +[node name="FireContainer" type="Node2D" parent="Scene" unique_id=1267664590] metadata/_edit_lock_ = true -[node name="Smoke" type="GPUParticles2D" parent="Scene/FireContainer"] +[node name="Smoke" type="GPUParticles2D" parent="Scene/FireContainer" unique_id=1756501089] position = Vector2(1, 54) amount = 100 texture = ExtResource("15_erv2c") @@ -2011,44 +2018,44 @@ explosiveness = 0.06 randomness = 0.39 process_material = SubResource("ParticleProcessMaterial_w330p") -[node name="Fire" type="GPUParticles2D" parent="Scene/FireContainer"] +[node name="Fire" type="GPUParticles2D" parent="Scene/FireContainer" unique_id=1607591300] position = Vector2(0, 53) amount = 20 process_material = SubResource("ParticleProcessMaterial_okhi1") -[node name="FireLight" type="PointLight2D" parent="Scene/FireContainer"] +[node name="FireLight" type="PointLight2D" parent="Scene/FireContainer" unique_id=527865148] position = Vector2(0, 54) color = Color(0.65882355, 0.21960784, 0.13333334, 1) energy = 2.0 texture = SubResource("GradientTexture2D_okhi1") script = ExtResource("16_5kdtj") -[node name="Floor" type="TileMapLayer" parent="Scene"] +[node name="Floor" type="TileMapLayer" parent="Scene" unique_id=567094860] position = Vector2(-49, 59) tile_map_data = PackedByteArray("AAD9/wAAAAABAAwAAAD+/wAAAAACAAwAAAD//wAAAAADAAwAAAAAAAAAAAABAAwAAAABAAAAAAACAAwAAAACAAAAAAADAAwAAAADAAAAAAABAAwAAAAEAAAAAAACAAwAAAAFAAAAAAADAAwAAAAGAAAAAAABAAwAAAAHAAAAAAACAAwAAAAIAAAAAAADAAwAAAAJAAAAAAABAAwAAAAKAAAAAAACAAwAAAAKAAEAAAACAA0AAAAKAAIAAAACAA4AAAAKAAMAAAADAA4AAAAKAAQAAAADAA8AAAAHAAEAAAACAA0AAAAHAAIAAAACAA4AAAAHAAMAAAACAA4AAAAIAAEAAAADAA0AAAAIAAIAAAADAA4AAAAIAAMAAAADAA4AAAAJAAEAAAABAA0AAAAJAAIAAAABAA4AAAAJAAMAAAACAA4AAAAEAAEAAAACAA0AAAAEAAIAAAACAA4AAAAEAAMAAAADAA4AAAAFAAEAAAADAA0AAAAFAAIAAAADAA4AAAAFAAMAAAACAA4AAAAGAAEAAAABAA0AAAAGAAIAAAABAA4AAAAGAAMAAAADAA4AAAABAAEAAAACAA0AAAABAAIAAAACAA4AAAABAAMAAAACAA4AAAACAAEAAAADAA0AAAACAAIAAAADAA4AAAACAAMAAAADAA4AAAADAAEAAAABAA0AAAADAAIAAAABAA4AAAADAAMAAAACAA4AAAD+/wEAAAACAA0AAAD+/wIAAAACAA4AAAD+/wMAAAACAA8AAAD//wEAAAADAA0AAAD//wIAAAADAA4AAAD//wMAAAADAA8AAAAAAAEAAAABAA0AAAAAAAIAAAABAA4AAAAAAAMAAAABAA8AAAD9/wEAAAABAA0AAAD9/wIAAAABAA4AAAD9/wMAAAABAA8AAAAHAAQAAAACAA8AAAAIAAQAAAADAA8AAAAJAAQAAAACAA8AAAAEAAQAAAADAA8AAAAFAAQAAAACAA8AAAAGAAQAAAADAA8AAAABAAQAAAACAA8AAAACAAQAAAADAA8AAAADAAQAAAACAA8AAAD+/wQAAAACABAAAAD//wQAAAADABAAAAAAAAQAAAABABAAAAD9/wQAAAABABAAAADw/wAAAAAAAAwAAADw/wEAAAACAA4AAADw/wIAAAACAA8AAADw/wMAAAACAA4AAADw/wQAAAACAA8AAADx/wAAAAABAAwAAADx/wEAAAADAA4AAADx/wIAAAADAA8AAADx/wMAAAADAA4AAADx/wQAAAADAA8AAADy/wAAAAACAAwAAADy/wEAAAACAA0AAADy/wIAAAACAA4AAADy/wMAAAACAA8AAADy/wQAAAACABAAAADz/wAAAAADAAwAAADz/wEAAAADAA0AAADz/wIAAAADAA4AAADz/wMAAAADAA8AAADz/wQAAAADABAAAAD0/wAAAAABAAwAAAD0/wEAAAABAA0AAAD0/wIAAAABAA4AAAD0/wMAAAABAA8AAAD0/wQAAAABABAAAAD1/wAAAAACAAwAAAD1/wEAAAACAA0AAAD1/wIAAAACAA4AAAD1/wMAAAACAA8AAAD1/wQAAAACABAAAAD2/wAAAAADAAwAAAD2/wEAAAADAA0AAAD2/wIAAAADAA4AAAD2/wMAAAADAA8AAAD2/wQAAAADABAAAAD3/wAAAAABAAwAAAD3/wEAAAABAA0AAAD3/wIAAAABAA4AAAD3/wMAAAABAA8AAAD3/wQAAAABABAAAAD4/wAAAAACAAwAAAD4/wEAAAACAA0AAAD4/wIAAAACAA4AAAD4/wMAAAACAA8AAAD4/wQAAAACABAAAAD5/wAAAAADAAwAAAD5/wEAAAADAA0AAAD5/wIAAAADAA4AAAD5/wMAAAADAA8AAAD5/wQAAAADABAAAAD6/wAAAAABAAwAAAD6/wEAAAABAA0AAAD6/wIAAAABAA4AAAD6/wMAAAABAA8AAAD6/wQAAAABABAAAAD7/wAAAAACAAwAAAD7/wEAAAACAA0AAAD7/wIAAAACAA4AAAD7/wMAAAACAA8AAAD7/wQAAAACABAAAAD8/wAAAAADAAwAAAD8/wEAAAADAA0AAAD8/wIAAAADAA4AAAD8/wMAAAADAA8AAAD8/wQAAAADABAAAAALAAAAAAADAAwAAAALAAEAAAADAA0AAAALAAIAAAADAA4AAAALAAMAAAADAA8AAAALAAQAAAADABAAAAAMAAAAAAABAAwAAAAMAAEAAAABAA0AAAAMAAIAAAABAA4AAAAMAAMAAAABAA8AAAAMAAQAAAABABAAAAANAAAAAAACAAwAAAANAAEAAAACAA0AAAANAAIAAAACAA4AAAANAAMAAAACAA8AAAANAAQAAAACABAAAAAOAAAAAAADAAwAAAAOAAEAAAADAA0AAAAOAAIAAAADAA4AAAAOAAMAAAADAA8AAAAOAAQAAAADABAAAAAPAAAAAAABAAwAAAAPAAEAAAABAA0AAAAPAAIAAAABAA4AAAAPAAMAAAABAA8AAAAPAAQAAAABABAAAAAQAAAAAAACAAwAAAAQAAEAAAACAA0AAAAQAAIAAAACAA4AAAAQAAMAAAACAA8AAAAQAAQAAAACABAAAAARAAAAAAABAAwAAAARAAEAAAABAA0AAAARAAIAAAABAA4AAAARAAMAAAABAA8AAAARAAQAAAABABAAAAASAAAAAAACAAwAAAASAAEAAAACAA0AAAASAAIAAAACAA4AAAASAAMAAAACAA8AAAASAAQAAAACABAAAAATAAAAAAADAAwAAAATAAEAAAADAA0AAAATAAIAAAADAA4AAAATAAMAAAADAA8AAAATAAQAAAADABAAAAAUAAAAAAABAAwAAAAUAAEAAAABAA0AAAAUAAIAAAABAA4AAAAUAAMAAAABAA8AAAAUAAQAAAABABAAAAAVAAAAAAACAAwAAAAVAAEAAAACAA0AAAAVAAIAAAACAA4AAAAVAAMAAAACAA8AAAAVAAQAAAACABAAAAAWAAAAAAADAAwAAAAWAAEAAAADAA0AAAAWAAIAAAADAA4AAAAWAAMAAAADAA8AAAAWAAQAAAADABAAAADx/wUAAAADAA4AAADx/wYAAAADAA8AAADy/wUAAAADAA4AAADy/wYAAAADAA8AAADz/wUAAAACAA4AAADz/wYAAAACAA8AAAD0/wUAAAADAA4AAAD0/wYAAAADAA8AAAD1/wUAAAACAA4AAAD1/wYAAAACAA8AAAD2/wUAAAADAA4AAAD2/wYAAAADAA8AAAD3/wUAAAACAA4AAAD3/wYAAAACAA8AAAD4/wUAAAADAA4AAAD4/wYAAAADAA8AAAD5/wUAAAACAA4AAAD5/wYAAAACAA8AAAD6/wUAAAADAA4AAAD6/wYAAAADAA8AAAD7/wUAAAACAA4AAAD7/wYAAAACAA8AAAD8/wUAAAADAA4AAAD8/wYAAAADAA8AAAD9/wUAAAACAA4AAAD9/wYAAAACAA8AAAD+/wUAAAADAA4AAAD+/wYAAAADAA8AAAD//wUAAAACAA4AAAD//wYAAAACAA8AAAAAAAUAAAADAA4AAAAAAAYAAAADAA8AAAABAAUAAAACAA4AAAABAAYAAAACAA8AAAACAAUAAAADAA4AAAACAAYAAAADAA8AAAADAAUAAAACAA4AAAADAAYAAAACAA8AAAAEAAUAAAADAA4AAAAEAAYAAAADAA8AAAAFAAUAAAACAA4AAAAFAAYAAAACAA8AAAAGAAUAAAADAA4AAAAGAAYAAAADAA8AAAAHAAUAAAACAA4AAAAHAAYAAAACAA8AAAAIAAUAAAADAA4AAAAIAAYAAAADAA8AAAAJAAUAAAACAA4AAAAJAAYAAAACAA8AAAAKAAUAAAADAA4AAAAKAAYAAAADAA8AAAALAAUAAAACAA4AAAALAAYAAAACAA8AAAAMAAUAAAADAA4AAAAMAAYAAAADAA8AAAANAAUAAAACAA4AAAANAAYAAAACAA8AAAAOAAUAAAADAA4AAAAOAAYAAAADAA8AAAAPAAUAAAACAA4AAAAPAAYAAAACAA8AAAAQAAUAAAADAA4AAAAQAAYAAAADAA8AAAARAAUAAAACAA4AAAARAAYAAAACAA8AAAASAAUAAAADAA4AAAASAAYAAAADAA8AAAATAAUAAAACAA4AAAATAAYAAAACAA8AAAAUAAUAAAADAA4AAAAUAAYAAAADAA8AAAAVAAUAAAACAA4AAAAVAAYAAAACAA8AAAAWAAUAAAADAA4AAAAWAAYAAAADAA8AAADw/wUAAAACAA4AAADw/wYAAAACAA8AAAAKAP7/AQAOAAAAAAAKAP//AQAOAAEAAAALAP7/AQAPAAAAAAALAP//AQAPAAEAAAA=") tile_set = SubResource("TileSet_btr28") -[node name="InteractionLayer" type="Node2D" parent="Scene"] +[node name="InteractionLayer" type="Node2D" parent="Scene" unique_id=955061762] -[node name="Character" parent="Scene/InteractionLayer" instance=ExtResource("17_1hpkv")] +[node name="Character" parent="Scene/InteractionLayer" unique_id=916171989 instance=ExtResource("17_1hpkv")] position = Vector2(-62, 29) -[node name="StockPile" parent="Scene/InteractionLayer" instance=ExtResource("17_deeqb")] +[node name="StockPile" parent="Scene/InteractionLayer" unique_id=1961584119 instance=ExtResource("17_deeqb")] position = Vector2(-215, 51) -[node name="WoodPile" parent="Scene/InteractionLayer" groups=["wood_pile"] instance=ExtResource("17_oibj5")] +[node name="WoodPile" parent="Scene/InteractionLayer" unique_id=675748936 groups=["wood_pile"] instance=ExtResource("17_oibj5")] unique_name_in_owner = true position = Vector2(164, 48) -[node name="ForegroundDecor" type="TileMapLayer" parent="Scene"] +[node name="ForegroundDecor" type="TileMapLayer" parent="Scene" unique_id=115005832] position = Vector2(-49, 59) tile_map_data = PackedByteArray("AAACAP7/AQACAAYAAAACAP//AQACAAcAAAADAP7/AQADAAYAAAADAP//AQADAAcAAAAHAP//AQAYAAcAAAAIAP//AQAZAAcAAADz////AQAIAAkAAAD0////AQAJAAkAAAD3////AQAKAAkAAAD4////AQALAAkAAADw////AQAWAAcAAADx////AQAXAAcAAAD8////AQAGAA0AAAD9////AQAHAA0AAAD5////AQAGAA8AAAD6////AQAHAA8AAAAOAP//AQAIAA8AAAAPAP7/AQAJAA4AAAAPAP//AQAJAA8AAAAQAP7/AQAKAA4AAAAQAP//AQAKAA8AAAARAP//AQALAA8AAAATAP//AQAGAA0AAAAUAP//AQAHAA0AAAAJAP//AQAGAA0AAAAKAP//AQAHAA0AAAALAP//AQAKAAkAAAAMAP//AQALAAkAAAA=") tile_set = SubResource("TileSet_btr28") -[node name="Camera2D" type="Camera2D" parent="."] +[node name="Camera2D" type="Camera2D" parent="." unique_id=1719721614] zoom = Vector2(2, 2) -[node name="UI" type="Control" parent="."] +[node name="UI" type="Control" parent="." unique_id=1827364964] layout_mode = 3 anchors_preset = 0 offset_right = 40.0 @@ -2056,7 +2063,8 @@ offset_bottom = 40.0 theme = ExtResource("22_q7h7c") script = ExtResource("17_q7h7c") -[node name="Panel" type="Panel" parent="UI"] +[node name="Panel" type="Panel" parent="UI" unique_id=35561461] +visible = false layout_mode = 0 offset_left = 150.0 offset_top = -133.0 @@ -2064,7 +2072,7 @@ offset_right = 195.0 offset_bottom = -133.0 theme = ExtResource("22_q7h7c") -[node name="ModifiersLabel" type="Label" parent="UI/Panel"] +[node name="ModifiersLabel" type="Label" parent="UI/Panel" unique_id=873641585] unique_name_in_owner = true layout_mode = 0 offset_top = -16.0 @@ -2072,7 +2080,7 @@ offset_right = 45.0 offset_bottom = -5.0 theme_override_font_sizes/font_size = 12 -[node name="Currencies" type="VBoxContainer" parent="UI"] +[node name="Currencies" type="VBoxContainer" parent="UI" unique_id=1952407607] layout_mode = 0 offset_left = -284.0 offset_top = -159.0 @@ -2081,25 +2089,25 @@ offset_bottom = -103.0 theme_override_constants/separation = 5 alignment = 1 -[node name="CurrencyLabel" type="Label" parent="UI/Currencies"] +[node name="CurrencyLabel" type="Label" parent="UI/Currencies" unique_id=508512755] unique_name_in_owner = true layout_mode = 2 theme = ExtResource("22_q7h7c") text = "Currency" -[node name="WoodLabel" type="Label" parent="UI/Currencies"] +[node name="WoodLabel" type="Label" parent="UI/Currencies" unique_id=173301448] unique_name_in_owner = true layout_mode = 2 theme = ExtResource("22_q7h7c") text = "0" -[node name="StockLabel" type="Label" parent="UI/Currencies"] +[node name="StockLabel" type="Label" parent="UI/Currencies" unique_id=1137115173] unique_name_in_owner = true layout_mode = 2 theme = ExtResource("22_q7h7c") text = "0" -[node name="UnlockContainer" type="GridContainer" parent="UI"] +[node name="UnlockContainer" type="GridContainer" parent="UI" unique_id=1701514762] layout_mode = 1 anchors_preset = 15 anchor_right = 1.0 @@ -2112,7 +2120,136 @@ grow_horizontal = 2 grow_vertical = 2 columns = 5 -[node name="TextureButton" parent="UI/UnlockContainer" instance=ExtResource("19_v4v8k")] +[node name="TextureButton" parent="UI/UnlockContainer" unique_id=1669380068 instance=ExtResource("19_v4v8k")] layout_mode = 2 size_flags_horizontal = 0 size_flags_vertical = 0 + +[node name="Timer" type="Label" parent="UI" unique_id=405529286] +unique_name_in_owner = true +layout_mode = 0 +offset_left = -20.0 +offset_top = -157.0 +offset_right = 20.0 +offset_bottom = -144.0 +text = "00:00:00" + +[node name="GameCompleted" type="Panel" parent="UI" unique_id=1824061781] +unique_name_in_owner = true +process_mode = 2 +visible = false +layout_mode = 0 +offset_left = -292.0 +offset_top = -166.0 +offset_right = 294.0 +offset_bottom = 165.0 +theme_override_styles/panel = SubResource("StyleBoxFlat_q7h7c") + +[node name="YouWinLabel" type="Label" parent="UI/GameCompleted" unique_id=1143708756] +layout_mode = 0 +offset_left = 221.0 +offset_top = 26.0 +offset_right = 364.0 +offset_bottom = 58.0 +theme_override_font_sizes/font_size = 40 +text = "YOU WIN!" +horizontal_alignment = 1 + +[node name="CompletionTimeLabel" type="Label" parent="UI/GameCompleted" unique_id=1845505160] +layout_mode = 0 +offset_left = 221.0 +offset_top = 211.0 +offset_right = 364.0 +offset_bottom = 243.0 +theme_override_font_sizes/font_size = 40 +text = "00:00:00" +horizontal_alignment = 1 + +[node name="Label" type="Label" parent="UI/GameCompleted" unique_id=25876759] +layout_mode = 0 +offset_left = 106.0 +offset_top = 76.0 +offset_right = 479.0 +offset_bottom = 151.33334 +text = "Congratulations on your retirement. + +You can submit your score to the leaderboard if you want. + +Then you can go about your day, or continue playing for some reason. + + + +Completion Time" +horizontal_alignment = 1 + +[node name="TextEdit" type="TextEdit" parent="UI/GameCompleted" unique_id=637671853] +layout_mode = 0 +offset_left = 35.0 +offset_top = 277.0 +offset_right = 166.0 +offset_bottom = 304.0 +theme = ExtResource("22_q7h7c") +placeholder_text = "Your Name (Optional)" + +[node name="SubmitScoreButton" type="TextureButton" parent="UI/GameCompleted" unique_id=111534642] +custom_minimum_size = Vector2(100, 25) +layout_mode = 0 +offset_left = 171.0 +offset_top = 278.0 +offset_right = 271.0 +offset_bottom = 303.0 +size_flags_horizontal = 0 +size_flags_vertical = 0 +tooltip_text = "I need a tooltip bro" +texture_normal = ExtResource("23_lv1cq") +texture_pressed = ExtResource("24_k8i0y") +texture_hover = ExtResource("25_hcndq") +texture_disabled = ExtResource("26_chdjo") +ignore_texture_size = true +stretch_mode = 0 + +[node name="CenterContainer" type="CenterContainer" parent="UI/GameCompleted/SubmitScoreButton" unique_id=1441768385] +clip_contents = true +custom_minimum_size = Vector2(100, 25) +layout_mode = 0 +offset_right = 100.0 +offset_bottom = 25.0 + +[node name="Label" type="Label" parent="UI/GameCompleted/SubmitScoreButton/CenterContainer" unique_id=365890678] +layout_mode = 2 +theme = ExtResource("22_q7h7c") +text = "Submit Score" +horizontal_alignment = 1 + +[node name="ContinueButton" type="TextureButton" parent="UI/GameCompleted" unique_id=1202982034] +unique_name_in_owner = true +custom_minimum_size = Vector2(100, 25) +layout_mode = 0 +offset_left = 459.0 +offset_top = 278.0 +offset_right = 559.0 +offset_bottom = 303.0 +size_flags_horizontal = 0 +size_flags_vertical = 0 +tooltip_text = "I need a tooltip bro" +texture_normal = ExtResource("23_lv1cq") +texture_pressed = ExtResource("24_k8i0y") +texture_hover = ExtResource("25_hcndq") +texture_disabled = ExtResource("26_chdjo") +ignore_texture_size = true +stretch_mode = 0 + +[node name="CenterContainer" type="CenterContainer" parent="UI/GameCompleted/ContinueButton" unique_id=963605753] +clip_contents = true +custom_minimum_size = Vector2(100, 25) +layout_mode = 0 +offset_right = 100.0 +offset_bottom = 25.0 + +[node name="Label" type="Label" parent="UI/GameCompleted/ContinueButton/CenterContainer" unique_id=37660974] +layout_mode = 2 +theme = ExtResource("22_q7h7c") +text = "Continue Whittling" +horizontal_alignment = 1 + +[connection signal="pressed" from="UI/GameCompleted/ContinueButton" to="UI" method="_on_continue_button_pressed"] diff --git a/scenes/scripts/button.gd b/scenes/scripts/button.gd index 29cf786..13baf3f 100644 --- a/scenes/scripts/button.gd +++ b/scenes/scripts/button.gd @@ -10,7 +10,7 @@ func _ready(): pressed.connect(_on_button_pressed) func setup(unlock_data): - Log.pr("Setting up button for unlock:", unlock_data.unlock_name) + # Log.pr("Setting up button for unlock:", unlock_data.unlock_name) unlock_id = unlock_data.unlock_id # Store the ID if label: label.visible = false @@ -23,7 +23,7 @@ func setup(unlock_data): Log.pr("Warning: Label node not found in button.") func _on_button_pressed(): - Log.pr("Button pressed, unlocking item:", unlock_id) + # Log.pr("Button pressed, unlocking item:", unlock_id) Unlocks.unlock_item(unlock_id) func adjust_label_font_size(): diff --git a/scenes/scripts/ui_control.gd b/scenes/scripts/ui_control.gd index 474c0cc..f94d094 100644 --- a/scenes/scripts/ui_control.gd +++ b/scenes/scripts/ui_control.gd @@ -5,6 +5,13 @@ extends Control @onready var stock_label: Label = %StockLabel @onready var modifiers_label: Label = %ModifiersLabel +@onready var timer_label : Label = %Timer + +@onready var game_complete_screen : Panel = %GameCompleted +@onready var continue_button : TextureButton = %ContinueButton + +var game_timer : Timer +var elapsed_time := 0.0 func _ready(): populate_modifiers_display() @@ -12,6 +19,14 @@ func _ready(): update_currency_label() update_wood_label() update_stock_label() + + game_timer = Timer.new() + game_timer.wait_time = 1.0 + game_timer.one_shot = false + game_timer.autostart = true + add_child(game_timer) + + game_timer.timeout.connect(_on_timer_tick) currency_label.add_theme_color_override("font_color", Global.money_color) wood_label.add_theme_color_override("font_color", Global.wood_color) @@ -24,6 +39,10 @@ func _ready(): Inventory.stock_added.connect(spawn_stock_increase) Inventory.stock_changed.connect(_on_currency_changed) Unlocks.item_unlocked.connect(populate_unlock_buttons) + GameManager.currency_goal_met.connect(_on_currency_goal_met) + + # get_tree().paused = true + func update_currency_label(): currency_label.text = Global.currency_symbol + " " + str(int(Inventory.get_currency())) @@ -99,3 +118,30 @@ func _on_currency_changed(_value): update_currency_label() update_wood_label() update_stock_label() + + if Inventory.get_currency() >= Global.target_currency: + game_timer.stop() + +func _on_timer_tick(): + elapsed_time += 1 + timer_label.text = format_time(elapsed_time) + +func _on_currency_goal_met(): + Log.pr("Currency goal met!") + get_tree().paused = true + game_complete_screen.visible = true + +func format_time(seconds: float) -> String: + var total_seconds := int(seconds) + + var hours := total_seconds / 3600 + var minutes := (total_seconds % 3600) / 60 + var secs := total_seconds % 60 + + return "%02d:%02d:%02d" % [hours, minutes, secs] + + +func _on_continue_button_pressed() -> void: + Global.game_continue_pressed = true + game_complete_screen.visible = false + get_tree().paused = false diff --git a/scenes/simulator.tscn b/scenes/simulator.tscn new file mode 100644 index 0000000..0774d06 --- /dev/null +++ b/scenes/simulator.tscn @@ -0,0 +1,124 @@ +[gd_scene format=3 uid="uid://br6hgvb4buyji"] + +[ext_resource type="Script" uid="uid://bup76ad02kuse" path="res://scripts/sim_cached.gd" id="1_sim"] + +[node name="Simulator" type="Control" unique_id=1833845714] +layout_mode = 3 +anchors_preset = 15 +anchor_right = 1.0 +anchor_bottom = 1.0 +grow_horizontal = 2 +grow_vertical = 2 +script = ExtResource("1_sim") + +[node name="MarginContainer" type="MarginContainer" parent="." unique_id=689981813] +layout_mode = 1 +anchors_preset = 15 +anchor_right = 1.0 +anchor_bottom = 1.0 +grow_horizontal = 2 +grow_vertical = 2 +theme_override_constants/margin_left = 20 +theme_override_constants/margin_top = 20 +theme_override_constants/margin_right = 20 +theme_override_constants/margin_bottom = 20 + +[node name="VBoxContainer" type="VBoxContainer" parent="MarginContainer" unique_id=1425713346] +layout_mode = 2 +theme_override_constants/separation = 15 + +[node name="Title" type="Label" parent="MarginContainer/VBoxContainer" unique_id=1101365395] +layout_mode = 2 +theme_override_font_sizes/font_size = 32 +text = "Unlock Simulator" +horizontal_alignment = 1 + +[node name="StatusPanel" type="PanelContainer" parent="MarginContainer/VBoxContainer" unique_id=21717961] +layout_mode = 2 + +[node name="VBox" type="VBoxContainer" parent="MarginContainer/VBoxContainer/StatusPanel" unique_id=846585479] +layout_mode = 2 +theme_override_constants/separation = 8 + +[node name="StatusLabel" type="Label" parent="MarginContainer/VBoxContainer/StatusPanel/VBox" unique_id=234737032] +layout_mode = 2 +theme_override_font_sizes/font_size = 20 +text = "Status: Initializing..." + +[node name="ProgressLabel" type="Label" parent="MarginContainer/VBoxContainer/StatusPanel/VBox" unique_id=2064314389] +layout_mode = 2 +theme_override_font_sizes/font_size = 16 +text = "Progress: 0.0% (0/0)" + +[node name="ProgressBar" type="ProgressBar" parent="MarginContainer/VBoxContainer/StatusPanel/VBox" unique_id=1093115744] +custom_minimum_size = Vector2(0, 30) +layout_mode = 2 +max_value = 1.0 +step = 0.001 +show_percentage = false + +[node name="RateLabel" type="Label" parent="MarginContainer/VBoxContainer/StatusPanel/VBox" unique_id=2006247697] +layout_mode = 2 +theme_override_font_sizes/font_size = 16 +text = "Speed: 0.0 combos/sec" + +[node name="ETALabel" type="Label" parent="MarginContainer/VBoxContainer/StatusPanel/VBox" unique_id=300266005] +layout_mode = 2 +theme_override_font_sizes/font_size = 16 +text = "ETA: Calculating..." + +[node name="CachePanel" type="PanelContainer" parent="MarginContainer/VBoxContainer" unique_id=242908015] +layout_mode = 2 + +[node name="VBox" type="VBoxContainer" parent="MarginContainer/VBoxContainer/CachePanel" unique_id=1164261399] +layout_mode = 2 +theme_override_constants/separation = 8 + +[node name="CacheTitle" type="Label" parent="MarginContainer/VBoxContainer/CachePanel/VBox" unique_id=615421163] +layout_mode = 2 +theme_override_font_sizes/font_size = 20 +text = "Cache Statistics" + +[node name="CacheHitsLabel" type="Label" parent="MarginContainer/VBoxContainer/CachePanel/VBox" unique_id=1993375767] +layout_mode = 2 +theme_override_font_sizes/font_size = 16 +text = "Cache Hits: 0" + +[node name="CacheMissesLabel" type="Label" parent="MarginContainer/VBoxContainer/CachePanel/VBox" unique_id=159876992] +layout_mode = 2 +theme_override_font_sizes/font_size = 16 +text = "Cache Misses: 0" + +[node name="CacheRateLabel" type="Label" parent="MarginContainer/VBoxContainer/CachePanel/VBox" unique_id=51938306] +layout_mode = 2 +theme_override_font_sizes/font_size = 16 +text = "Hit Rate: 0.0%" + +[node name="CacheSizeLabel" type="Label" parent="MarginContainer/VBoxContainer/CachePanel/VBox" unique_id=2001183562] +layout_mode = 2 +theme_override_font_sizes/font_size = 16 +text = "Cache Entries: 0" + +[node name="ResultsPanel" type="PanelContainer" parent="MarginContainer/VBoxContainer" unique_id=1825974467] +layout_mode = 2 +size_flags_vertical = 3 + +[node name="VBox" type="VBoxContainer" parent="MarginContainer/VBoxContainer/ResultsPanel" unique_id=339315001] +layout_mode = 2 + +[node name="ResultsTitle" type="Label" parent="MarginContainer/VBoxContainer/ResultsPanel/VBox" unique_id=975903988] +layout_mode = 2 +theme_override_font_sizes/font_size = 20 +text = "Results" + +[node name="ScrollContainer" type="ScrollContainer" parent="MarginContainer/VBoxContainer/ResultsPanel/VBox" unique_id=1950199865] +layout_mode = 2 +size_flags_vertical = 3 + +[node name="ResultsLabel" type="RichTextLabel" parent="MarginContainer/VBoxContainer/ResultsPanel/VBox/ScrollContainer" unique_id=107644773] +layout_mode = 2 +size_flags_horizontal = 3 +size_flags_vertical = 3 +bbcode_enabled = true +text = "Waiting for results..." +fit_content = true diff --git a/scripts/audio.gd b/scripts/audio.gd index 0ffe7d4..ea268d5 100644 --- a/scripts/audio.gd +++ b/scripts/audio.gd @@ -32,4 +32,4 @@ func play_background_music(): music_player.volume_db = -10 # Set volume to a comfortable level music_player.autoplay = true add_child(music_player) - music_player.play() \ No newline at end of file + music_player.play() diff --git a/scripts/game_manager.gd b/scripts/game_manager.gd index 69732ff..4f71a30 100644 --- a/scripts/game_manager.gd +++ b/scripts/game_manager.gd @@ -2,12 +2,28 @@ extends Node var tick: Timer var tick_count: int = 0 @onready var tick_process: TickProcess = TickProcess.new() +var bridge = null + +signal currency_goal_met() func _ready(): - #var simulator = UnlockSimulator.new() - #add_child(simulator) Unlocks.apply_modifiers() setup_tick_timer() + + if OS.has_feature("web"): + bridge = JavaScriptBridge.get_interface("godotBridge") + +func check_currency_goal(): + if Global.game_continue_pressed == false: + if Inventory.get_currency() >= Global.target_currency: + currency_goal_met.emit() + + ## TODO + ## Update this so there's some javascript that does something + ## Maybe needs offloading to whatever UI we show when the game + ## goal is completed. TBD. + if bridge != null: + bridge.ping() func setup_tick_timer(): tick = Timer.new() @@ -19,5 +35,4 @@ func setup_tick_timer(): func _on_tick_timeout(): tick_count += 1 tick_process.tick() - Log.pr("Tick", str(tick_count)) - Log.pr("Current Currency:", Inventory.get_currency()) + check_currency_goal() diff --git a/scripts/globals.gd b/scripts/globals.gd index 99492e3..80a6041 100644 --- a/scripts/globals.gd +++ b/scripts/globals.gd @@ -1,7 +1,8 @@ extends Node # SETTINGS -var play_background_music: bool = false +var play_background_music: bool = true +var game_continue_pressed : bool = false # STRINGS var currency_symbol: String = "¥" @@ -12,16 +13,17 @@ var wood_color: Color = Color(0.95, 0.6, 0.35) # Light pumpkin orange (autumn le var stock_color: Color = Color(0.6, 0.75, 0.95) # Light periwinkle blue (clear autumn sky) # GAMEPLAY VALUES -var base_sale_price: float = 100 +var target_currency: float = 1000 +var base_sale_price: float = 30 var base_wood_respawn: float = 5 # seconds var wood_per_click: float = 5 var cost_per_whittle: float = 1 # This is how many items can be produced per tick var base_purchase_rate: float = 1 -var wholesale_unlock_id = 5 -var wholesale_bundle_size = 100 -var wholesale_discount_multiplier = 1.2 +var wholesale_unlock_id: int = 5 +var wholesale_bundle_size: int = 100 +var wholesale_discount_multiplier: float = 1.2 -var multicraft_unlock_id = 6 +var multicraft_unlock_id: int = 6 -var autowood_unlock_id = 7 \ No newline at end of file +var autowood_unlock_id: int = 7 diff --git a/scripts/inventory.gd b/scripts/inventory.gd index 9084bfb..63fd965 100644 --- a/scripts/inventory.gd +++ b/scripts/inventory.gd @@ -49,7 +49,7 @@ func get_stock() -> float: return inventory.stock func add_stock(amount: float): - Log.pr("Adding stock: " + str(amount)) + # Log.pr("Adding stock: " + str(amount)) inventory.stock += amount stock_added.emit(amount, inventory.stock) stock_changed.emit(inventory.stock) diff --git a/scripts/sim.gd b/scripts/sim.gd deleted file mode 100644 index 5b9d084..0000000 --- a/scripts/sim.gd +++ /dev/null @@ -1,417 +0,0 @@ -class_name UnlockSimulator -extends Node - -# Load the actual game resources -var unlock_collection: UnlockDataCollection = load("res://resources/UnlockData.tres") -var inventory_resource: InventoryResource = load("res://resources/InventoryData.tres") - -# Results tracking -var all_results: Array[Dictionary] = [] -var results_mutex: Mutex = Mutex.new() - -# Manual thread pool -var num_threads: int = 12 # Increase this for more CPU usage -var threads: Array[Thread] = [] -var task_queue: Array[Dictionary] = [] -var queue_mutex: Mutex = Mutex.new() -var completed_count: int = 0 -var completed_mutex: Mutex = Mutex.new() -var active_threads: int = 0 -var threads_done: bool = false - -var start_time: int = 0 -var total_combinations: int = 0 -var last_progress_time: int = 0 -var monitoring_active: bool = false - -func _ready(): - print("=== Unlock Simulator Started ===") - var cpu_count = OS.get_processor_count() - print("CPU cores detected: %d" % cpu_count) - print("Creating %d worker threads (adjust num_threads variable for more/less)" % num_threads) - run_comprehensive_test() - -func _process(_delta): - if monitoring_active: - # Only update progress once per second - var current_time = Time.get_ticks_msec() - if current_time - last_progress_time >= 1000: - last_progress_time = current_time - update_progress() - -func update_progress(): - """Update progress display""" - var current_count = 0 - completed_mutex.lock() - current_count = completed_count - completed_mutex.unlock() - - # Check if all work is complete - if current_count >= total_combinations: - monitoring_active = false - finish_processing() - return - - var percent = float(current_count) / total_combinations * 100.0 - var elapsed = (Time.get_ticks_msec() - start_time) / 1000.0 - var rate = current_count / elapsed if elapsed > 0 else 0 - var eta_seconds = (total_combinations - current_count) / rate if rate > 0 else 0 - - # Format ETA - var eta_str = "" - if eta_seconds > 0: - var eta_minutes = int(eta_seconds) / 60 - var eta_secs = int(eta_seconds) % 60 - if eta_minutes > 0: - eta_str = "%dm %ds" % [eta_minutes, eta_secs] - else: - eta_str = "%ds" % eta_secs - else: - eta_str = "calculating..." - - print("Progress: %.1f%% (%d/%d) - %.1f combos/sec - ETA: %s" % [ - percent, current_count, total_combinations, rate, eta_str - ]) - -func worker_thread(thread_id: int): - """Worker thread function that pulls tasks from the queue""" - while true: - # Get next task from queue - var task_data = null - queue_mutex.lock() - if task_queue.size() > 0: - task_data = task_queue.pop_front() - queue_mutex.unlock() - - # If no more tasks, exit - if task_data == null: - break - - # Process the task - var result = simulate_rank_combination_pure(task_data.combo, task_data.unlock_data, 100000) - - # Store result - results_mutex.lock() - all_results.append(result) - results_mutex.unlock() - - # Increment counter - completed_mutex.lock() - completed_count += 1 - completed_mutex.unlock() - -func simulate_rank_combination_pure(rank_targets: Dictionary, unlock_data_array: Array, max_ticks: int) -> Dictionary: - """Pure simulation function that can run in parallel""" - var currency: float = 0.0 - var stock: float = 0.0 - - # Create unlock instances from serialized data - var unlocks: Array = [] - for unlock_data in unlock_data_array: - var unlock = UnlockDataResource.new() - unlock.unlock_id = unlock_data.unlock_id - unlock.unlock_name = unlock_data.unlock_name - unlock.base_cost = unlock_data.base_cost - unlock.is_scaling = unlock_data.is_scaling - unlock.max_rank = unlock_data.max_rank - unlock.cost_scaling_multiplier = unlock_data.cost_scaling_multiplier - unlock.effect_scaling_multiplier = unlock_data.effect_scaling_multiplier - unlock.base_modifiers = unlock_data.base_modifiers.duplicate() - unlock.is_unlocked = false - unlock.current_rank = 0 - unlocks.append(unlock) - - var ticks = 0 - var purchases: Array[Dictionary] = [] - var current_ranks = {} - - # Initialize current ranks - for unlock_id in rank_targets.keys(): - current_ranks[unlock_id] = 0 - - # Helper to check if all targets reached - var all_targets_reached = func() -> bool: - for unlock_id in rank_targets.keys(): - if current_ranks[unlock_id] < rank_targets[unlock_id]: - return false - return true - - # Calculate modifiers helper - var calc_modifiers = func() -> Dictionary: - var mods = { - "sale_price_modifier": 1.0, - "speed_modifier": 1.0, - "efficiency_modifier": 1.0, - "wood_respawn_modifier": 1.0, - "wood_per_click_modifier": 1.0, - "purchase_rate_modifier": 1.0, - } - for unlock in unlocks: - if unlock.is_unlocked: - var unlock_modifiers = unlock.get_current_modifiers() - for key in unlock_modifiers.keys(): - if mods.has(key): - mods[key] *= unlock_modifiers[key] - return mods - - var modifiers = calc_modifiers.call() - - while ticks < max_ticks and currency < 100000.0: - # Try to buy the cheapest available unlock that hasn't reached its target - var cheapest_unlock_id = null - var cheapest_cost = INF - var cheapest_unlock_obj = null - - for unlock_id in rank_targets.keys(): - if current_ranks[unlock_id] < rank_targets[unlock_id]: - # Find the unlock object - var unlock = null - for u in unlocks: - if u.unlock_id == unlock_id: - unlock = u - break - - if unlock and unlock.can_rank_up(): - var cost = unlock.get_next_cost() - if cost < cheapest_cost and currency >= cost: - cheapest_cost = cost - cheapest_unlock_id = unlock_id - cheapest_unlock_obj = unlock - - # Purchase the cheapest unlock if found - if cheapest_unlock_obj != null: - currency -= cheapest_cost - cheapest_unlock_obj.unlock() - current_ranks[cheapest_unlock_id] += 1 - - # Recalculate modifiers - modifiers = calc_modifiers.call() - - purchases.append({ - "tick": ticks, - "unlock_id": cheapest_unlock_id, - "unlock_name": cheapest_unlock_obj.unlock_name, - "rank": cheapest_unlock_obj.current_rank, - "currency": currency, - "cost_paid": cheapest_cost, - "modifiers_after": modifiers.duplicate() - }) - - # Simulate one tick - var items_per_tick = Global.cost_per_whittle * modifiers.get("efficiency_modifier", 1.0) - stock += items_per_tick - - var demand = Global.base_purchase_rate * modifiers.get("purchase_rate_modifier", 1.0) - var items_sold = min(stock, demand) - stock -= items_sold - - var price_per_item = Global.base_sale_price * modifiers.get("sale_price_modifier", 1.0) - var revenue = items_sold * price_per_item - currency += revenue - - ticks += 1 - - # Check if we've reached target and 10K - if all_targets_reached.call() and currency >= 100000.0: - break - - var success = currency >= 100000.0 - - return { - "rank_targets": rank_targets, - "success": success, - "ticks": ticks if success else -1, - "final_currency": currency, - "purchases": purchases, - "time_formatted": format_time(ticks) if success else "Failed" - } - -func format_time(ticks: int) -> String: - var seconds = ticks - var minutes = seconds / 60 - var hours = minutes / 60 - - if hours > 0: - return "%dh %dm %ds" % [hours, minutes % 60, seconds % 60] - elif minutes > 0: - return "%dm %ds" % [minutes, seconds % 60] - else: - return "%ds" % seconds - -func generate_rank_combinations(max_ranks_per_unlock: int = 10) -> Array[Dictionary]: - """Generate all combinations of ranks for the first 4 unlocks""" - var combinations: Array[Dictionary] = [] - - # Get first 4 unlock IDs - var unlock_ids = [] - for i in range(min(4, unlock_collection.unlocks.size())): - unlock_ids.append(unlock_collection.unlocks[i].unlock_id) - - print("Generating combinations for unlocks: ", unlock_ids) - - # Generate all combinations (0 to max_ranks for each unlock) - for rank1 in range(max_ranks_per_unlock + 1): - for rank2 in range(max_ranks_per_unlock + 1): - for rank3 in range(max_ranks_per_unlock + 1): - for rank4 in range(max_ranks_per_unlock + 1): - # Skip the all-zeros case - if rank1 == 0 and rank2 == 0 and rank3 == 0 and rank4 == 0: - continue - - var combination = {} - if rank1 > 0: - combination[unlock_ids[0]] = rank1 - if rank2 > 0: - combination[unlock_ids[1]] = rank2 - if rank3 > 0: - combination[unlock_ids[2]] = rank3 - if rank4 > 0: - combination[unlock_ids[3]] = rank4 - - combinations.append(combination) - - return combinations - -func serialize_unlock_data() -> Array: - """Convert unlock collection to serializable data for threads""" - var unlock_data = [] - for unlock in unlock_collection.unlocks: - unlock_data.append({ - "unlock_id": unlock.unlock_id, - "unlock_name": unlock.unlock_name, - "base_cost": unlock.base_cost, - "is_scaling": unlock.is_scaling, - "max_rank": unlock.max_rank, - "cost_scaling_multiplier": unlock.cost_scaling_multiplier, - "effect_scaling_multiplier": unlock.effect_scaling_multiplier, - "base_modifiers": unlock.base_modifiers.duplicate() - }) - return unlock_data - -func run_comprehensive_test(max_ranks: int = 10): - """Test all combinations of ranks up to max_ranks for each unlock""" - print("\n=== Available Unlocks ===") - for unlock in unlock_collection.unlocks: - print("ID: %d | %s | Base Cost: %d | Scaling: %s" % [ - unlock.unlock_id, - unlock.unlock_name, - unlock.base_cost, - "Yes" if unlock.is_scaling else "No" - ]) - print(" Modifiers: ", unlock.base_modifiers) - - print("\n=== Global Constants ===") - print("Base Sale Price: %s" % Global.base_sale_price) - print("Base Purchase Rate: %s" % Global.base_purchase_rate) - print("Cost Per Whittle: %s" % Global.cost_per_whittle) - - # Generate all combinations - var combinations = generate_rank_combinations(max_ranks) - total_combinations = combinations.size() - print("\n=== Testing %d Combinations ===" % total_combinations) - - # Serialize unlock data for threads - var unlock_data = serialize_unlock_data() - - # Fill task queue - task_queue.clear() - for combo in combinations: - task_queue.append({ - "combo": combo, - "unlock_data": unlock_data - }) - - # Reset counters - completed_count = 0 - all_results.clear() - threads_done = false - start_time = Time.get_ticks_msec() - last_progress_time = start_time - monitoring_active = true - - # Create and start threads - print("Starting %d worker threads..." % num_threads) - for i in range(num_threads): - var thread = Thread.new() - thread.start(worker_thread.bind(i)) - threads.append(thread) - - print("All threads started, processing...") - -func finish_processing(): - """Called when all processing is complete""" - print("\nAll combinations complete! Waiting for threads to finish...") - - # Wait for all threads to finish - for thread in threads: - thread.wait_to_finish() - threads.clear() - threads_done = true - - print("All threads finished. Processing results...") - - var total_time = (Time.get_ticks_msec() - start_time) / 1000.0 - - # Print results - print("\n=== RESULTS ===") - print("Total time: %.1f seconds" % total_time) - print("Total combinations tested: %d" % all_results.size()) - - var successful = all_results.filter(func(r): return r.success) - print("Successful strategies: %d" % successful.size()) - - if successful.size() > 0: - # Sort by ticks (fastest first) - successful.sort_custom(func(a, b): return a.ticks < b.ticks) - - print("\n=== TOP 10 FASTEST STRATEGIES ===") - for i in range(min(10, successful.size())): - var result = successful[i] - print("\n#%d: %s (%d ticks)" % [i + 1, result.time_formatted, result.ticks]) - - # Format ranks with unlock names - var rank_display = [] - for unlock_id in result.rank_targets.keys(): - var unlock_name = get_unlock_name_by_id(unlock_id) - var ranks = result.rank_targets[unlock_id] - rank_display.append("%s: %d" % [unlock_name, ranks]) - print("Target Ranks: %s" % ", ".join(rank_display)) - - # Show purchase order - print("Purchase Order:") - for purchase in result.purchases: - var key_mods = "" - if purchase.has("modifiers_after"): - var mods = purchase.modifiers_after - key_mods = " [Sale:%.2fx Eff:%.2fx Demand:%.2fx]" % [ - mods.get("sale_price_modifier", 1.0), - mods.get("efficiency_modifier", 1.0), - mods.get("purchase_rate_modifier", 1.0) - ] - var cost_info = "" - if purchase.has("cost_paid"): - cost_info = " (paid %d)" % purchase.cost_paid - print(" @%s: %s -> Rank %d%s - %.0f currency%s" % [ - format_time(purchase.tick), - purchase.unlock_name, - purchase.rank, - cost_info, - purchase.currency, - key_mods - ]) - else: - print("\nNo successful strategies found!") - -func get_unlock_name_by_id(unlock_id: int) -> String: - """Helper function to get unlock name by ID""" - for unlock in unlock_collection.unlocks: - if unlock.unlock_id == unlock_id: - return unlock.unlock_name - return "Unknown" - -func _exit_tree(): - # Clean up threads - monitoring_active = false - for thread in threads: - if thread.is_alive(): - thread.wait_to_finish() \ No newline at end of file diff --git a/scripts/sim.gd.uid b/scripts/sim.gd.uid deleted file mode 100644 index e6cfc40..0000000 --- a/scripts/sim.gd.uid +++ /dev/null @@ -1 +0,0 @@ -uid://daala7g4otu04 diff --git a/scripts/sim_cached.gd b/scripts/sim_cached.gd new file mode 100644 index 0000000..a719385 --- /dev/null +++ b/scripts/sim_cached.gd @@ -0,0 +1,931 @@ +class_name UnlockSimulatorCached +extends Control + +# CACHED VERSION - Uses aggressive chunk-based caching for 10-100x speedup + +# Load the actual game resources +var unlock_collection: UnlockDataCollection = load("res://resources/UnlockData.tres") +var inventory_resource: InventoryResource = load("res://resources/InventoryData.tres") + +# Results tracking +var all_results: Array[Dictionary] = [] +var results_mutex: Mutex = Mutex.new() + +# Chunk-based caching for intermediate simulation states +# Key: "unlock_id:rank,..." sorted string +# Value: {cache_key, ticks, currency, wood, stock, current_ranks, modifiers} +var simulation_cache: Dictionary = {} +var cache_mutex: Mutex = Mutex.new() + +# Global unlock struct cache (build once, clone per simulation) +var global_unlock_structs: Array[Dictionary] = [] +var global_unlock_structs_mutex: Mutex = Mutex.new() +var unlock_structs_initialized: bool = false + +# Manual thread pool +var num_threads: int = 14 # Increase this for more CPU usage +var threads: Array[Thread] = [] +var task_queue: Array[Dictionary] = [] +var queue_mutex: Mutex = Mutex.new() +var completed_count: int = 0 +var completed_mutex: Mutex = Mutex.new() +var active_threads: int = 0 +var threads_done: bool = false + +# Pre-calculated cost arrays for faster lookup - OPTIMIZATION +var cost_cache: Dictionary = {} + +var start_time: int = 0 +var total_combinations: int = 0 +var last_progress_time: int = 0 +var monitoring_active: bool = false +var cache_hits: int = 0 +var cache_misses: int = 0 + +# UI References +@onready var status_label = $MarginContainer/VBoxContainer/StatusPanel/VBox/StatusLabel +@onready var progress_label = $MarginContainer/VBoxContainer/StatusPanel/VBox/ProgressLabel +@onready var progress_bar = $MarginContainer/VBoxContainer/StatusPanel/VBox/ProgressBar +@onready var rate_label = $MarginContainer/VBoxContainer/StatusPanel/VBox/RateLabel +@onready var eta_label = $MarginContainer/VBoxContainer/StatusPanel/VBox/ETALabel +@onready var cache_hits_label = $MarginContainer/VBoxContainer/CachePanel/VBox/CacheHitsLabel +@onready var cache_misses_label = $MarginContainer/VBoxContainer/CachePanel/VBox/CacheMissesLabel +@onready var cache_rate_label = $MarginContainer/VBoxContainer/CachePanel/VBox/CacheRateLabel +@onready var cache_size_label = $MarginContainer/VBoxContainer/CachePanel/VBox/CacheSizeLabel +@onready var results_label = $MarginContainer/VBoxContainer/ResultsPanel/VBox/ScrollContainer/ResultsLabel + +func _ready(): + GameManager.tick.stop() + print("=== CACHED Unlock Simulator Started ===") + print("Using aggressive chunk-based caching for 10-100x speedup") + var cpu_count = OS.get_processor_count() + print("CPU cores detected: %d" % cpu_count) + print("Creating %d worker threads (adjust num_threads variable for more/less)" % num_threads) + + # Update UI + status_label.text = "Status: Starting cached simulation..." + results_label.text = "[b]CACHED Unlock Simulator Started[/b]\n\nCPU cores: %d\nWorker threads: %d\n\nGenerating combinations..." % [cpu_count, num_threads] + + run_comprehensive_test() + +func _process(_delta): + if monitoring_active: + # Only update progress once per second + var current_time = Time.get_ticks_msec() + if current_time - last_progress_time >= 1000: + last_progress_time = current_time + update_progress() + +func update_progress(): + """Update progress display""" + var current_count = 0 + completed_mutex.lock() + current_count = completed_count + completed_mutex.unlock() + + # Check if all work is complete + if current_count >= total_combinations: + monitoring_active = false + finish_processing() + return + + var percent = float(current_count) / total_combinations * 100.0 + var elapsed = (Time.get_ticks_msec() - start_time) / 1000.0 + var rate = current_count / elapsed if elapsed > 0 else 0 + var eta_seconds = (total_combinations - current_count) / rate if rate > 0 else 0 + + # Calculate cache hit rate + var total_cache_checks = cache_hits + cache_misses + var cache_hit_rate = (float(cache_hits) / total_cache_checks * 100.0) if total_cache_checks > 0 else 0.0 + + # Format ETA + var eta_str = "" + if eta_seconds > 0: + var eta_minutes = int(eta_seconds) / 60 + var eta_secs = int(eta_seconds) % 60 + if eta_minutes > 0: + eta_str = "%dm %ds" % [eta_minutes, eta_secs] + else: + eta_str = "%ds" % eta_secs + else: + eta_str = "calculating..." + + print("Progress: %.1f%% (%d/%d) - %.1f combos/sec - Cache: %.1f%% hits - ETA: %s" % [ + percent, current_count, total_combinations, rate, cache_hit_rate, eta_str + ]) + + # Update UI + status_label.text = "Status: Running simulation..." + progress_label.text = "Progress: %.1f%% (%d/%d)" % [percent, current_count, total_combinations] + progress_bar.value = percent / 100.0 + rate_label.text = "Speed: %.1f combos/sec" % rate + eta_label.text = "ETA: %s" % eta_str + + # Update cache stats + cache_hits_label.text = "Cache Hits: %d" % cache_hits + cache_misses_label.text = "Cache Misses: %d" % cache_misses + cache_rate_label.text = "Hit Rate: %.1f%%" % cache_hit_rate + cache_mutex.lock() + cache_size_label.text = "Cache Entries: %d" % simulation_cache.size() + cache_mutex.unlock() + +func worker_thread(thread_id: int): + """Worker thread function that pulls tasks from the queue""" + # Local batch storage to reduce mutex contention - OPTIMIZATION + var local_results: Array[Dictionary] = [] + var local_count: int = 0 + var batch_size: int = 10 # Process 10 before syncing + + while true: + # Get next task from queue + var task_data = null + queue_mutex.lock() + if task_queue.size() > 0: + task_data = task_queue.pop_front() + queue_mutex.unlock() + + # If no more tasks, flush results and exit + if task_data == null: + if local_results.size() > 0: + results_mutex.lock() + all_results.append_array(local_results) + results_mutex.unlock() + + # CRITICAL FIX: Update completed count when flushing final batch + completed_mutex.lock() + completed_count += local_results.size() + completed_mutex.unlock() + break + + # Process the task + var result = simulate_rank_combination_pure(task_data.combo, task_data.unlock_data, 1000000) + + # Store in local batch + local_results.append(result) + local_count += 1 + + # Flush batch periodically to reduce mutex contention + if local_results.size() >= batch_size: + results_mutex.lock() + all_results.append_array(local_results) + results_mutex.unlock() + + # CRITICAL FIX: Update progress counter with mutex protection + completed_mutex.lock() + completed_count += local_results.size() + completed_mutex.unlock() + + local_results.clear() + local_count = 0 + +func get_cache_key(current_ranks: Dictionary) -> String: + """Generate a cache key from current unlock ranks""" + var sorted_keys = current_ranks.keys() + sorted_keys.sort() + var key_parts = [] + for k in sorted_keys: + key_parts.append(str(k) + ":" + str(current_ranks[k])) + return ",".join(key_parts) + +func try_load_best_prefix_from_cache(rank_targets: Dictionary) -> Variant: + """Balanced cache lookup - fast with good coverage (~10-15 lookups)""" + + cache_mutex.lock() + + # Try exact match first + var full_key = get_cache_key(rank_targets) + if simulation_cache.has(full_key): + cache_hits += 1 + var result = simulation_cache[full_key] + cache_mutex.unlock() + return result + + # Sort unlock IDs for consistent ordering + var unlock_ids = rank_targets.keys() + unlock_ids.sort() + var num_unlocks = unlock_ids.size() + + var best_match = null + var best_rank_sum = 0 + + # STRATEGY: Try progressively shorter prefixes by dropping unlocks from the END + # This is the most common pattern: {1,2,3,4,5} → {1,2,3,4} → {1,2,3} → {1,2} → {1} + # Covers 80%+ of cache reuse because combinations are generated in sorted order + + for prefix_len in range(num_unlocks - 1, 0, -1): + var subset = {} + for i in range(prefix_len): + subset[unlock_ids[i]] = rank_targets[unlock_ids[i]] + + var key = get_cache_key(subset) + if simulation_cache.has(key): + var cached_entry = simulation_cache[key] + var rank_sum = 0 + for r in cached_entry.current_ranks.values(): + rank_sum += r + + # Keep best match (longest prefix) + if rank_sum > best_rank_sum: + best_match = cached_entry + best_rank_sum = rank_sum + # Early exit if we found a substantial match + if prefix_len >= num_unlocks - 2: + break + + if best_match != null: + cache_hits += 1 + else: + cache_misses += 1 + cache_mutex.unlock() + + return best_match + +func should_cache_state(current_ranks: Dictionary, targets_remaining: int) -> bool: + """Decide if this state is worth caching""" + # Don't cache if all targets reached + if targets_remaining == 0: + return false + + # Cache aggressively for early states + var total_ranks = 0 + var active_unlocks = 0 + + for rank in current_ranks.values(): + if rank > 0: + total_ranks += rank + active_unlocks += 1 + + # Cache if: multiple unlocks active OR significant progress on one + return (active_unlocks >= 2) or (total_ranks >= 2) + +func simulate_rank_combination_pure(rank_targets: Dictionary, unlock_data_array: Array, max_ticks: int, track_purchases: bool = false) -> Dictionary: + """Optimized pure simulation function with struct-based unlocks""" + var currency: float = 0.0 + var stock: float = 0.0 + var wood: float = 0.0 + + # Purchase tracking (only enabled for top results) + var purchases: Array[Dictionary] = [] + + # GLOBAL STRUCT CACHE - Build once, clone per simulation + # This avoids rebuilding cost/effect tables for every simulation + var unlocks: Array[Dictionary] = [] + var unlock_by_id: Dictionary = {} + + if not unlock_structs_initialized: + global_unlock_structs_mutex.lock() + if not unlock_structs_initialized: # Double-check pattern + for unlock_data in unlock_data_array: + var base_mods = unlock_data.base_modifiers + + # Pre-calculate cost table for first 20 ranks (avoid pow() in hot loop) + var cost_table: Array[float] = [] + if unlock_data.is_scaling: + # Use cost_ladder if defined, otherwise use exponential scaling + if unlock_data.has("cost_ladder") and unlock_data.cost_ladder.size() > 0: + # Use fixed cost ladder + for cost in unlock_data.cost_ladder: + cost_table.append(float(cost)) + # Fill remaining slots with last cost for safety + while cost_table.size() < 21: + cost_table.append(cost_table[cost_table.size() - 1]) + else: + # Fallback to exponential scaling + var base_cost_float = float(unlock_data.base_cost) + var mult = unlock_data.cost_scaling_multiplier + for r in range(21): # Pre-calc ranks 0-20 + cost_table.append(base_cost_float * pow(mult, r)) + else: + cost_table.append(float(unlock_data.base_cost)) + + # Pre-calculate effect scale factors for first 20 ranks + var effect_scale_table: Array[float] = [] + var effect_mult = unlock_data.effect_scaling_multiplier + for r in range(21): + if r == 0: + effect_scale_table.append(0.0) # No effect at rank 0 + elif r == 1: + effect_scale_table.append(1.0) # Base effect at rank 1 + else: + effect_scale_table.append(pow(effect_mult, r - 1)) + + var unlock_struct = { + "id": unlock_data.unlock_id, + "name": unlock_data.unlock_name, + "base_cost": unlock_data.base_cost, + "is_scaling": unlock_data.is_scaling, + "max_rank": unlock_data.max_rank, + "cost_multiplier": unlock_data.cost_scaling_multiplier, + "effect_multiplier": unlock_data.effect_scaling_multiplier, + "base_mods": base_mods, + "cost_table": cost_table, # Pre-calculated costs + "effect_scale_table": effect_scale_table, # Pre-calculated effect scales + # Pre-calculate whether this unlock affects each modifier (avoids string lookups) + "affects_sale_price": base_mods.has("sale_price_modifier"), + "affects_efficiency": base_mods.has("efficiency_modifier"), + "affects_wood_per_click": base_mods.has("wood_per_click_modifier"), + "affects_purchase_rate": base_mods.has("purchase_rate_modifier"), + "affects_autowood": base_mods.has("autowood_modifier"), + "is_multicraft": base_mods.has("multicraft_increase_modifier"), + # Cache base modifier values to avoid dictionary lookups + "sale_price_value": base_mods.get("sale_price_modifier", 1.0), + "efficiency_value": base_mods.get("efficiency_modifier", 1.0), + "wood_per_click_value": base_mods.get("wood_per_click_modifier", 1.0), + "purchase_rate_value": base_mods.get("purchase_rate_modifier", 1.0), + "autowood_value": base_mods.get("autowood_modifier", 0.0) + } + global_unlock_structs.append(unlock_struct) + + unlock_structs_initialized = true + global_unlock_structs_mutex.unlock() + + # Clone structs for this simulation (fast shallow copy) + for template in global_unlock_structs: + var unlock = template.duplicate(false) # Shallow copy + unlock.current_rank = 0 # Reset rank for this simulation + unlocks.append(unlock) + unlock_by_id[unlock.id] = unlock + + var ticks: int = 0 + # Removed purchases array - it's only needed for debug output and slows down simulation + + # Track how many targets still need to be reached - OPTIMIZATION + var targets_remaining: int = 0 + var current_ranks: Dictionary = {} + var active_unlock_ids: Array = [] # Only check unlocks that haven't reached target yet + for unlock_id in rank_targets.keys(): + current_ranks[unlock_id] = 0 + targets_remaining += rank_targets[unlock_id] + active_unlock_ids.append(unlock_id) + + # Modifiers as individual variables for faster access - MAJOR OPTIMIZATION + var sale_price_mod: float = 1.0 + var efficiency_mod: float = 1.0 + var wood_per_click_mod: float = 1.0 + var purchase_rate_mod: float = 1.0 + var autowood_mod: float = 0.0 + var multicraft_rank: int = 0 + + var wholesale_unlocked: bool = false + + # Pre-calculate constants + var wood_per_click_base: float = Global.wood_per_click + var cost_per_whittle: float = Global.cost_per_whittle + var base_sale_price: float = Global.base_sale_price + var base_purchase_rate: float = Global.base_purchase_rate + var wholesale_id: int = Global.wholesale_unlock_id + var wholesale_size: float = Global.wholesale_bundle_size + var wholesale_mult: float = Global.wholesale_discount_multiplier + + # CACHE LOOKUP: Try to load from cached intermediate state + # NOTE: Disable cache when tracking purchases to ensure all purchases are recorded + var cached_state = null + if not track_purchases: + cached_state = try_load_best_prefix_from_cache(rank_targets) + + if cached_state != null: + # Restore full state from cache + ticks = cached_state.ticks + currency = cached_state.currency + stock = cached_state.stock + wood = cached_state.wood + + # Restore modifiers + sale_price_mod = cached_state.modifiers.sale_price_mod + efficiency_mod = cached_state.modifiers.efficiency_mod + wood_per_click_mod = cached_state.modifiers.wood_per_click_mod + purchase_rate_mod = cached_state.modifiers.purchase_rate_mod + autowood_mod = cached_state.modifiers.autowood_mod + multicraft_rank = cached_state.modifiers.multicraft_rank + wholesale_unlocked = cached_state.modifiers.wholesale_unlocked + + # Restore unlock ranks + for unlock_id in cached_state.current_ranks.keys(): + if unlock_by_id.has(unlock_id): + unlock_by_id[unlock_id].current_rank = cached_state.current_ranks[unlock_id] + current_ranks[unlock_id] = cached_state.current_ranks[unlock_id] + + # Recalculate targets_remaining and active_unlock_ids + targets_remaining = 0 + active_unlock_ids.clear() + for unlock_id in rank_targets.keys(): + if not current_ranks.has(unlock_id): + current_ranks[unlock_id] = 0 + var remaining = rank_targets[unlock_id] - current_ranks[unlock_id] + if remaining > 0: + targets_remaining += remaining + active_unlock_ids.append(unlock_id) + + # PRE-CALCULATE all next costs to avoid repeated lookups in main loop + var next_costs: Array[float] = [] + next_costs.resize(active_unlock_ids.size()) + + for i in range(active_unlock_ids.size()): + var unlock = unlock_by_id[active_unlock_ids[i]] + var current_rank: int = unlock.current_rank + if current_rank < unlock.cost_table.size(): + next_costs[i] = unlock.cost_table[current_rank] + else: + next_costs[i] = unlock.base_cost * pow(unlock.cost_multiplier, current_rank) + + while ticks < max_ticks: + # Find cheapest affordable unlock using pre-calculated costs + var cheapest_unlock_id: int = -1 + var cheapest_cost: float = INF + var cheapest_unlock = null + var cheapest_index: int = -1 + + if targets_remaining > 0: + for i in range(active_unlock_ids.size()): + if next_costs[i] < cheapest_cost and currency >= next_costs[i]: + cheapest_cost = next_costs[i] + cheapest_unlock_id = active_unlock_ids[i] + cheapest_unlock = unlock_by_id[cheapest_unlock_id] + cheapest_index = i + + # If we can't afford anything and all targets are met, skip to earning 1M + if cheapest_unlock == null and targets_remaining == 0: + if currency >= 1000000.0: + break + # Skip ahead: calculate ticks needed to reach 1M currency + # Use current production rate to estimate + var currency_needed = 1000000.0 - currency + var price_per_item = base_sale_price * sale_price_mod + var items_per_tick = max(1.0, floor(base_purchase_rate * purchase_rate_mod)) + var revenue_per_tick = items_per_tick * price_per_item + + if revenue_per_tick > 0: + var ticks_needed = int(ceil(currency_needed / revenue_per_tick)) + ticks += ticks_needed + currency += revenue_per_tick * ticks_needed + break + + # Purchase the cheapest unlock if found + if cheapest_unlock != null: + currency -= cheapest_cost + cheapest_unlock.current_rank += 1 + current_ranks[cheapest_unlock_id] += 1 + targets_remaining -= 1 + + # Update wholesale cache + if cheapest_unlock_id == wholesale_id: + wholesale_unlocked = true + + # OPTIMIZED modifier update - use ratio instead of recalculating from scratch + var rank: int = cheapest_unlock.current_rank + var prev_rank: int = rank - 1 + + if cheapest_unlock.is_multicraft: + multicraft_rank = rank + + # Get scale factors from pre-calculated tables + var old_scale: float = cheapest_unlock.effect_scale_table[prev_rank] if prev_rank < cheapest_unlock.effect_scale_table.size() else 0.0 + var new_scale: float = cheapest_unlock.effect_scale_table[rank] if rank < cheapest_unlock.effect_scale_table.size() else pow(cheapest_unlock.effect_multiplier, rank - 1) + + # Apply incremental changes using ratio + if cheapest_unlock.affects_sale_price: + var base_bonus: float = cheapest_unlock.sale_price_value - 1.0 + var old_mult: float = 1.0 + base_bonus * old_scale + var new_mult: float = 1.0 + base_bonus * new_scale + sale_price_mod = sale_price_mod * (new_mult / old_mult) + + if cheapest_unlock.affects_efficiency: + var base_bonus: float = cheapest_unlock.efficiency_value - 1.0 + var old_mult: float = 1.0 + base_bonus * old_scale + var new_mult: float = 1.0 + base_bonus * new_scale + efficiency_mod = efficiency_mod * (new_mult / old_mult) + + if cheapest_unlock.affects_wood_per_click: + var base_bonus: float = cheapest_unlock.wood_per_click_value - 1.0 + var old_mult: float = 1.0 + base_bonus * old_scale + var new_mult: float = 1.0 + base_bonus * new_scale + wood_per_click_mod = wood_per_click_mod * (new_mult / old_mult) + + if cheapest_unlock.affects_purchase_rate: + var base_bonus: float = cheapest_unlock.purchase_rate_value - 1.0 + var old_mult: float = 1.0 + base_bonus * old_scale + var new_mult: float = 1.0 + base_bonus * new_scale + purchase_rate_mod = purchase_rate_mod * (new_mult / old_mult) + + if cheapest_unlock.affects_autowood: + autowood_mod = autowood_mod - cheapest_unlock.autowood_value * prev_rank + cheapest_unlock.autowood_value * rank + + # Track purchase if enabled + if track_purchases: + if purchases.size() == 0: + print("DEBUG: First purchase being tracked!") + purchases.append({ + "unlock_id": cheapest_unlock_id, + "unlock_name": cheapest_unlock.name, + "rank": rank, + "cost": cheapest_cost, + "tick": ticks, + "currency_after": currency + }) + + # Update next cost for this unlock or remove from active list + if current_ranks[cheapest_unlock_id] >= rank_targets[cheapest_unlock_id]: + # Target reached - swap with last element and shrink array + var last_idx = active_unlock_ids.size() - 1 + if cheapest_index != last_idx: + active_unlock_ids[cheapest_index] = active_unlock_ids[last_idx] + next_costs[cheapest_index] = next_costs[last_idx] + active_unlock_ids.resize(last_idx) + next_costs.resize(last_idx) + else: + # Update cost for next rank + var new_rank = cheapest_unlock.current_rank + if new_rank < cheapest_unlock.cost_table.size(): + next_costs[cheapest_index] = cheapest_unlock.cost_table[new_rank] + else: + next_costs[cheapest_index] = cheapest_unlock.base_cost * pow(cheapest_unlock.cost_multiplier, new_rank) + + # Removed purchase tracking for performance - only track in debug mode if needed + # Don't append to purchases array on every purchase + + # CACHE INSERTION: Cache this state if valuable + if should_cache_state(current_ranks, targets_remaining): + var cache_key = get_cache_key(current_ranks) + + cache_mutex.lock() + if not simulation_cache.has(cache_key): + simulation_cache[cache_key] = { + "cache_key": cache_key, + "ticks": ticks, + "currency": currency, + "stock": stock, + "wood": wood, + "current_ranks": current_ranks.duplicate(), + "modifiers": { + "sale_price_mod": sale_price_mod, + "efficiency_mod": efficiency_mod, + "wood_per_click_mod": wood_per_click_mod, + "purchase_rate_mod": purchase_rate_mod, + "autowood_mod": autowood_mod, + "multicraft_rank": multicraft_rank, + "wholesale_unlocked": wholesale_unlocked + } + } + cache_mutex.unlock() + + # Simulate one tick - HEAVILY OPTIMIZED + + # 1. Generate wood + var wood_per_click_modified = wood_per_click_base * wood_per_click_mod + + # Manual clicks based on tick range (pre-calculate to avoid repeated conditions) + var manual_clicks: float = 1.0 if ticks < 120 else (0.5 if ticks < 300 else (0.25 if (ticks < 600 and autowood_mod < 0.2) else 0.0)) + + # Total wood generation + var wood_gen: float = manual_clicks * wood_per_click_modified + if autowood_mod > 0.0: + wood_gen += max(wood_per_click_modified * autowood_mod, 1.0) + wood += wood_gen + + # 2. Whittle wood into stock - MATCHES tick_process.gd:19-32 + # Base whittling action (always happens once) + var multicraft_actions = 1 + multicraft_rank # 1 base + multicraft ranks + + # Each whittle action: items_produced_per_tick = cost_per_whittle * efficiency_modifier + var items_per_whittle = cost_per_whittle * efficiency_mod + + for action in range(multicraft_actions): + if wood >= 1: # Need at least 1 wood to whittle + # How much wood needed for this whittle (matches tick_process.gd:63-65) + var wood_needed = ceil(items_per_whittle) + var wood_to_use = min(wood, wood_needed) + var items_produced = wood_to_use # 1 wood = 1 item always + + wood -= wood_to_use + stock += items_produced + else: + break # Not enough wood for more whittle actions + + # 3. Sell stock for currency - MATCHES tick_process.gd:34-58 + var price_per_item = base_sale_price * sale_price_mod + + # 3a. Wholesale selling (if unlocked) - matches tick_process.gd:36-42 + # Sell ALL possible 100-item bundles at 1.2x price + if wholesale_unlocked: + while stock >= wholesale_size: + stock -= wholesale_size + currency += wholesale_size * price_per_item * wholesale_mult + + # 3b. Regular selling - matches tick_process.gd:45-58 + if stock > 0: + var purchase_rate = base_purchase_rate * purchase_rate_mod + var max_stock_to_sell = floor(purchase_rate) + # Always sell at least 1, up to the max + var actual_stock_to_sell = min(stock, max(1.0, max_stock_to_sell)) + stock -= actual_stock_to_sell + currency += actual_stock_to_sell * price_per_item + + ticks += 1 + + var success = currency >= 1000000.0 + + var result = { + "rank_targets": rank_targets, + "success": success, + "ticks": ticks if success else -1, + "final_currency": currency, + "time_formatted": format_time(ticks) if success else "Failed" + } + + # Include purchase timeline if tracking was enabled + if track_purchases: + result["purchases"] = purchases + print("DEBUG: track_purchases=true, purchases.size()=%d" % purchases.size()) + + return result + + +func format_time(ticks: int) -> String: + var seconds = ticks + var minutes = seconds / 60 + var hours = minutes / 60 + + if hours > 0: + return "%dh %dm %ds" % [hours, minutes % 60, seconds % 60] + elif minutes > 0: + return "%dm %ds" % [minutes, seconds % 60] + else: + return "%ds" % seconds + +func generate_all_combinations(unlimited_scaling_cap: int = 5) -> Array[Dictionary]: + """Generate combinations for ALL unlocks dynamically, respecting max_ranks from resource file + + Args: + unlimited_scaling_cap: Maximum rank to test for unlocks with unlimited scaling (default: 5) + Lower values = faster testing, higher = more comprehensive + Cap=3: ~13K combos (~28 sec) | Cap=5: ~47K combos (~93 sec) + Cap=7: ~111K combos (~3.7min) | Cap=10: ~287K combos (~9.6min) + """ + var combinations: Array[Dictionary] = [] + + # Build constraint list from resource file + var unlock_constraints = [] + for unlock in unlock_collection.unlocks: + var max_rank: int + if unlock.max_rank > 0: + max_rank = unlock.max_rank + elif not unlock.is_scaling: + max_rank = 1 # One-shot unlocks + else: + max_rank = unlimited_scaling_cap # Configurable cap for unlimited scaling + + unlock_constraints.append({ + "id": unlock.unlock_id, + "name": unlock.unlock_name, + "max_rank": max_rank + }) + + print("\n=== Generating Combinations ===") + print("Reading from resource file: %d unlocks" % unlock_constraints.size()) + for c in unlock_constraints: + print(" - %s (ID %d): 0-%d ranks" % [c.name, c.id, c.max_rank]) + + # Recursive generation + _generate_combinations_recursive(unlock_constraints, 0, {}, combinations) + + print("Generated %d total combinations" % combinations.size()) + return combinations + +func _generate_combinations_recursive(constraints: Array, index: int, current: Dictionary, output: Array): + """Recursively generate all valid combinations""" + if index >= constraints.size(): + # Skip all-zeros combination + if current.size() > 0: + output.append(current.duplicate()) + return + + var constraint = constraints[index] + for rank in range(constraint.max_rank + 1): + if rank > 0: + current[constraint.id] = rank + + _generate_combinations_recursive(constraints, index + 1, current, output) + + if rank > 0: + current.erase(constraint.id) + +func serialize_unlock_data() -> Array: + """Convert unlock collection to serializable data for threads""" + var unlock_data = [] + for unlock in unlock_collection.unlocks: + unlock_data.append({ + "unlock_id": unlock.unlock_id, + "unlock_name": unlock.unlock_name, + "base_cost": unlock.base_cost, + "is_scaling": unlock.is_scaling, + "max_rank": unlock.max_rank, + "cost_scaling_multiplier": unlock.cost_scaling_multiplier, + "effect_scaling_multiplier": unlock.effect_scaling_multiplier, + "cost_ladder": unlock.cost_ladder.duplicate() if unlock.cost_ladder.size() > 0 else [], + "base_modifiers": unlock.base_modifiers.duplicate() + }) + return unlock_data + +func run_comprehensive_test(): + """Test all combinations dynamically generated from resource file""" + print("\n=== Available Unlocks ===") + for unlock in unlock_collection.unlocks: + var max_rank_str = str(unlock.max_rank) if unlock.max_rank > 0 else "unlimited" + print("ID: %d | %s | Base Cost: %d | Scaling: %s | Max Rank: %s" % [ + unlock.unlock_id, + unlock.unlock_name, + unlock.base_cost, + "Yes" if unlock.is_scaling else "No", + max_rank_str + ]) + print(" Modifiers: ", unlock.base_modifiers) + + print("\n=== Global Constants ===") + print("Base Sale Price: %s" % Global.base_sale_price) + print("Base Purchase Rate: %s" % Global.base_purchase_rate) + print("Cost Per Whittle: %s" % Global.cost_per_whittle) + + # Serialize unlock data for threads + var unlock_data = serialize_unlock_data() + + # CACHE WARMUP: Pre-populate cache with common single-unlock states + print("\n=== Cache Warmup ===") + print("Pre-populating cache with common prefixes...") + for unlock in unlock_collection.unlocks: + var max_warmup_rank = 3 + if unlock.max_rank > 0: + max_warmup_rank = min(unlock.max_rank, 3) + + for rank in range(1, max_warmup_rank + 1): + var warmup_target = {unlock.unlock_id: rank} + simulate_rank_combination_pure(warmup_target, unlock_data, 1000000) + + print("Cache warmup complete. Cache size: %d entries" % simulation_cache.size()) + + # Generate all combinations (configurable cap for unlimited scaling) + var unlimited_cap = 5 # Adjust this to test more/fewer ranks: 3=fast, 5=balanced, 7+=comprehensive + print("\n=== Generation Settings ===") + print("Unlimited scaling cap: %d ranks" % unlimited_cap) + var combinations = generate_all_combinations(unlimited_cap) + total_combinations = combinations.size() + print("\n=== Testing %d Combinations ===" % total_combinations) + + # Fill task queue + task_queue.clear() + for combo in combinations: + task_queue.append({ + "combo": combo, + "unlock_data": unlock_data + }) + + # Reset counters + completed_count = 0 + all_results.clear() + threads_done = false + start_time = Time.get_ticks_msec() + last_progress_time = start_time + monitoring_active = true + + # Create and start threads + print("Starting %d worker threads..." % num_threads) + for i in range(num_threads): + var thread = Thread.new() + thread.start(worker_thread.bind(i)) + threads.append(thread) + + print("All threads started, processing...") + +func finish_processing(): + """Called when all processing is complete""" + print("\nAll combinations complete! Waiting for threads to finish...") + + # Wait for all threads to finish + for thread in threads: + thread.wait_to_finish() + threads.clear() + threads_done = true + + print("All threads finished. Processing results...") + + var total_time = (Time.get_ticks_msec() - start_time) / 1000.0 + + # SAFETY CHECK: Verify result count matches + results_mutex.lock() + var actual_results = all_results.size() + results_mutex.unlock() + + if actual_results != total_combinations: + print("WARNING: Result count mismatch! Expected %d, got %d" % [total_combinations, actual_results]) + print("This indicates a threading issue where some results weren't flushed") + + # Print results + print("\n=== RESULTS ===") + print("Total time: %.1f seconds" % total_time) + print("Total combinations tested: %d (expected %d)" % [actual_results, total_combinations]) + + # Cache statistics + var total_cache_checks = cache_hits + cache_misses + var cache_hit_rate = (float(cache_hits) / total_cache_checks * 100.0) if total_cache_checks > 0 else 0.0 + cache_mutex.lock() + var cache_size = simulation_cache.size() + cache_mutex.unlock() + print("\n=== CACHE STATISTICS ===") + print("Cache hits: %d" % cache_hits) + print("Cache misses: %d" % cache_misses) + print("Hit rate: %.1f%%" % cache_hit_rate) + print("Cache entries stored: %d" % cache_size) + + var successful = all_results.filter(func(r): return r.success) + print("Successful strategies: %d" % successful.size()) + + # Update UI status + status_label.text = "Status: Complete!" + progress_label.text = "Progress: 100%% (%d/%d)" % [all_results.size(), total_combinations] + progress_bar.value = 1.0 + eta_label.text = "Total Time: %.1f seconds" % total_time + + # Build results text for UI + var results_text = "[b]SIMULATION COMPLETE[/b]\n\n" + results_text += "[color=green]Total time: %.1f seconds[/color]\n" % total_time + results_text += "Combinations tested: %d\n" % all_results.size() + results_text += "Successful strategies: %d\n\n" % successful.size() + + results_text += "[b]Cache Performance:[/b]\n" + results_text += " Hits: %d\n" % cache_hits + results_text += " Misses: %d\n" % cache_misses + results_text += " [color=cyan]Hit Rate: %.1f%%[/color]\n" % cache_hit_rate + results_text += " Entries: %d\n\n" % cache_size + + if successful.size() > 0: + # Sort by ticks (fastest first) + successful.sort_custom(func(a, b): return a.ticks < b.ticks) + + # Re-simulate top 10 with detailed purchase tracking + print("\n=== RE-SIMULATING TOP 10 WITH PURCHASE TRACKING ===") + var unlock_data = serialize_unlock_data() + var top_10_detailed: Array = [] + + for i in range(min(10, successful.size())): + var result = successful[i] + print("Re-simulating #%d with track_purchases=true..." % (i + 1)) + var detailed_result = simulate_rank_combination_pure(result.rank_targets, unlock_data, 1000000, true) + print(" Result has purchases key: %s" % detailed_result.has("purchases")) + if detailed_result.has("purchases"): + print(" Purchases array size: %d" % detailed_result.purchases.size()) + top_10_detailed.append(detailed_result) + + print("\n=== TOP 10 FASTEST STRATEGIES (WITH PURCHASE TIMELINE) ===") + results_text += "[b]TOP 10 FASTEST STRATEGIES:[/b]\n\n" + + for i in range(top_10_detailed.size()): + var result = top_10_detailed[i] + print("\n#%d: %s (%d ticks)" % [i + 1, result.time_formatted, result.ticks]) + + # Format ranks with unlock names + var rank_display = [] + for unlock_id in result.rank_targets.keys(): + var unlock_name = get_unlock_name_by_id(unlock_id) + var ranks = result.rank_targets[unlock_id] + rank_display.append("%s: %d" % [unlock_name, ranks]) + print("Target Ranks: %s" % ", ".join(rank_display)) + + # Add to UI + results_text += "[color=yellow]#%d: %s (%d ticks)[/color]\n" % [i + 1, result.time_formatted, result.ticks] + results_text += " Ranks: %s\n" % ", ".join(rank_display) + results_text += " Currency: %.0f\n" % result.final_currency + + # Add purchase timeline + if result.has("purchases") and result.purchases.size() > 0: + print("\nPurchase Timeline:") + results_text += " [b]Purchase Timeline:[/b]\n" + for purchase in result.purchases: + var time_str = format_time(purchase.tick) + print(" %s: %s Rank %d - Cost: %d¥ @ %s" % [ + time_str, purchase.unlock_name, purchase.rank, + purchase.cost, time_str + ]) + results_text += " • %s [color=cyan]%s Rank %d[/color] - %d¥ @ %s\n" % [ + format_time(purchase.tick), purchase.unlock_name, purchase.rank, + purchase.cost, time_str + ] + results_text += "\n" + else: + print("\nNo successful strategies found!") + results_text += "[color=red]No successful strategies found![/color]\n" + + # Update results UI + results_label.text = results_text + +func get_unlock_name_by_id(unlock_id: int) -> String: + """Helper function to get unlock name by ID""" + for unlock in unlock_collection.unlocks: + if unlock.unlock_id == unlock_id: + return unlock.unlock_name + return "Unknown" + +func _exit_tree(): + # Clean up threads + monitoring_active = false + for thread in threads: + if thread.is_alive(): + thread.wait_to_finish() diff --git a/scripts/sim_cached.gd.uid b/scripts/sim_cached.gd.uid new file mode 100644 index 0000000..642ef22 --- /dev/null +++ b/scripts/sim_cached.gd.uid @@ -0,0 +1 @@ +uid://bup76ad02kuse diff --git a/scripts/tick_process.gd b/scripts/tick_process.gd index fac8e94..4f67ed6 100644 --- a/scripts/tick_process.gd +++ b/scripts/tick_process.gd @@ -1,8 +1,24 @@ class_name TickProcess extends Node +# Dependency injection - can be overridden for simulation +var unlocks_provider: Node = null +var inventory_provider: Node = null + +func _ready(): + # Default to singletons if not explicitly set + if unlocks_provider == null: + unlocks_provider = Unlocks + if inventory_provider == null: + inventory_provider = Inventory + +func set_providers(unlocks, inventory): + """Set custom providers for simulation (bypasses singletons)""" + unlocks_provider = unlocks + inventory_provider = inventory + func tick(): - Log.pr("Tick Process Ticking...") + # Log.pr("Tick Process Ticking...") do_autowood() do_whittling() do_selling() @@ -11,10 +27,10 @@ func do_autowood(): # If the autowood unlock is unlocked then automatically gain wood based on the modifier var autowood_unlock = Unlocks.get_unlock_by_id(Global.autowood_unlock_id) if autowood_unlock and autowood_unlock.is_unlocked: - Log.pr("Autowood modifier", str(Unlocks.get_modifier_value("autowood_modifier"))) + # Log.pr("Autowood modifier", str(Unlocks.get_modifier_value("autowood_modifier"))) var wood_to_gather = max(Unlocks.get_wood_per_click() * Unlocks.get_modifier_value("autowood_modifier"), 1) Inventory.add_wood(wood_to_gather) - Log.pr("Auto-gathered", str(wood_to_gather), "wood via autowood unlock.") + # Log.pr("Auto-gathered", str(wood_to_gather), "wood via autowood unlock.") func do_whittling(): # If there's more than 1 whole wood available, then whittle based on the efficiency modifier @@ -39,7 +55,7 @@ func do_selling(): Inventory.spend_stock(Global.wholesale_bundle_size) var currency_earned = Global.wholesale_bundle_size * Unlocks.get_sale_price_per_item() * Global.wholesale_discount_multiplier Inventory.add_currency(currency_earned) - Log.pr("Sold 100 whittled wood for", str(currency_earned), "currency via wholesale unlock.") + # Log.pr("Sold 100 whittled wood for", str(currency_earned), "currency via wholesale unlock.") # If there's whittled wood available to sell, sell it for currency @@ -61,7 +77,7 @@ func do_selling(): func whittle_max_wood_possible(): # Get the items that can be produced per tick var items_produced_per_tick = Unlocks.get_items_produced_per_tick() - Log.pr("Items produced per tick:", str(items_produced_per_tick)) + # Log.pr("Items produced per tick:", str(items_produced_per_tick)) var wood_needed = ceil(items_produced_per_tick) # Whittle as much wood as possible this tick, up to the max allowed by efficiency @@ -70,4 +86,4 @@ func whittle_max_wood_possible(): Inventory.spend_wood(wood_to_whittle) Inventory.add_stock(actual_items_produced) - Log.pr("Whittled", str(wood_to_whittle), "wood into", str(actual_items_produced), "whittle wood.") + # Log.pr("Whittled", str(wood_to_whittle), "wood into", str(actual_items_produced), "whittle wood.")