Compare commits

..

No commits in common. "main" and "feature/applicationv2" have entirely different histories.

3614 changed files with 26512 additions and 173508 deletions

View File

@ -7,8 +7,6 @@ on:
jobs: jobs:
build: build:
runs-on: node-01 runs-on: node-01
permissions:
contents: write
steps: steps:
- name: Print Tag - name: Print Tag
run: | run: |
@ -40,15 +38,11 @@ jobs:
zip -r release.zip . # Adjust the path to your build output directory zip -r release.zip . # Adjust the path to your build output directory
mv release.zip /tmp/release.zip mv release.zip /tmp/release.zip
- name: Auto Commit
run: |
git add .
git commit -m "auto commit"
git push origin HEAD:main
- name: Package Upload - name: Package Upload
uses: akkuman/gitea-release-action@v1 uses: akkuman/gitea-release-action@v1
with: with:
server_url: https://git.macniel.online server_url: https://git.macniel.online
files: | files: |
/tmp/release.zip /tmp/release.zip
./dist/system.json

View File

@ -1,21 +0,0 @@
<component name="InspectionProjectProfileManager">
<profile version="1.0">
<option name="myName" value="Project Default" />
<inspection_tool class="HtmlUnknownTag" enabled="true" level="WARNING" enabled_by_default="true">
<option name="myValues">
<value>
<list size="7">
<item index="0" class="java.lang.String" itemvalue="nobr" />
<item index="1" class="java.lang.String" itemvalue="noembed" />
<item index="2" class="java.lang.String" itemvalue="comment" />
<item index="3" class="java.lang.String" itemvalue="noscript" />
<item index="4" class="java.lang.String" itemvalue="embed" />
<item index="5" class="java.lang.String" itemvalue="script" />
<item index="6" class="java.lang.String" itemvalue="prose-mirror" />
</list>
</value>
</option>
<option name="myCustomValuesEnabled" value="true" />
</inspection_tool>
</profile>
</component>

View File

