help? #4
1
.gitignore
vendored
|
@ -1,2 +1,3 @@
|
|||
# Godot 4+ specific ignores
|
||||
.godot/
|
||||
content/
|
||||
|
|
4
LICENSE
|
@ -208,7 +208,7 @@ If you develop a new program, and you want it to be of the greatest possible use
|
|||
|
||||
To do so, attach the following notices to the program. It is safest to attach them to the start of each source file to most effectively state the exclusion of warranty; and each file should have at least the “copyright” line and a pointer to where the full notice is found.
|
||||
|
||||
opendnd
|
||||
FreeTTRPG
|
||||
Copyright (C) 2024 Patrick_Pluto
|
||||
|
||||
This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version.
|
||||
|
@ -221,7 +221,7 @@ Also add information on how to contact you by electronic and paper mail.
|
|||
|
||||
If the program does terminal interaction, make it output a short notice like this when it starts in an interactive mode:
|
||||
|
||||
opendnd Copyright (C) 2024 Patrick_Pluto
|
||||
FreeTTRPG Copyright (C) 2024 Patrick_Pluto
|
||||
This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
|
||||
This is free software, and you are welcome to redistribute it under certain conditions; type `show c' for details.
|
||||
|
||||
|
|
|
@ -1,62 +0,0 @@
|
|||
openDND
|
||||
|
||||
Character-informations
|
||||
|
||||
STR=Strength
|
||||
DEX=Dexterity
|
||||
CON=Constitution
|
||||
INT=Itelligence
|
||||
WIS=Wisdom
|
||||
CHA=Charisma
|
||||
|
||||
Skillchecks;
|
||||
1. Acrobatics (Dexterity)
|
||||
2. Animal Handling (Wisdom)
|
||||
3. Arcana (Intelligence)
|
||||
4. Athletics (Strength)
|
||||
5. Deception (Charisma)
|
||||
6. History (Intelligence)
|
||||
7. Insight (Wisdom)
|
||||
8. Intimidation (Charisma)
|
||||
9. Investigation (Intelligence)
|
||||
10. Medicine (Wisdom)
|
||||
11. Nature (Intelligence)
|
||||
12. Perception (Wisdom)
|
||||
13. Performance (Charisma)
|
||||
14. Persuasion (Charisma)
|
||||
15. Religion (Intelligence)
|
||||
16. Sleight of Hand (Dexterity)
|
||||
17. Stealth (Dexterity)
|
||||
18. Survival (Wisdom)
|
||||
|
||||
Proficency Bonus{
|
||||
1-4: +2
|
||||
5-8: +3
|
||||
9-12: +4
|
||||
13-16: +5
|
||||
17-20: +6
|
||||
}
|
||||
|
||||
Calculation Modifier=(stat-10)/2
|
||||
|
||||
Armour Class{
|
||||
Base-AC 10 (can be modified by your class)
|
||||
Dexterity-bonus plus dex (can by limited by your armour)
|
||||
Armour-Bonus 0 (if not stated different in the item)
|
||||
Shield: +2
|
||||
}
|
||||
# Example Calculation 10+3+0+2=15 --> AC=15
|
||||
|
||||
HP{
|
||||
Hit-dice (definied by class)
|
||||
Char-Level multiplier
|
||||
Con-modifier
|
||||
}
|
||||
|
||||
#Calculation= level*(hitdice+con-modifier)
|
||||
|
||||
# spellsave-dc-calculation = (10+level+magic-modifier)
|
||||
|
||||
|
||||
|
||||
|
|
@ -1,39 +0,0 @@
|
|||
# Will be enbeded in an open source Dynamik online tool later on
|
||||
|
||||
ToDo-List
|
||||
|
||||
1. Create a test map
|
||||
1.1 Distance Manager
|
||||
1.2 Tile creation
|
||||
1.3 Limit walking per turn
|
||||
1.4 Dynamik Field
|
||||
2. Create test character 1-3
|
||||
2.1 Base Stats
|
||||
2.2 Race
|
||||
2.3 Class
|
||||
2.4 Background
|
||||
2.5 Skill Checks
|
||||
2.6 Saving throws
|
||||
2.7 Dynamic AC
|
||||
2.8 Dynamic HP
|
||||
2.9 Inventory
|
||||
2.10 pdf, odf, html export
|
||||
3. Simulation Dice (20, 12, 00, 10, 8, 6, 4, 2)
|
||||
3.1 20: For Attacks, Skill Checks, Saving Throws
|
||||
3.2 12: Heavy Weapon Damage*
|
||||
3.3 10: Two handed Weapon Damage*
|
||||
3.4 00: Combined with 10 1-100, for special effects and loot tables
|
||||
3.5 8: Weapon Damage*
|
||||
3.6 6: short weapon damage*
|
||||
3.7 4: Minor Weapon damage*
|
||||
3.8 2: Coinflips, Gambling in game etc.
|
||||
4. combat turns
|
||||
4.1 Initiative System
|
||||
4.2 Movement, Action, Bonus-action, reaction
|
||||
5. Enemies
|
||||
5.1 Stats
|
||||
5.2 Attacks
|
||||
5.3 HP
|
||||
5.4 AC
|
||||
5.5 Inventory
|
||||
6. To be continiued
|
21
README.md
|
@ -1,23 +1,22 @@
|
|||
# Introducing freeTTRPG
|
||||
# Introducing FreeTTRPG
|
||||
|
||||
# A Swiss Quality Project
|
||||
## A Swiss "Quality" Project
|
||||
|
||||
# The Game
|
||||
## The Game
|
||||
|
||||
Tired of the commercialization of tabletop role-playing games, we decided to take matters into our own hands. We're creating an open-source, community-driven TTRPG project that puts creativity and freedom back in the hands of players.
|
||||
|
||||
# Our Vision
|
||||
## Our Goal
|
||||
|
||||
Our project offers a game engine with a solid foundation of basic content and story packs to get you started. But that's just the beginning. We're also providing a powerful content creator tool that allows users to craft their own custom content packs. With this tool, you'll be able to create your own rules, characters, items, spells, attacks, and much more.
|
||||
|
||||
# Your Content, Your Copyright
|
||||
|
||||
The best part? Everything you create with our tool is yours to own and control. We won't claim any copyright or ownership over your creations. You're free to share, modify, or use your content as you see fit.
|
||||
|
||||
# A Community-Driven Platform
|
||||
## A Community-Driven Platform
|
||||
|
||||
We're building a platform where users can share their content packs with the community. While sharing is encouraged, it's not required. You can keep your creations private or share them with the world – the choice is yours.
|
||||
|
||||
# Join the Movement
|
||||
## Join us
|
||||
|
||||
We're excited to share freeTTRPG with the world and hope you'll join us on this journey. Together, let's create a TTRPG ecosystem that's open, inclusive, and driven by the passion of its community.
|
||||
We're excited to share FreeTTRPG with the world and hope you'll join us on this journey. Together, let's create a TTRPG ecosystem that's open, inclusive, and driven by the passion of its community.
|
||||
|
||||
### Copyright Note:
|
||||
The main game must be distributed as stated in the LICENSE file. Any content made for it can however be freely distributed under any license. Once we make the content creator for this game, any content made there will also be no restrictions on the content you make with that.
|
14
Website-draft/.vscode/launch.json
vendored
|
@ -1,14 +0,0 @@
|
|||
{
|
||||
// Use IntelliSense to learn about possible attributes.
|
||||
// Hover to view descriptions of existing attributes.
|
||||
// For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387
|
||||
"version": "0.2.0",
|
||||
"configurations": [
|
||||
{
|
||||
"type": "chrome",
|
||||
"request": "launch",
|
||||
"name": "Open index.html",
|
||||
"file": "c:\\Users\\lucab\\Desktop\\opendnd\\Website-draft\\index.html"
|
||||
}
|
||||
]
|
||||
}
|
|
@ -1,73 +0,0 @@
|
|||
<!DOCTYPE html>
|
||||
<html lang="en">
|
||||
<head>
|
||||
<meta charset="UTF-8" />
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
|
||||
<title>openTTRPG</title>
|
||||
<link rel="stylesheet" href="style.css" />
|
||||
</head>
|
||||
<body>
|
||||
<header>
|
||||
<div class="header-content">
|
||||
<div class="project-name">openTTRPG</div>
|
||||
<button class="burger-menu" onclick="toggleMenu()">☰</button>
|
||||
<ul class="menu">
|
||||
<li><a href="#section1">open a git console</a></li>
|
||||
<li><a href="#section2">Go to our codeberg website</a></li>
|
||||
<li><a href="#section3">git clone</a></li>
|
||||
<li><a href="#section4">read through our license</a></li>
|
||||
</ul>
|
||||
</div>
|
||||
</header>
|
||||
|
||||
<article>
|
||||
<section id="section1">
|
||||
<h1>open a git console</h1>
|
||||
<p class="code-box">$ git init</p>
|
||||
<p>Initialize an empty Git repository in the current directory.</p>
|
||||
</section>
|
||||
|
||||
<section id="section2">
|
||||
<h1>Go to our codeberg website</h1>
|
||||
<a href="https://codeberg.org/Patrick_Pluto/opendnd">
|
||||
<button type="button">Our source code</button>
|
||||
</a>
|
||||
<p class="code-box">
|
||||
$ git clone https://codeberg.org/Patrick_Pluto/opendnd.git
|
||||
</p>
|
||||
<p>
|
||||
Clone the openTTRPG repository from Codeberg to your local machine.
|
||||
</p>
|
||||
</section>
|
||||
|
||||
<section id="section3">
|
||||
<h1>git clone</h1>
|
||||
<p class="code-box">
|
||||
$ git clone https://codeberg.org/Patrick_Pluto/opendnd.git
|
||||
</p>
|
||||
<p>
|
||||
Clone the openTTRPG repository from Codeberg to your local machine.
|
||||
</p>
|
||||
</section>
|
||||
|
||||
<section id="section4">
|
||||
<h1>move into the repository</h1>
|
||||
<p class="code-box">$ cd opendnd</p>
|
||||
<p>Display the contents of the license file (`LICENSE`).</p>
|
||||
</section>
|
||||
|
||||
<section id="section5">
|
||||
<h1>read through our license</h1>
|
||||
<p class="code-box">$ cat LICENSE</p>
|
||||
<p>Move the bash console into the newly created repository</p>
|
||||
</section>
|
||||
</article>
|
||||
|
||||
<script>
|
||||
function toggleMenu() {
|
||||
const menu = document.querySelector(".menu");
|
||||
menu.classList.toggle("active");
|
||||
}
|
||||
</script>
|
||||
</body>
|
||||
</html>
|
|
@ -1,121 +0,0 @@
|
|||
<!DOCTYPE html>
|
||||
<html lang="en">
|
||||
<head>
|
||||
<meta charset="UTF-8" />
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
|
||||
<title>freeTTRPG</title>
|
||||
<link rel="stylesheet" href="style.css" />
|
||||
</head>
|
||||
<body>
|
||||
<header>
|
||||
<div class="header-content">
|
||||
<div class="project-name">freeTTRPG</div>
|
||||
<button class="burger-menu" onclick="toggleMenu()">☰</button>
|
||||
<ul class="menu">
|
||||
<li><a href="#section1">The Game</a></li>
|
||||
<li><a href="#section2">Our Vision</a></li>
|
||||
<li><a href="#section3">Copyright</a></li>
|
||||
<li><a href="#section4">Platform</a></li>
|
||||
<li><a href="#section5">Join Us</a></li>
|
||||
<li><a href="#section6">Source Code</a></li>
|
||||
<li><a href="#section7">Game Assets</a></li>
|
||||
</ul>
|
||||
</div>
|
||||
</header>
|
||||
|
||||
<article>
|
||||
<section id="section1">
|
||||
<h1>The Game</h1>
|
||||
<p>
|
||||
Tired of the commercialization of tabletop role-playing games, we
|
||||
decided to take matters into our own hands. We're creating an
|
||||
open-source, community-driven TTRPG project that puts creativity and
|
||||
freedom back in the hands of players.
|
||||
</p>
|
||||
<img src="assets/game.png" alt="current game version" />
|
||||
<p>Current game version</p>
|
||||
</section>
|
||||
|
||||
<section id="section2">
|
||||
<h1>Our Vision</h1>
|
||||
<p>
|
||||
Our project offers a game engine with a solid foundation of basic
|
||||
content and story packs to get you started. But that's just the
|
||||
beginning. We're also providing a powerful content creator tool that
|
||||
allows users to craft their own custom content packs. With this tool,
|
||||
you'll be able to create your own rules, characters, items, spells,
|
||||
attacks, and much more.
|
||||
</p>
|
||||
</section>
|
||||
|
||||
<section id="section3">
|
||||
<h1>Copyright</h1>
|
||||
<p>
|
||||
The best part? Everything you create with our tool is yours to own and
|
||||
control. We won't claim any copyright or ownership over your
|
||||
creations. You're free to share, modify, or use your content as you
|
||||
see fit.
|
||||
</p>
|
||||
</section>
|
||||
|
||||
<section id="section4">
|
||||
<h1>Community-Driven Platform</h1>
|
||||
<p>
|
||||
We're building a platform where users can share their content packs
|
||||
with the community. While sharing is encouraged, it's not required.
|
||||
You can keep your creations private or share them with the world – the
|
||||
choice is yours.
|
||||
</p>
|
||||
</section>
|
||||
|
||||
<section id="section5">
|
||||
<h1>Join Us</h1>
|
||||
<p>
|
||||
We're excited to share freeTTRPG with the world and hope you'll join
|
||||
us on this journey. Together, let's create a TTRPG ecosystem that's
|
||||
open, inclusive, and driven by the passion of its community.
|
||||
</p>
|
||||
</section>
|
||||
|
||||
<section id="section6">
|
||||
<h1>Our Code</h1>
|
||||
<a href="download.html" target="_blank"
|
||||
><button type="button">Download</button></a
|
||||
>
|
||||
</section>
|
||||
|
||||
<section id="section7">
|
||||
<h1>Our Game Assets</h1>
|
||||
<ul class="cards flex">
|
||||
<li class="card">
|
||||
<img src="assets/gigachad.png" alt="Gigachad" />
|
||||
<h3>Gigachad</h3>
|
||||
<p>Our test human paladin on maximum level</p>
|
||||
</li>
|
||||
<li class="card">
|
||||
<img src="assets/tharok.png" alt="Tharok" />
|
||||
<h3>Tharok</h3>
|
||||
<p>Our test human fighter on starting level</p>
|
||||
</li>
|
||||
<li class="card">
|
||||
<img src="assets/water.png" alt="Water Texture" />
|
||||
<h3>Water</h3>
|
||||
<p>Our water texture that is incomplete</p>
|
||||
</li>
|
||||
<li class="card">
|
||||
<img src="assets/grass.png" alt="Grass Texture" />
|
||||
<h3>Grass</h3>
|
||||
<p>Our grass texture that is incomplete</p>
|
||||
</li>
|
||||
</ul>
|
||||
</section>
|
||||
</article>
|
||||
|
||||
<script>
|
||||
function toggleMenu() {
|
||||
const menu = document.querySelector(".menu");
|
||||
menu.classList.toggle("active");
|
||||
}
|
||||
</script>
|
||||
</body>
|
||||
</html>
|
|
@ -1,194 +0,0 @@
|
|||
/* Reset and global styles */
|
||||
* {
|
||||
box-sizing: border-box;
|
||||
margin: 0;
|
||||
padding: 0;
|
||||
font-family: "Segoe UI", Tahoma, Geneva, Verdana, sans-serif;
|
||||
transition: 0.5s;
|
||||
}
|
||||
|
||||
/* Body styles */
|
||||
body {
|
||||
background-color: #f5f5f5;
|
||||
background-image: url("img/KSS.jpeg");
|
||||
background-repeat: no-repeat;
|
||||
background-size: cover;
|
||||
background-position: center;
|
||||
background-attachment: fixed;
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
align-items: center;
|
||||
min-height: 100vh;
|
||||
}
|
||||
|
||||
/* Header styles */
|
||||
header {
|
||||
background-color: rgba(0, 0, 0, 0.7);
|
||||
padding: 10px;
|
||||
width: 100%;
|
||||
position: fixed;
|
||||
top: 0;
|
||||
left: 0;
|
||||
z-index: 1000;
|
||||
}
|
||||
|
||||
.header-content {
|
||||
display: flex;
|
||||
justify-content: space-between;
|
||||
align-items: center;
|
||||
max-width: 1200px;
|
||||
margin: 0 auto;
|
||||
}
|
||||
|
||||
.project-name {
|
||||
color: white;
|
||||
font-size: 1.5em;
|
||||
}
|
||||
|
||||
.burger-menu {
|
||||
background: none;
|
||||
border: none;
|
||||
color: white;
|
||||
font-size: 1.5em;
|
||||
cursor: pointer;
|
||||
display: none;
|
||||
}
|
||||
|
||||
.menu {
|
||||
list-style: none;
|
||||
display: flex;
|
||||
justify-content: space-around;
|
||||
flex-grow: 1;
|
||||
}
|
||||
|
||||
header li {
|
||||
margin: 0 10px;
|
||||
}
|
||||
|
||||
header a {
|
||||
color: white;
|
||||
text-decoration: none;
|
||||
padding: 10px;
|
||||
border-radius: 5px;
|
||||
transition: background-color 0.3s ease;
|
||||
}
|
||||
|
||||
header a:hover {
|
||||
background-color: rgba(255, 255, 255, 0.2);
|
||||
}
|
||||
|
||||
/* Article styles */
|
||||
article {
|
||||
margin-top: 100px;
|
||||
padding: 20px;
|
||||
width: 90%;
|
||||
max-width: 800px;
|
||||
background: rgba(255, 255, 255, 0.9);
|
||||
border-radius: 10px;
|
||||
box-shadow: 0 0 10px rgba(0, 0, 0, 0.1);
|
||||
text-align: center;
|
||||
}
|
||||
|
||||
h1 {
|
||||
color: #333;
|
||||
margin-bottom: 20px;
|
||||
}
|
||||
|
||||
p {
|
||||
color: #666;
|
||||
line-height: 1.6;
|
||||
margin-bottom: 20px;
|
||||
}
|
||||
|
||||
img {
|
||||
max-width: 100%;
|
||||
height: auto;
|
||||
margin-bottom: 20px;
|
||||
}
|
||||
|
||||
button {
|
||||
padding: 10px 20px;
|
||||
margin: 2em;
|
||||
border: none;
|
||||
background-color: #333;
|
||||
color: white;
|
||||
border-radius: 5px;
|
||||
cursor: pointer;
|
||||
transition: background-color 0.3s ease;
|
||||
}
|
||||
|
||||
button:hover {
|
||||
background-color: #555;
|
||||
}
|
||||
|
||||
/* Additional CSS for command-line style */
|
||||
.code-box {
|
||||
background-color: #f0f0f0;
|
||||
font-family: "Courier New", Courier, monospace;
|
||||
padding: 10px;
|
||||
border-left: 4px solid #555;
|
||||
margin-left: 20px;
|
||||
}
|
||||
|
||||
.flex {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
}
|
||||
|
||||
/* Cards section styles */
|
||||
section .cards {
|
||||
margin-top: 50px;
|
||||
flex-wrap: wrap;
|
||||
justify-content: space-between;
|
||||
}
|
||||
|
||||
section .card {
|
||||
width: calc(100% / 3 - 30px);
|
||||
text-align: center;
|
||||
list-style: none;
|
||||
background-color: #fff;
|
||||
padding: 40px 15px;
|
||||
border-radius: 5px;
|
||||
box-shadow: 0 5px 10px rgba(0, 0, 0, 0.04);
|
||||
margin-bottom: 20px;
|
||||
}
|
||||
|
||||
section .card img {
|
||||
height: 120px;
|
||||
width: 120px;
|
||||
border-radius: 50%;
|
||||
margin-bottom: 20px;
|
||||
}
|
||||
|
||||
/* Mobile Styles */
|
||||
@media (max-width: 768px) {
|
||||
.burger-menu {
|
||||
display: block;
|
||||
}
|
||||
|
||||
.menu {
|
||||
display: none;
|
||||
flex-direction: column;
|
||||
background-color: rgba(0, 0, 0, 0.7);
|
||||
position: absolute;
|
||||
top: 50px;
|
||||
left: 0;
|
||||
width: 100%;
|
||||
z-index: 999; /* Adjusted z-index to ensure dropdown covers article content */
|
||||
}
|
||||
|
||||
.menu.active {
|
||||
display: flex;
|
||||
}
|
||||
|
||||
header li {
|
||||
margin: 0;
|
||||
width: 100%;
|
||||
}
|
||||
|
||||
header a {
|
||||
padding: 15px;
|
||||
width: 100%;
|
||||
display: block;
|
||||
}
|
||||
}
|
|
@ -1,46 +0,0 @@
|
|||
Charackter1{
|
||||
Name: Björn
|
||||
Race: Dwarf
|
||||
Class: Mage (Level 1)
|
||||
|
||||
Stats{
|
||||
STR 8 -1
|
||||
DEX 12 +1
|
||||
CON 10 -0
|
||||
INT 16 +3
|
||||
WIS 14 +2
|
||||
CHA 12 +1
|
||||
}
|
||||
|
||||
Proficency{Arcana, History, Nature}
|
||||
|
||||
Movement: 30
|
||||
Action: Cast a spell (watch spelllist)
|
||||
Bonus-action:
|
||||
Dagger: +dex+prof 1d4 5
|
||||
Dodge: Damage-halved
|
||||
Reaction:
|
||||
Counterspell: Watch Spellist
|
||||
reduce-harm: Reduce damage taken by a ally by 1d10+level
|
||||
|
||||
Race-feature{
|
||||
Dwarfen-resistance: Poison Damage halved
|
||||
Healing-Word ability
|
||||
reduce-harm
|
||||
}
|
||||
|
||||
Spellslots: 3x Longrest
|
||||
|
||||
Spelllist{
|
||||
Level 0 (At Will Spells):
|
||||
Name Bonus to hit Damage Damagetype reach
|
||||
Firedagger +int+prof 1d10+int fire 120
|
||||
Icedagger +int+prof 1d10+int ice 120
|
||||
Mage-shield - 10 Temporary HP - self
|
||||
Level 1:
|
||||
Create-flame Dex-save 3d6 fire 80 / 20 radius
|
||||
Healing-word - 1d8 heal 30
|
||||
Counterspell If roll higher than enemy == enemy spells doesn't work 30
|
||||
}
|
||||
|
||||
}
|
|
@ -1,44 +0,0 @@
|
|||
Character2 {
|
||||
Name: Elara
|
||||
Race: Elf
|
||||
Class: Ranger (Level 1)
|
||||
|
||||
Stats {
|
||||
STR 10 +0
|
||||
DEX 14 +2
|
||||
CON 12 +1
|
||||
INT 10 +0
|
||||
WIS 16 +3
|
||||
CHA 8 -1
|
||||
}
|
||||
|
||||
Proficiency { Animal Handling, Stealth, Survival }
|
||||
|
||||
Movement: 35
|
||||
Action: Shoot Longbow (watch weaponlist)
|
||||
Bonus-action:
|
||||
Dagger: +dex+prof 1d4+2
|
||||
Hide: Become invisible
|
||||
Reaction:
|
||||
Parry: Reduce damage taken by 1d6+level
|
||||
|
||||
Race-feature {
|
||||
Elven-Agility: Advantage on DEX saves
|
||||
Trance: Elves don't need to sleep and meditate for 4 hours
|
||||
Fey-Ancestry: Advantage on saving throws against being charmed, and magic can't put you to sleep
|
||||
}
|
||||
|
||||
Spellslots: 2x Longrest
|
||||
|
||||
Spelllist {
|
||||
Level 0 (At Will Spells):
|
||||
Name Bonus to hit Damage Damagetype reach
|
||||
Thornwhip +wis+prof 1d6+wis piercing 30
|
||||
Mage-hand - - - 30
|
||||
Guidance - 1d4 - touch
|
||||
Level 1:
|
||||
Goodberry - 1d4 heal 30
|
||||
Hunter's-Mark - 1d6 magic 90
|
||||
Entangle STR-save - Restrained 20 / 20 radius
|
||||
}
|
||||
}
|
|
@ -1,72 +0,0 @@
|
|||
Character5 {
|
||||
Name: Gigachad
|
||||
Race: Human
|
||||
Class: Paladin (Level 20)
|
||||
|
||||
Stats {
|
||||
STR 20 +5
|
||||
DEX 14 +2
|
||||
CON 18 +4
|
||||
INT 10 +0
|
||||
WIS 14 +2
|
||||
CHA 20 +5
|
||||
}
|
||||
|
||||
Proficiency { Athletics, Intimidation, Persuasion, Religion }
|
||||
|
||||
Movement: 30
|
||||
Action: Attack with Greatsword (watch weaponlist)
|
||||
Bonus-action:
|
||||
Divine Smite: Expend a spell slot to deal extra radiant damage
|
||||
Shield of Faith: +2 AC for 10 minutes
|
||||
Lay on Hands: Heal up to 100 HP (pool: level x 5)
|
||||
Reaction:
|
||||
Divine Sense: Detect celestial, fiend, or undead within 60 feet
|
||||
Aura of Protection: Allies within 10 feet add +cha to saving throws
|
||||
|
||||
Race-feature {
|
||||
Human-Determination: Gain proficiency in one additional skill
|
||||
Versatility: Gain one extra feat at Level 1
|
||||
Resilience: Advantage on saving throws against being frightened
|
||||
}
|
||||
|
||||
Feats:
|
||||
Great Weapon Master: Bonus attack on critical hit or kill, and can take a -5 penalty to hit for +10 damage
|
||||
Tough: +2 HP per level
|
||||
Inspiring Leader: Can spend 10 minutes inspiring allies, granting temporary HP equal to level + cha modifier
|
||||
|
||||
Class Features:
|
||||
Divine Health: Immune to disease
|
||||
Aura of Courage: Allies within 10 feet are immune to being frightened
|
||||
Aura of Devotion: Allies within 10 feet are immune to being charmed
|
||||
Cleansing Touch: End one spell on yourself or an ally within touch range (5 times per long rest)
|
||||
Improved Divine Smite: +1d8 radiant damage on melee attacks
|
||||
Lay on Hands: Heal up to 100 HP per long rest
|
||||
Sacred Oath: Oath of Devotion, Oath Spells: (Protection from Evil and Good, Sanctuary, Lesser Restoration, Zone of Truth, Beacon of Hope, Dispel Magic, Freedom of Movement, Guardian of Faith, Commune, Flame Strike, Circle of Power, Holy Weapon)
|
||||
|
||||
Spellslots: 4x 1st, 3x 2nd, 3x 3rd, 3x 4th, 2x 5th (per long rest)
|
||||
|
||||
Spelllist {
|
||||
Level 1:
|
||||
Bless - - adv on attacks and saves 30
|
||||
Shield of Faith - +2 AC - 60
|
||||
Level 2:
|
||||
Lesser Restoration- - heal conditions touch
|
||||
Zone of Truth - - - 60
|
||||
Level 3:
|
||||
Dispel Magic - - - 120
|
||||
Beacon of Hope - - heal max 30
|
||||
Level 4:
|
||||
Guardian of Faith- 20 radiant - 30
|
||||
Freedom of Movement- - - touch
|
||||
Level 5:
|
||||
Circle of Power - - adv on saves self (30 radius)
|
||||
Holy Weapon - 2d8 radiant - 30
|
||||
}
|
||||
|
||||
Weaponlist {
|
||||
Greatsword: +str+prof 2d6+5 slashing
|
||||
Warhammer: +str+prof 1d8+5 bludgeoning (versatile 1d10)
|
||||
Javelin: +str+prof 1d6+5 piercing (range 30/120)
|
||||
}
|
||||
}
|
|
@ -1,45 +0,0 @@
|
|||
Character4 {
|
||||
Name: Lyra
|
||||
Race: Tiefling
|
||||
Class: Bard (Level 1)
|
||||
|
||||
Stats {
|
||||
STR 8 -1
|
||||
DEX 14 +2
|
||||
CON 12 +1
|
||||
INT 12 +1
|
||||
WIS 10 +0
|
||||
CHA 16 +3
|
||||
}
|
||||
|
||||
Proficiency { Performance, Persuasion, Deception }
|
||||
|
||||
Movement: 30
|
||||
Action: Cast a spell (watch spelllist)
|
||||
Bonus-action:
|
||||
Inspiration: Grant a d6 to an ally's ability check, attack roll, or saving throw
|
||||
Dagger: +dex+prof 1d4+2
|
||||
Healing Word: Restore 1d4+cha HP to an ally within 60 feet
|
||||
Reaction:
|
||||
Cutting Words: Use a Bardic Inspiration die to subtract from an enemy's attack roll, ability check, or damage roll
|
||||
|
||||
Race-feature {
|
||||
Hellish Resistance: Resistance to fire damage
|
||||
Infernal Legacy: Can cast Thaumaturgy cantrip; at 3rd level, can cast Hellish Rebuke once per long rest
|
||||
Darkvision: See in darkness within 60 feet
|
||||
}
|
||||
|
||||
Spellslots: 2x Longrest
|
||||
|
||||
Spelllist {
|
||||
Level 0 (At Will Spells):
|
||||
Name Bonus to hit Damage Damagetype reach
|
||||
Vicious Mockery - 1d4 psychic 60
|
||||
Mending - - - touch
|
||||
Prestidigitation- - - 10
|
||||
Level 1:
|
||||
Healing Word - 1d4+cha heal 60
|
||||
Faerie Fire Dex-save - adv on attacks 20 ft cube
|
||||
Charm Person Wis-save - charmed 30
|
||||
}
|
||||
}
|
|
@ -1,43 +0,0 @@
|
|||
Character3 {
|
||||
Name: Tharok
|
||||
Race: Human
|
||||
Class: Fighter (Level 1)
|
||||
|
||||
Stats {
|
||||
STR 16 +3
|
||||
DEX 12 +1
|
||||
CON 14 +2
|
||||
INT 10 +0
|
||||
WIS 12 +1
|
||||
CHA 10 +0
|
||||
}
|
||||
|
||||
Proficiency { Athletics, Intimidation, Perception }
|
||||
|
||||
Movement: 30
|
||||
Action: Attack with Longsword (watch weaponlist)
|
||||
Bonus-action:
|
||||
Second Wind: Regain 1d10+level HP
|
||||
Dagger: +dex+prof 1d4+1
|
||||
Reaction:
|
||||
Parry: Reduce damage taken by 1d6+level
|
||||
|
||||
Race-feature {
|
||||
Human-Determination: Gain proficiency in one additional skill
|
||||
Versatility: Gain one extra feat at Level 1
|
||||
Resilience: Advantage on saving throws against being frightened
|
||||
}
|
||||
|
||||
Feats:
|
||||
Great Weapon Fighting: Reroll 1s and 2s on damage dice with melee weapons wielded in two hands
|
||||
|
||||
Combat Skills:
|
||||
Second Wind: Once per short rest, you can use a bonus action to regain 1d10+level HP
|
||||
Action Surge: Once per short rest, take one additional action on your turn
|
||||
|
||||
Weaponlist {
|
||||
Longsword: +str+prof 1d8+3 slashing
|
||||
Greatsword: +str+prof 2d6+3 slashing
|
||||
Dagger: +dex+prof 1d4+1 piercing
|
||||
}
|
||||
}
|
Before Width: | Height: | Size: 508 B |
Before Width: | Height: | Size: 1.8 KiB |
Before Width: | Height: | Size: 461 B |
Before Width: | Height: | Size: 540 B |
Before Width: | Height: | Size: 2.6 KiB |
62
export_presets.cfg
Normal file
|
@ -0,0 +1,62 @@
|
|||
[preset.0]
|
||||
|
||||
name="Windows Desktop"
|
||||
platform="Windows Desktop"
|
||||
runnable=true
|
||||
dedicated_server=false
|
||||
custom_features=""
|
||||
export_filter="all_resources"
|
||||
include_filter=""
|
||||
exclude_filter=""
|
||||
export_path="../Desktop/debug.exe"
|
||||
encryption_include_filters=""
|
||||
encryption_exclude_filters=""
|
||||
encrypt_pck=false
|
||||
encrypt_directory=false
|
||||
|
||||
[preset.0.options]
|
||||
|
||||
custom_template/debug=""
|
||||
custom_template/release=""
|
||||
debug/export_console_wrapper=1
|
||||
binary_format/embed_pck=false
|
||||
texture_format/bptc=true
|
||||
texture_format/s3tc=true
|
||||
texture_format/etc=false
|
||||
texture_format/etc2=false
|
||||
binary_format/architecture="x86_64"
|
||||
codesign/enable=false
|
||||
codesign/timestamp=true
|
||||
codesign/timestamp_server_url=""
|
||||
codesign/digest_algorithm=1
|
||||
codesign/description=""
|
||||
codesign/custom_options=PackedStringArray()
|
||||
application/modify_resources=true
|
||||
application/icon=""
|
||||
application/console_wrapper_icon=""
|
||||
application/icon_interpolation=4
|
||||
application/file_version=""
|
||||
application/product_version=""
|
||||
application/company_name=""
|
||||
application/product_name=""
|
||||
application/file_description=""
|
||||
application/copyright=""
|
||||
application/trademarks=""
|
||||
application/export_angle=0
|
||||
ssh_remote_deploy/enabled=false
|
||||
ssh_remote_deploy/host="user@host_ip"
|
||||
ssh_remote_deploy/port="22"
|
||||
ssh_remote_deploy/extra_args_ssh=""
|
||||
ssh_remote_deploy/extra_args_scp=""
|
||||
ssh_remote_deploy/run_script="Expand-Archive -LiteralPath '{temp_dir}\\{archive_name}' -DestinationPath '{temp_dir}'
|
||||
$action = New-ScheduledTaskAction -Execute '{temp_dir}\\{exe_name}' -Argument '{cmd_args}'
|
||||
$trigger = New-ScheduledTaskTrigger -Once -At 00:00
|
||||
$settings = New-ScheduledTaskSettingsSet
|
||||
$task = New-ScheduledTask -Action $action -Trigger $trigger -Settings $settings
|
||||
Register-ScheduledTask godot_remote_debug -InputObject $task -Force:$true
|
||||
Start-ScheduledTask -TaskName godot_remote_debug
|
||||
while (Get-ScheduledTask -TaskName godot_remote_debug | ? State -eq running) { Start-Sleep -Milliseconds 100 }
|
||||
Unregister-ScheduledTask -TaskName godot_remote_debug -Confirm:$false -ErrorAction:SilentlyContinue"
|
||||
ssh_remote_deploy/cleanup_script="Stop-ScheduledTask -TaskName godot_remote_debug -ErrorAction:SilentlyContinue
|
||||
Unregister-ScheduledTask -TaskName godot_remote_debug -Confirm:$false -ErrorAction:SilentlyContinue
|
||||
Remove-Item -Recurse -Force '{temp_dir}'"
|
1
icon.svg
|
@ -1 +0,0 @@
|
|||
<svg height="128" width="128" xmlns="http://www.w3.org/2000/svg"><rect x="2" y="2" width="124" height="124" rx="14" fill="#363d52" stroke="#212532" stroke-width="4"/><g transform="scale(.101) translate(122 122)"><g fill="#fff"><path d="M105 673v33q407 354 814 0v-33z"/><path d="m105 673 152 14q12 1 15 14l4 67 132 10 8-61q2-11 15-15h162q13 4 15 15l8 61 132-10 4-67q3-13 15-14l152-14V427q30-39 56-81-35-59-83-108-43 20-82 47-40-37-88-64 7-51 8-102-59-28-123-42-26 43-46 89-49-7-98 0-20-46-46-89-64 14-123 42 1 51 8 102-48 27-88 64-39-27-82-47-48 49-83 108 26 42 56 81zm0 33v39c0 276 813 276 814 0v-39l-134 12-5 69q-2 10-14 13l-162 11q-12 0-16-11l-10-65H446l-10 65q-4 11-16 11l-162-11q-12-3-14-13l-5-69z" fill="#478cbf"/><path d="M483 600c0 34 58 34 58 0v-86c0-34-58-34-58 0z"/><circle cx="725" cy="526" r="90"/><circle cx="299" cy="526" r="90"/></g><g fill="#414042"><circle cx="307" cy="532" r="60"/><circle cx="717" cy="532" r="60"/></g></g></svg>
|
Before Width: | Height: | Size: 949 B |
|
@ -1,37 +0,0 @@
|
|||
[remap]
|
||||
|
||||
importer="texture"
|
||||
type="CompressedTexture2D"
|
||||
uid="uid://crc6uo0vyn40q"
|
||||
path="res://.godot/imported/icon.svg-218a8f2b3041327d8a5756f3a245f83b.ctex"
|
||||
metadata={
|
||||
"vram_texture": false
|
||||
}
|
||||
|
||||
[deps]
|
||||
|
||||
source_file="res://icon.svg"
|
||||
dest_files=["res://.godot/imported/icon.svg-218a8f2b3041327d8a5756f3a245f83b.ctex"]
|
||||
|
||||
[params]
|
||||
|
||||
compress/mode=0
|
||||
compress/high_quality=false
|
||||
compress/lossy_quality=0.7
|
||||
compress/hdr_compression=1
|
||||
compress/normal_map=0
|
||||
compress/channel_pack=0
|
||||
mipmaps/generate=false
|
||||
mipmaps/limit=-1
|
||||
roughness/mode=0
|
||||
roughness/src_normal=""
|
||||
process/fix_alpha_border=true
|
||||
process/premult_alpha=false
|
||||
process/normal_map_invert_y=false
|
||||
process/hdr_as_srgb=false
|
||||
process/hdr_clamp_exposure=false
|
||||
process/size_limit=0
|
||||
detect_3d/compress_to=1
|
||||
svg/scale=1.0
|
||||
editor/scale_with_editor_scale=false
|
||||
editor/convert_colors_with_editor_theme=false
|
|
@ -10,8 +10,8 @@ config_version=5
|
|||
|
||||
[application]
|
||||
|
||||
config/name="openDND"
|
||||
run/main_scene="res://scenes/test/map.tscn"
|
||||
config/name="FreeTTRPG"
|
||||
run/main_scene="res://scenes/menu/main.tscn"
|
||||
config/features=PackedStringArray("4.2", "GL Compatibility")
|
||||
config/icon="res://icon.svg"
|
||||
|
||||
|
@ -44,6 +44,11 @@ down={
|
|||
"events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":0,"physical_keycode":83,"key_label":0,"unicode":115,"echo":false,"script":null)
|
||||
]
|
||||
}
|
||||
escape={
|
||||
"deadzone": 0.5,
|
||||
"events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":0,"physical_keycode":4194305,"key_label":0,"unicode":0,"echo":false,"script":null)
|
||||
]
|
||||
}
|
||||
|
||||
[rendering]
|
||||
|
||||
|
|
30
scenes/map/map.tscn
Normal file
|
@ -0,0 +1,30 @@
|
|||
[gd_scene load_steps=3 format=3 uid="uid://mie5ckydb8k5"]
|
||||
|
||||
[ext_resource type="PackedScene" uid="uid://brmtkn1ddxrp1" path="res://testing/test/level.tscn" id="1_sw0jh"]
|
||||
[ext_resource type="PackedScene" uid="uid://btl7r0wvecyd3" path="res://scenes/menu/view.tscn" id="2_7des0"]
|
||||
|
||||
[node name="map" type="Node2D"]
|
||||
|
||||
[node name="level" parent="." instance=ExtResource("1_sw0jh")]
|
||||
|
||||
[node name="characterViewer" parent="." instance=ExtResource("2_7des0")]
|
||||
visible = false
|
||||
anchors_preset = 0
|
||||
anchor_right = 0.0
|
||||
anchor_bottom = 0.0
|
||||
offset_right = 800.0
|
||||
offset_bottom = 500.0
|
||||
grow_horizontal = 1
|
||||
grow_vertical = 1
|
||||
|
||||
[node name="back" type="Button" parent="."]
|
||||
visible = false
|
||||
offset_left = 512.0
|
||||
offset_top = 400.0
|
||||
offset_right = 638.0
|
||||
offset_bottom = 435.0
|
||||
scale = Vector2(2, 2)
|
||||
disabled = true
|
||||
text = "Back to game"
|
||||
|
||||
[connection signal="pressed" from="back" to="level" method="_on_back_pressed"]
|
39
scenes/menu/create.tscn
Normal file
|
@ -0,0 +1,39 @@
|
|||
[gd_scene load_steps=2 format=3 uid="uid://b6t6yd7qnid1i"]
|
||||
|
||||
[ext_resource type="Script" path="res://scripts/createStats.gd" id="1_xsj3b"]
|
||||
|
||||
[node name="characterCreator" type="Control"]
|
||||
layout_mode = 3
|
||||
anchors_preset = 15
|
||||
anchor_right = 1.0
|
||||
anchor_bottom = 1.0
|
||||
grow_horizontal = 2
|
||||
grow_vertical = 2
|
||||
script = ExtResource("1_xsj3b")
|
||||
|
||||
[node name="button" type="Button" parent="."]
|
||||
layout_mode = 0
|
||||
offset_left = 512.0
|
||||
offset_top = 400.0
|
||||
offset_right = 638.0
|
||||
offset_bottom = 435.0
|
||||
scale = Vector2(2, 2)
|
||||
text = "Send"
|
||||
|
||||
[node name="ScrollContainer" type="ScrollContainer" parent="."]
|
||||
layout_mode = 1
|
||||
anchors_preset = 13
|
||||
anchor_left = 0.5
|
||||
anchor_right = 0.5
|
||||
anchor_bottom = 1.0
|
||||
offset_left = -400.0
|
||||
offset_right = 104.0
|
||||
grow_horizontal = 2
|
||||
grow_vertical = 2
|
||||
|
||||
[node name="VBoxContainer" type="VBoxContainer" parent="ScrollContainer"]
|
||||
layout_mode = 2
|
||||
size_flags_horizontal = 3
|
||||
size_flags_vertical = 3
|
||||
|
||||
[connection signal="pressed" from="button" to="." method="_on_button_pressed"]
|
6
scenes/menu/inputOutput.tscn
Normal file
|
@ -0,0 +1,6 @@
|
|||
[gd_scene format=3 uid="uid://rkl6u7cdusys"]
|
||||
|
||||
[node name="Input-output" type="TextEdit"]
|
||||
offset_right = 168.0
|
||||
offset_bottom = 40.0
|
||||
scale = Vector2(2, 2)
|
|
@ -2,22 +2,48 @@
|
|||
|
||||
[ext_resource type="Script" path="res://scripts/menu.gd" id="1_xc6y7"]
|
||||
|
||||
[node name="Control" type="Control"]
|
||||
[node name="mainMenu" type="Control"]
|
||||
layout_mode = 3
|
||||
anchors_preset = 15
|
||||
anchor_right = 1.0
|
||||
anchor_bottom = 1.0
|
||||
grow_horizontal = 2
|
||||
grow_vertical = 2
|
||||
script = ExtResource("1_xc6y7")
|
||||
|
||||
[node name="Button" type="Button" parent="."]
|
||||
layout_mode = 0
|
||||
offset_left = 3.05176e-05
|
||||
offset_top = 1.52588e-05
|
||||
offset_right = 90.0
|
||||
offset_right = 96.0
|
||||
offset_bottom = 32.0
|
||||
scale = Vector2(5, 5)
|
||||
text = "Test"
|
||||
script = ExtResource("1_xc6y7")
|
||||
scale = Vector2(4, 4)
|
||||
text = "Play"
|
||||
|
||||
[connection signal="pressed" from="Button" to="Button" method="_on_pressed"]
|
||||
[node name="Button2" type="Button" parent="."]
|
||||
layout_mode = 0
|
||||
offset_top = 184.0
|
||||
offset_right = 96.0
|
||||
offset_bottom = 216.0
|
||||
scale = Vector2(4, 4)
|
||||
text = "View
|
||||
"
|
||||
|
||||
[node name="Button3" type="Button" parent="."]
|
||||
layout_mode = 0
|
||||
offset_top = 368.0
|
||||
offset_right = 96.0
|
||||
offset_bottom = 400.0
|
||||
scale = Vector2(4, 4)
|
||||
text = "Creator"
|
||||
|
||||
[node name="Label" type="Label" parent="."]
|
||||
layout_mode = 0
|
||||
offset_left = 488.0
|
||||
offset_top = 432.0
|
||||
offset_right = 592.0
|
||||
offset_bottom = 455.0
|
||||
scale = Vector2(3, 3)
|
||||
text = "Version: 0.0.4"
|
||||
|
||||
[connection signal="pressed" from="Button" to="." method="_on_button_pressed"]
|
||||
[connection signal="pressed" from="Button2" to="." method="_on_button_2_pressed"]
|
||||
[connection signal="pressed" from="Button3" to="." method="_on_button_3_pressed"]
|
||||
|
|
39
scenes/menu/view.tscn
Normal file
|
@ -0,0 +1,39 @@
|
|||
[gd_scene load_steps=2 format=3 uid="uid://btl7r0wvecyd3"]
|
||||
|
||||
[ext_resource type="Script" path="res://scripts/getStats.gd" id="1_dcehj"]
|
||||
|
||||
[node name="characterViewer" type="Control"]
|
||||
layout_mode = 3
|
||||
anchors_preset = 15
|
||||
anchor_right = 1.0
|
||||
anchor_bottom = 1.0
|
||||
grow_horizontal = 2
|
||||
grow_vertical = 2
|
||||
script = ExtResource("1_dcehj")
|
||||
|
||||
[node name="button" type="Button" parent="."]
|
||||
layout_mode = 2
|
||||
offset_left = 512.0
|
||||
offset_top = 400.0
|
||||
offset_right = 638.0
|
||||
offset_bottom = 435.0
|
||||
scale = Vector2(2, 2)
|
||||
text = "Get"
|
||||
|
||||
[node name="ScrollContainer" type="ScrollContainer" parent="."]
|
||||
layout_mode = 1
|
||||
anchors_preset = 13
|
||||
anchor_left = 0.5
|
||||
anchor_right = 0.5
|
||||
anchor_bottom = 1.0
|
||||
offset_left = -400.0
|
||||
offset_right = 104.0
|
||||
grow_horizontal = 2
|
||||
grow_vertical = 2
|
||||
|
||||
[node name="VBoxContainer" type="VBoxContainer" parent="ScrollContainer"]
|
||||
layout_mode = 2
|
||||
size_flags_horizontal = 3
|
||||
size_flags_vertical = 3
|
||||
|
||||
[connection signal="pressed" from="button" to="." method="_on_button_pressed"]
|
|
@ -1,18 +0,0 @@
|
|||
[gd_scene load_steps=4 format=3 uid="uid://dv67vdgb4h44q"]
|
||||
|
||||
[ext_resource type="Texture2D" uid="uid://dheqglouhkis6" path="res://assets/test/player.png" id="1_cujcj"]
|
||||
[ext_resource type="Script" path="res://scripts/player.gd" id="1_oik63"]
|
||||
|
||||
[sub_resource type="RectangleShape2D" id="RectangleShape2D_kf6qt"]
|
||||
size = Vector2(20, 18)
|
||||
|
||||
[node name="CharacterBody2D" type="CharacterBody2D"]
|
||||
script = ExtResource("1_oik63")
|
||||
|
||||
[node name="Sprite2D" type="Sprite2D" parent="."]
|
||||
texture = ExtResource("1_cujcj")
|
||||
|
||||
[node name="CollisionShape2D" type="CollisionShape2D" parent="."]
|
||||
shape = SubResource("RectangleShape2D_kf6qt")
|
||||
|
||||
[node name="Camera2D" type="Camera2D" parent="."]
|
54
scripts/createStats.gd
Normal file
|
@ -0,0 +1,54 @@
|
|||
extends Node
|
||||
|
||||
var field = preload("res://scenes/menu/inputOutput.tscn")
|
||||
var data:Dictionary
|
||||
|
||||
func loadJSON(savePath):
|
||||
if not FileAccess.file_exists(savePath):
|
||||
return false
|
||||
var fileAccess = FileAccess.open(savePath, FileAccess.READ)
|
||||
var jsonString = fileAccess.get_line()
|
||||
fileAccess.close()
|
||||
|
||||
var json = JSON.new()
|
||||
var error = json.parse(jsonString)
|
||||
if error:
|
||||
print("JSON Parse Error: ", json.get_error_message(), " in ", jsonString, " at line ", json.get_error_line())
|
||||
return false
|
||||
|
||||
data = json.data
|
||||
return true
|
||||
|
||||
func _ready():
|
||||
if loadJSON("res://content/stats.json"):
|
||||
for i in range(int(data.get("amount"))):
|
||||
var fieldInstance = field.instantiate()
|
||||
$"ScrollContainer/VBoxContainer".add_child(fieldInstance)
|
||||
$"ScrollContainer/VBoxContainer".get_child(i).position = Vector2(16,(16+i*88))
|
||||
$"ScrollContainer/VBoxContainer".get_child(i).placeholder_text = data.get(str(i))
|
||||
$"ScrollContainer/VBoxContainer".get_child(i).custom_minimum_size.y = 40
|
||||
|
||||
func saveJSON(savePath):
|
||||
var saveData = {}
|
||||
|
||||
for i in range(int(data.get("amount"))):
|
||||
if i > 0:
|
||||
saveData[data.get(str(i))] = $"ScrollContainer/VBoxContainer".get_child(i).text
|
||||
|
||||
var jsonString = JSON.stringify(saveData)
|
||||
|
||||
var fileAccess = FileAccess.open(savePath, FileAccess.WRITE)
|
||||
if not fileAccess:
|
||||
print("An error happened while saving data: ", FileAccess.get_open_error())
|
||||
return
|
||||
|
||||
fileAccess.store_line(jsonString)
|
||||
fileAccess.close()
|
||||
|
||||
func _on_button_pressed():
|
||||
var savePath = str("user://player_data"+$"ScrollContainer/VBoxContainer".get_child(0).text+".json")
|
||||
saveJSON(savePath)
|
||||
|
||||
func _process(delta):
|
||||
if Input.is_action_pressed("escape"):
|
||||
get_tree().change_scene_to_file("res://scenes/menu/main.tscn")
|
46
scripts/getStats.gd
Normal file
|
@ -0,0 +1,46 @@
|
|||
extends Node
|
||||
|
||||
var field = preload("res://scenes/menu/inputOutput.tscn")
|
||||
var data:Dictionary
|
||||
var amount
|
||||
|
||||
func loadJSON(savePath):
|
||||
if not FileAccess.file_exists(savePath):
|
||||
return false
|
||||
var fileAccess = FileAccess.open(savePath, FileAccess.READ)
|
||||
var json_string = fileAccess.get_line()
|
||||
fileAccess.close()
|
||||
|
||||
var json = JSON.new()
|
||||
var error = json.parse(json_string)
|
||||
if error:
|
||||
print("JSON Parse Error: ", json.get_error_message(), " in ", json_string, " at line ", json.get_error_line())
|
||||
return false
|
||||
|
||||
data = json.data
|
||||
return true
|
||||
|
||||
func _ready():
|
||||
if loadJSON("res://content/stats.json"):
|
||||
for i in range(int(data.get("amount"))):
|
||||
var fieldInstance = field.instantiate()
|
||||
$"ScrollContainer/VBoxContainer".add_child(fieldInstance)
|
||||
$"ScrollContainer/VBoxContainer".get_child(i).placeholder_text = data.get(str(i))
|
||||
$"ScrollContainer/VBoxContainer".get_child(i).custom_minimum_size.y = 40
|
||||
if i > 0:
|
||||
$"ScrollContainer/VBoxContainer".get_child(i).editable = false
|
||||
amount = data.get("amount")
|
||||
|
||||
func _on_button_pressed():
|
||||
var savePath = str("user://player_data"+$"ScrollContainer/VBoxContainer".get_child(0).text+".json")
|
||||
if loadJSON(savePath):
|
||||
for i in range(int(amount)-1):
|
||||
$"ScrollContainer/VBoxContainer".get_child(i+1).text = data.get(str($"ScrollContainer/VBoxContainer".get_child(i+1).placeholder_text))
|
||||
|
||||
func _process(_delta):
|
||||
if Input.is_action_pressed("escape"):
|
||||
get_tree().change_scene_to_file("res://scenes/menu/main.tscn")
|
||||
|
||||
func hideGet():
|
||||
$button.visible = false
|
||||
$button.disabled = true
|
37
scripts/mapscript.gd
Normal file
|
@ -0,0 +1,37 @@
|
|||
extends Node2D
|
||||
|
||||
var playerAmount=2
|
||||
var playerIndex=0
|
||||
var objectName
|
||||
|
||||
func _ready():
|
||||
$"../characterViewer".hideGet()
|
||||
next()
|
||||
|
||||
func next():
|
||||
if playerIndex >= playerAmount:
|
||||
playerIndex = 0
|
||||
objectName= "player%d" % playerIndex
|
||||
print(objectName)
|
||||
get_node(objectName).start()
|
||||
playerIndex += 1
|
||||
|
||||
func stats():
|
||||
visible = false
|
||||
$"../characterViewer".visible = true
|
||||
get_node(objectName).stop()
|
||||
$"../back".disabled = false
|
||||
$"../back".visible = true
|
||||
$"../characterViewer/ScrollContainer/VBoxContainer".get_child(0).text = str(playerIndex-1)
|
||||
$"../characterViewer/ScrollContainer/VBoxContainer".get_child(0).editable = false
|
||||
$"../characterViewer"._on_button_pressed()
|
||||
|
||||
func restart():
|
||||
visible = true
|
||||
$"../characterViewer".visible = false
|
||||
get_node(objectName).start()
|
||||
$"../back".disabled = true
|
||||
$"../back".visible = false
|
||||
|
||||
func _on_back_pressed():
|
||||
restart()
|
|
@ -1,4 +1,14 @@
|
|||
extends Node
|
||||
|
||||
func _on_pressed():
|
||||
get_tree().change_scene_to_file("res://scenes/test/map.tscn")
|
||||
|
||||
|
||||
func _on_button_pressed():
|
||||
get_tree().change_scene_to_file("res://scenes/map/map.tscn")
|
||||
|
||||
|
||||
func _on_button_2_pressed():
|
||||
get_tree().change_scene_to_file("res://scenes/menu/view.tscn")
|
||||
|
||||
|
||||
func _on_button_3_pressed():
|
||||
get_tree().change_scene_to_file("res://scenes/menu/create.tscn")
|
||||
|
|
|
@ -1,11 +1,39 @@
|
|||
extends CharacterBody2D
|
||||
|
||||
@export var speed = 200
|
||||
var distanceTo = 0
|
||||
var active = false
|
||||
|
||||
func get_input():
|
||||
if Input.is_action_pressed("escape"):
|
||||
get_tree().change_scene_to_file("res://scenes/menu/main.tscn")
|
||||
var input_direction = Input.get_vector("left", "right", "up", "down")
|
||||
velocity = input_direction * speed
|
||||
|
||||
func _physics_process(delta):
|
||||
get_input()
|
||||
move_and_slide()
|
||||
var toCalculate = position
|
||||
if active:
|
||||
get_input()
|
||||
move_and_slide()
|
||||
distanceTo += position.distance_to(toCalculate)
|
||||
print(distanceTo)
|
||||
if distanceTo > 500 and active:
|
||||
stop()
|
||||
distanceTo = 0
|
||||
get_parent().next()
|
||||
|
||||
|
||||
func start():
|
||||
$camera.enabled = true
|
||||
active = true
|
||||
$stats.disabled = false
|
||||
$stats.visible = true
|
||||
|
||||
func stop():
|
||||
$camera.enabled = false
|
||||
active = false
|
||||
$stats.disabled = true
|
||||
$stats.visible = false
|
||||
|
||||
func _on_stats_pressed():
|
||||
get_parent().stats()
|
||||
|
|
31
testing/test/player.tscn
Normal file
|
@ -0,0 +1,31 @@
|
|||
[gd_scene load_steps=4 format=3 uid="uid://dv67vdgb4h44q"]
|
||||
|
||||
[ext_resource type="Texture2D" uid="uid://dheqglouhkis6" path="res://testing/testAssets/player.png" id="1_cujcj"]
|
||||
[ext_resource type="Script" path="res://scripts/player.gd" id="1_oik63"]
|
||||
|
||||
[sub_resource type="RectangleShape2D" id="RectangleShape2D_kf6qt"]
|
||||
size = Vector2(20, 18)
|
||||
|
||||
[node name="player" type="CharacterBody2D"]
|
||||
script = ExtResource("1_oik63")
|
||||
|
||||
[node name="sprite" type="Sprite2D" parent="."]
|
||||
texture = ExtResource("1_cujcj")
|
||||
|
||||
[node name="CollisionShape2D" type="CollisionShape2D" parent="."]
|
||||
shape = SubResource("RectangleShape2D_kf6qt")
|
||||
|
||||
[node name="camera" type="Camera2D" parent="."]
|
||||
enabled = false
|
||||
|
||||
[node name="stats" type="Button" parent="."]
|
||||
visible = false
|
||||
offset_left = 112.0
|
||||
offset_top = 152.0
|
||||
offset_right = 238.0
|
||||
offset_bottom = 187.0
|
||||
scale = Vector2(2, 2)
|
||||
disabled = true
|
||||
text = "Stats"
|
||||
|
||||
[connection signal="pressed" from="stats" to="." method="_on_stats_pressed"]
|
After Width: | Height: | Size: 508 B |
|
@ -2,16 +2,16 @@
|
|||
|
||||
importer="texture"
|
||||
type="CompressedTexture2D"
|
||||
uid="uid://cjt5fedr54w6u"
|
||||
path="res://.godot/imported/gigachad.png-0332640cb704dbcf450ac0f1e305a5f8.ctex"
|
||||
uid="uid://slau07w56ipp"
|
||||
path="res://.godot/imported/gigachad.png-950f249fad71ecb8cb5ffe1b8e0aaa85.ctex"
|
||||
metadata={
|
||||
"vram_texture": false
|
||||
}
|
||||
|
||||
[deps]
|
||||
|
||||
source_file="res://assets/test/gigachad.png"
|
||||
dest_files=["res://.godot/imported/gigachad.png-0332640cb704dbcf450ac0f1e305a5f8.ctex"]
|
||||
source_file="res://testing/testAssets/gigachad.png"
|
||||
dest_files=["res://.godot/imported/gigachad.png-950f249fad71ecb8cb5ffe1b8e0aaa85.ctex"]
|
||||
|
||||
[params]
|
||||
|
After Width: | Height: | Size: 1.8 KiB |
|
@ -3,15 +3,15 @@
|
|||
importer="texture"
|
||||
type="CompressedTexture2D"
|
||||
uid="uid://bgdgd23qgi52x"
|
||||
path="res://.godot/imported/grass.png-bb6d7e2a4e3a4ad0eb76f57232766d96.ctex"
|
||||
path="res://.godot/imported/grass.png-9d67070b94003a4c9ef0fabcfb53d979.ctex"
|
||||
metadata={
|
||||
"vram_texture": false
|
||||
}
|
||||
|
||||
[deps]
|
||||
|
||||
source_file="res://assets/test/grass.png"
|
||||
dest_files=["res://.godot/imported/grass.png-bb6d7e2a4e3a4ad0eb76f57232766d96.ctex"]
|
||||
source_file="res://testing/testAssets/grass.png"
|
||||
dest_files=["res://.godot/imported/grass.png-9d67070b94003a4c9ef0fabcfb53d979.ctex"]
|
||||
|
||||
[params]
|
||||
|
After Width: | Height: | Size: 461 B |
|
@ -3,15 +3,15 @@
|
|||
importer="texture"
|
||||
type="CompressedTexture2D"
|
||||
uid="uid://dheqglouhkis6"
|
||||
path="res://.godot/imported/player.png-40bc1da34d1da22b834e701c7257e718.ctex"
|
||||
path="res://.godot/imported/player.png-a3dc637dcfcac9b2cc12965322007c1c.ctex"
|
||||
metadata={
|
||||
"vram_texture": false
|
||||
}
|
||||
|
||||
[deps]
|
||||
|
||||
source_file="res://assets/test/player.png"
|
||||
dest_files=["res://.godot/imported/player.png-40bc1da34d1da22b834e701c7257e718.ctex"]
|
||||
source_file="res://testing/testAssets/player.png"
|
||||
dest_files=["res://.godot/imported/player.png-a3dc637dcfcac9b2cc12965322007c1c.ctex"]
|
||||
|
||||
[params]
|
||||
|
BIN
testing/testAssets/sand.png
Normal file
After Width: | Height: | Size: 326 B |
After Width: | Height: | Size: 540 B |
|
@ -2,16 +2,16 @@
|
|||
|
||||
importer="texture"
|
||||
type="CompressedTexture2D"
|
||||
uid="uid://jdhx6w38ifh7"
|
||||
path="res://.godot/imported/tharok.png-154bb81c083d35fa46f266b3cfa46578.ctex"
|
||||
uid="uid://bgwtew3kupb5c"
|
||||
path="res://.godot/imported/tharok.png-60f89b581d56d7a95618ce50dd583112.ctex"
|
||||
metadata={
|
||||
"vram_texture": false
|
||||
}
|
||||
|
||||
[deps]
|
||||
|
||||
source_file="res://assets/test/tharok.png"
|
||||
dest_files=["res://.godot/imported/tharok.png-154bb81c083d35fa46f266b3cfa46578.ctex"]
|
||||
source_file="res://testing/testAssets/tharok.png"
|
||||
dest_files=["res://.godot/imported/tharok.png-60f89b581d56d7a95618ce50dd583112.ctex"]
|
||||
|
||||
[params]
|
||||
|
After Width: | Height: | Size: 2.6 KiB |
|
@ -3,15 +3,15 @@
|
|||
importer="texture"
|
||||
type="CompressedTexture2D"
|
||||
uid="uid://chgkgpiiy1yui"
|
||||
path="res://.godot/imported/water.png-294f741d71b412e0a6039d5110937f78.ctex"
|
||||
path="res://.godot/imported/water.png-455790e486e896b50dab7d58df164d3a.ctex"
|
||||
metadata={
|
||||
"vram_texture": false
|
||||
}
|
||||
|
||||
[deps]
|
||||
|
||||
source_file="res://assets/test/water.png"
|
||||
dest_files=["res://.godot/imported/water.png-294f741d71b412e0a6039d5110937f78.ctex"]
|
||||
source_file="res://testing/testAssets/water.png"
|
||||
dest_files=["res://.godot/imported/water.png-455790e486e896b50dab7d58df164d3a.ctex"]
|
||||
|
||||
[params]
|
||||
|