@ -1,9 +1,6 @@
Modulentwicklung eines Systems was Das Schwarze Auge 4.1 in FoundryVTT abbildet. Modulentwicklung eines Systems was Das Schwarze Auge 4.1 in FoundryVTT abbildet.
---- ----
Manifest des Systems: `https://git.macniel.online/macniel/foundry-dsa41-game/raw/branch/main/src/system.json`
In diesem Repository findet die Codeentwicklung des Moduls statt. In diesem Repository findet die Codeentwicklung des Moduls statt.
## Weitere Resourcen ## Weitere Resourcen
@ -20,67 +17,4 @@ API: https://foundryvtt.com/api/classes/foundry.abstract.Document.html
Demo: https://github.com/foundryvtt/dnd5e Demo: https://github.com/foundryvtt/dnd5e
# Features Flim Flam
## Spieler Tools
### Währungsanzeige
Mit dieser handlichen Anzeige kann man auf einem Blick sehen, über wieviele Geldmittel man verfügt. Hierzu werden alle Dukaten, Silbertaler, Kreuzer und Heller im Inventar zusammengezählt und ansprechend präsentiert.
### Teilen und Zusammenlegen von Gegenstands-Stapeln
Es ist möglich via Kontextmenü Gegenstands-Stapel in zwei Stapel aufzuteilen, dies ist vorallem dann hilfreich, wenn man Loot aufteilen möchte. Gleichermaßen ist es möglich gleichartige Gegenstands-Stapel zusammenzuführen, in dem man einen Stapel auf ein anderen fallen lässt.
### Attacke Dialog
Über den Charakterbogen kann eine Attacke gestartet werden. In diesem Dialog kann das Ziel, die Waffe sowie das Manvör und etwaige Erschwernisse und Ansagen eingestellt werden. Je nach Länge des Manövers wird die Attacke direkt ausgeführt oder in die Abklingleiste deponiert.
### Verteidigungs Dialog
Über den Charakterbogen kann eine Verteidigung gestartet werden. In diesem Dialog kann die Waffe oder das Manöver ausgewählt werden womit sich der Charakter verteidigen soll. Der Verteidigungswurf wird automatisch durchgeführt.
### Rasten und Regeneration
Es ist möglich den Rasten und Regenerations Dialog von dem Charakterbogen eines Charakters aufzurufen worin man die Einstellungen vornehmen kann die die Regeneration während einer Rest von Lebensenergie und Astralenergie sowie der Heilung von Wunden beeinflussen.
### Mini Charakterbogen
Wenn der Charakterbogen schmall genug gezogen ist, wird dieser aktiviert und enthält lediglich die Seitenleiste sowie die Attribute auf denen gewürfelt werden können. Daneben allerdings befinden sich die Reiter des großen Charakterbogens welche die jeweiligen Seiten in kleiner Form als separates Fenster öffnen lassen.
### Item Browser
Es ist nun möglich auf dem Charakterbogen unter dem Reiter "Inventar" den Item Browser zu öffnen wo alle Gegenstände der aktuellen Welt enthalten sind und mit rudimentären Filtern durchsucht werden können. Ein Spieler kann hierrüber neue Gegenstände kaufen, der Spielleiter hingegen kann per Drag and Drop die gesuchten Gegenstände auf alle Actor Sheets hinzufügen.
## GM Tools
### Gruppenmanagement
Um die Übersicht zu wahren, gibt es mit Gruppen das Werkzeug in die Hände der Spielleitung um wichtige Infos wie
Eigenschaften, Vor und Nachteile und andere Statistiken eines Charakters innerhalb einer Gruppe zu haben und diese
gleichzeitigt mit denen anderer vergleichen zu können.
### Kreaturen
Da die Erstellung eines Charakters sehr komplex ist, gibt es mit Kreaturen eine stark abgespeckte Variante, die leicht
während der Sitzung oder in Vorbereitung angelegt werden können. Nur die für kämpfischer Begegnungen relevanten
Informationen sind verfügbar.
### Händler
Um die Vorbereitung einer Sitzung so komfortabel wie möglich zu gestalten, gibt es mit Händler die Möglichkeit Gebäude
oder NSCs vorzubereiten welche Waren und oder (ggf. in Anzahl beschränkte) Dienstleistungen bereitstellen, gegen einen
Preis natürlich.
### Battle
Um heimlich vergleichend Talentproben von zwei Charakteren und oder Kreaturen durchzuführen gibt es den Battle Dialog. In diesem können Charaktere/Kreaturen ausgewählt werden, deren Talente ausgewählt oder eingegeben (samt Eigenschaften) werden, Erschwernisse eingetragen werden und dann geht es auch schon los.
---
# Acknowledgments
Icon Theme of Equipment Items (e.g. Weapons, Armory, Adventuring Gear) is made by https://soda-1.itch.io/
Tanja für den UI UX Support.

View File

@ -1,109 +1,70 @@
import {dest, series, src} from 'gulp'; import {dest, series, src} from 'gulp';
import gulp from 'gulp';
import process from 'node:process'; import process from 'node:process';
import replace from 'gulp-replace'; import replace from 'gulp-replace';
import jsonModify from 'gulp-json-modify'; import {getRandomValues} from 'node:crypto';
import {subtle} from 'node:crypto';
import * as dartSass from 'sass'; import * as dartSass from 'sass';
import gulpSass from 'gulp-sass'; import gulpSass from 'gulp-sass';
import {deleteAsync} from 'del'; import {deleteAsync} from 'del';
import {readdirSync, readFileSync, writeFileSync, rmdirSync, existsSync, mkdirSync, statSync} from "fs"; import {readdirSync, readFileSync, writeFileSync, rmdirSync, existsSync, mkdirSync} from "fs";
import {join} from 'node:path'; import {join} from 'node:path';
import {compilePack} from '@foundryvtt/foundryvtt-cli'; import {compilePack} from '@foundryvtt/foundryvtt-cli';
const sass = gulpSass(dartSass) const sass = gulpSass(dartSass);
/** /**
* Generate a random alphanumeric string ID of a given requested length using `crypto.getRandomValues()`. * Generate a random alphanumeric string ID of a given requested length using `crypto.getRandomValues()`.
* @param {string} reference The reference which should be used to generate a semi random ID
* @param {number} length The length of the random string to generate, which must be at most 16384. * @param {number} length The length of the random string to generate, which must be at most 16384.
* @returns {string} A string containing random letters (A-Z, a-z) and numbers (0-9). * @returns {string} A string containing random letters (A-Z, a-z) and numbers (0-9).
*/ */
function randomID(reference = "", length = 16) { function randomID(length = 16) {
const encoder = new TextEncoder() const chars = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789";
const data = encoder.encode(reference) const cutoff = 0x100000000 - (0x100000000 % chars.length);
return subtle.digest('SHA-256', data).then(hashBuffer => { const random = new Uint32Array(length);
// Step 2: Convert the hash to a Base62 string do {
const base62Chars = '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz'; getRandomValues(random);
const hashArray = new Uint8Array(hashBuffer) } while (random.some(x => x >= cutoff));
let num = BigInt(0) let id = "";
for (let i = 0; i < length; i++) id += chars[random[i] % chars.length];
// Convert hash buffer to a BigInt return id;
for (let byte of hashArray) {
num = (num << BigInt(8)) | BigInt(byte)
}
let base62Id = '';
while (num > 0) {
const remainder = num % BigInt(62)
base62Id = base62Chars[Number(remainder)] + base62Id
num = num / BigInt(62)
}
// Step 3: Return the first 16 characters
return base62Id.slice(-length)
});
} }
const convert = function (from, to, ofType, overwrite = true) { const convert = function (from, to, ofType) {
const SOURCE = from; const SOURCE = from;
const DEST = to; const DEST = to;
const TYPE = ofType; const TYPE = ofType;
if (overwrite) { try {
try { rmdirSync(DEST, {force: true, recursive: true})
rmdirSync(DEST, {force: true, recursive: true}) } catch (e) {
} catch (e) {
}
mkdirSync(DEST)
} }
mkdirSync(DEST)
let promises = [] readdirSync(SOURCE).forEach(file => {
console.log(file)
let originalSource = JSON.parse(readFileSync(join(SOURCE, file), {encoding: "utf8"}));
let id = randomID();
const filewalker = async (source) => { let targetSource = {
console.debug("entering directory", source) _id: id,
for (let file of readdirSync(source)) { _key: "!items!" + id,
if (statSync(join(source, file)).isDirectory()) { type: TYPE,
await filewalker(join(source, file)) img: originalSource.image,
} else { name: originalSource.name.trim(),
if (file.endsWith(".json")) { system: {...originalSource},
console.debug("processing file", join(source, file))
let originalSource = JSON.parse(readFileSync(join(source, file), {encoding: "utf8"}))
promises.push(new Promise((resolve2) => {
randomID("DSA_4-1" + TYPE + originalSource.name.trim()).then(id => {
let targetSource = {
_id: id,
_key: "!items!" + id,
type: TYPE,
img: originalSource.image,
name: originalSource.name.trim(),
system: {...originalSource},
}
delete targetSource.system.image;
let target = JSON.stringify(targetSource, null, 2)
let newFileName = "./" + join(DEST, id + ".json")
if (!existsSync(join("./", DEST))) {
mkdirSync(join("./", DEST))
}
writeFileSync(newFileName, target, {encoding: "utf8"})
resolve2()
})
}))
}
}
} }
} delete targetSource.system.image;
let target = JSON.stringify(targetSource, null, 2);
let newFileName = "./" + join(DEST, id + ".json");
writeFileSync(newFileName, target, {encoding: "utf8"});
});
filewalker(SOURCE)
return Promise.allSettled(promises)
} }
function cleanDist() { function cleanDist() {
return deleteAsync(['dist/**']) return deleteAsync(['dist/**']);
} }
function buildStyles() { function buildStyles() {
@ -123,60 +84,38 @@ function copyAssets() {
} }
function updateManifestFile() { function updateManifestFile() {
return src('src/system.json') return src('dist/system.json')
.pipe( .pipe(replace('{{VERSION}}', process.env.VERSION))
jsonModify({ .pipe(dest('dist/'))
key: "version",
value: process.env.VERSION
})
)
.pipe(
jsonModify({
key: "download",
value: "https://git.macniel.online/macniel/foundry-dsa41-game/releases/download/{{VERSION}}/release.zip".replace("{{VERSION}}", process.env.VERSION)
})
)
.pipe(dest('src/'))
} }
gulp.task('prepareDB', async function (done) { async function prepareDB() {
try { try {
if (!existsSync("./src/packs/__source")) { if (!existsSync("./src/packs/__source")) {
mkdirSync("./src/packs/__source"); mkdirSync("./src/packs/__source");
} }
await convert("./src/packs/_source/talente", "./src/packs/__source/talente", "Skill") convert("./src/packs/_source/talente", "./src/packs/__source/talente", "Skill");
await convert("./src/packs/_source/zauber-brw", "./src/packs/__source/zauber", "Spell") convert("./src/packs/_source/zauber", "./src/packs/__source/zauber", "Spell");
await convert("./src/packs/_source/vorteile", "./src/packs/__source/vorteile", "Advantage") convert("./src/packs/_source/vorteile", "./src/packs/__source/vorteile", "Advantage");
await convert("./src/packs/_source/nachteile", "./src/packs/__source/vorteile", "Advantage", false) convert("./src/packs/_source/waffen", "./src/packs/__source/waffen", "Equipment");
await convert("./src/packs/_source/sonderfertigkeiten", "./src/packs/__source/sonderfertigkeiten", "SpecialAbility") convert("./src/packs/_source/munition", "./src/packs/__source/munition", "Equipment");
await convert("./src/packs/_source/waehrungen", "./src/packs/__source/waehrungen", "Equipment") convert("./src/packs/_source/ruestzeug", "./src/packs/__source/ruestzeug", "Equipment");
await convert("./src/packs/_source/Gegenstaende/Waffen", "./src/packs/__source/waffen", "Equipment") convert("./src/packs/_source/liturgien-und-segnungen", "./src/packs/__source/liturgien", "Liturgy");
await convert("./src/packs/_source/Gegenstaende/Munition", "./src/packs/__source/munition", "Equipment") convert("./src/packs/_source/wunden", "./src/packs/__source/wunden", "ActiveEffect");
await convert("./src/packs/_source/Gegenstaende/Ruestzeug", "./src/packs/__source/ruestzeug", "Equipment")
await convert("./src/packs/_source/Gegenstaende/Behaelter", "./src/packs/__source/gegenstaende", "Equipment", false) convert("./src/packs/_source/kulturen", "./src/packs/__source/kulturen", "Culture");
await convert("./src/packs/_source/Gegenstaende/Bekleidung", "./src/packs/__source/gegenstaende", "Equipment", false) convert("./src/packs/_source/spezien", "./src/packs/__source/spezien", "Species");
await convert("./src/packs/_source/Gegenstaende/Beleuchtung", "./src/packs/__source/gegenstaende", "Equipment", false) convert("./src/packs/_source/professionen", "./src/packs/__source/professionen", "Profession");
await convert("./src/packs/_source/Gegenstaende/Buecher", "./src/packs/__source/gegenstaende", "Equipment", false)
await convert("./src/packs/_source/Gegenstaende/Essutensilien", "./src/packs/__source/gegenstaende", "Equipment", false)
await convert("./src/packs/_source/Gegenstaende/Sonstiges", "./src/packs/__source/gegenstaende", "Equipment", false)
await convert("./src/packs/_source/Gegenstaende/Werkzeug", "./src/packs/__source/gegenstaende", "Equipment", false)
await convert("./src/packs/_source/Gegenstaende/Seile", "./src/packs/__source/gegenstaende", "Equipment", false)
await convert("./src/packs/_source/liturgien-und-segnungen", "./src/packs/__source/liturgien", "Liturgy")
await convert("./src/packs/_source/wunden", "./src/packs/__source/wunden", "ActiveEffect")
await convert("./src/packs/_source/kulturen", "./src/packs/__source/kulturen", "Culture")
await convert("./src/packs/_source/spezien", "./src/packs/__source/spezien", "Species")
await convert("./src/packs/_source/professionen", "./src/packs/__source/professionen", "Profession")
done()
} catch (err) { } catch (err) {
console.error(err) console.error(err);
} }
})
}
gulp.task('buildDB', function (done) { function buildDB() {
// Determine which source folders to process // Determine which source folders to process
const PACK_SRC = "src/packs/__source" const PACK_SRC = "src/packs/__source"
@ -188,24 +127,23 @@ gulp.task('buildDB', function (done) {
); );
for (const folder of folders) { for (const folder of folders) {
const src = join(PACK_SRC, folder.name) const src = join(PACK_SRC, folder.name);
const dest = join(PACK_DEST, folder.name) const dest = join(PACK_DEST, folder.name);
console.info(`Compiling pack ${folder.name}`) console.info(`Compiling pack ${folder.name}`);
await compilePack(src, dest, {recursive: true, nedb: false}) await compilePack(src, dest, {recursive: true, nedb: false});
} }
resolve() resolve()
done()
}) })
}) }
export default series( export default series(
cleanDist, cleanDist,
updateManifestFile,
copySource, copySource,
copyAssets, copyAssets,
buildStyles, buildStyles,
gulp.task('prepareDB'), prepareDB,
gulp.task('buildDB') buildDB,
updateManifestFile
) )

View File

@ -8,7 +8,7 @@ const DEST = "/home/macniel/.local/share/FoundryVTT/Data/systems/DSA_4-1"
if (existsSync(SRC)) { if (existsSync(SRC)) {
cpSync(SRC, resolve(DEST), {recursive: true}) cpSync(SRC, resolve(DEST), {recursive: true})
console.debug(`copied ${SRC} to ${DEST}`) console.log(`copied ${SRC} to ${DEST}`)
} else { } else {
console.error(`Source ${SRC} does not exists. Forgot to compile?`) console.error(`Source ${SRC} does not exists. Forgot to compile?`)
} }

16480
package-lock.json generated

File diff suppressed because it is too large Load Diff

View File

@ -10,11 +10,10 @@
"scripts": { "scripts": {
"test": "true", "test": "true",
"build": "gulp", "build": "gulp",
"localBuild": "VERSION=0.0.1 gulp",
"installToFoundry": "node installToFoundry.mjs" "installToFoundry": "node installToFoundry.mjs"
}, },
"devDependencies": { "devDependencies": {
"@foundryvtt/foundryvtt-cli": "^3.0.2", "@foundryvtt/foundryvtt-cli": "^3.0.0",
"cb": "^0.1.1", "cb": "^0.1.1",
"del": "^8.0.1", "del": "^8.0.1",
"fvtt-types": "npm:@league-of-foundry-developers/foundry-vtt-types@^13.346.0-beta.20250812191140", "fvtt-types": "npm:@league-of-foundry-developers/foundry-vtt-types@^13.346.0-beta.20250812191140",
@ -27,7 +26,6 @@
"sass-build": "^1.1.6" "sass-build": "^1.1.6"
}, },
"dependencies": { "dependencies": {
"gulp-cli": "^3.1.0", "gulp-cli": "^3.1.0"
"gulp-json-modify": "^1.0.2"
} }
} }

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.4 MiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.2 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.6 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.4 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.3 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.2 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.4 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.4 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.1 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.7 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.4 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1019 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.4 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.1 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1010 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.6 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.2 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.4 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 770 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.3 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.1 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.3 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.9 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.0 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.1 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.2 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.2 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.1 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.7 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.2 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.0 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.5 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.1 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.0 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1002 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.3 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.5 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.6 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.6 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.6 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.4 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.8 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.6 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.5 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.9 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.5 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.8 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.5 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.3 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.3 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.4 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.8 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.4 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.7 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.6 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.7 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.1 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.4 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.8 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.1 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.2 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.2 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.3 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.5 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.8 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.9 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.5 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.3 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.6 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.0 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.9 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.2 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.5 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.8 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 5.1 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.6 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.5 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.4 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.4 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 731 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.4 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.6 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.8 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.3 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.3 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.4 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.3 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.4 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.2 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.4 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.5 KiB

BIN
src/assets/Aves.png 100644

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.8 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.4 KiB

Some files were not shown because too many files have changed in this diff Show More