Compare commits

..

20 Commits

Author SHA1 Message Date
Skellers
38e34826b8 Updating skins 2025-06-17 14:53:20 +02:00
Arlind
312c74cbe1 Update CI from skins-template 2025-06-16 21:24:26 +02:00
071f63c69e [ci skip] push back from pipeline 2025-06-16 19:22:37 +00:00
866964fc29 [ci skip] push back from pipeline 2025-06-16 19:12:46 +00:00
Arlind
c39d4b8cac Update .gitea/workflows/ci.yml
All checks were successful
CI/CD Pipeline / Full CI/CD Pipeline (push) Successful in 11s
2025-06-16 21:12:36 +02:00
57a97d1d51 [ci skip] push back from pipeline 2025-06-16 19:11:38 +00:00
Arlind
310b59a66d Update .gitea/workflows/ci.yml
All checks were successful
CI/CD Pipeline / Full CI/CD Pipeline (push) Successful in 10s
2025-06-16 21:11:27 +02:00
Arlind
a08ada6e3e Update CI from skins-template
Some checks failed
CI/CD Pipeline / Full CI/CD Pipeline (push) Failing after 8s
2025-06-16 20:58:33 +02:00
Arlind
b4e29126a8 Update CI from skins-template
Some checks failed
CI/CD Pipeline / Full CI/CD Pipeline (push) Failing after 5s
2025-06-16 19:53:40 +02:00
Arlind
e81e410b4d Update CI from skins-template 2025-06-16 19:49:26 +02:00
a9abc18533 [ci skip] push back from pipeline 2025-06-16 10:48:08 +00:00
Arlind
0671f1099b Update CI from skins-template
All checks were successful
CI/CD Pipeline / Full CI/CD Pipeline (push) Successful in 6s
2025-06-16 12:48:02 +02:00
Arlind
53af6e573a Update CI from skins-template 2025-06-16 10:55:39 +02:00
Arlind
33734c27f8 Update .gitea/workflows/ci.yml
Some checks failed
CI/CD Pipeline / Full CI/CD Pipeline (push) Has been cancelled
2025-06-16 10:52:57 +02:00
d8f721b9e6 [ci skip] push back from pipeline 2025-06-16 08:51:47 +00:00
9addfd3923 Add skins 2025-06-16 10:48:11 +02:00
ad7250d7d3 [ci skip] push back from pipeline 2025-06-06 10:56:51 +00:00
a1af42b154 Fix paths and edit hardlink skin
All checks were successful
CI/CD Pipeline / Full CI/CD Pipeline (push) Successful in 3m46s
2025-06-06 12:53:02 +02:00
Skellers
3679b05366 Adding skins 2025-06-06 12:22:05 +02:00
Skellers
0c81440017 Initial commit 2025-06-06 11:52:45 +02:00
26308 changed files with 3592 additions and 79148 deletions

BIN
.DS_Store vendored

Binary file not shown.

24
.gitattributes vendored
View File

@@ -2,32 +2,14 @@
*.exe filter=lfs diff=lfs merge=lfs -text
*.gif filter=lfs diff=lfs merge=lfs -text
*.jpg filter=lfs diff=lfs merge=lfs -text
*.JPG filter=lfs diff=lfs merge=lfs -text
*.png filter=lfs diff=lfs merge=lfs -text
*.PNG filter=lfs diff=lfs merge=lfs -text
*.pnG filter=lfs diff=lfs merge=lfs -text
*.jpeg filter=lfs diff=lfs merge=lfs -text
*.webp filter=lfs diff=lfs merge=lfs -text
*.psd filter=lfs diff=lfs merge=lfs -text
*.xcf filter=lfs diff=lfs merge=lfs -text
*.pxr filter=lfs diff=lfs merge=lfs -text
*.mp3 filter=lfs diff=lfs merge=lfs -text
*.ogg filter=lfs diff=lfs merge=lfs -text
*.wav filter=lfs diff=lfs merge=lfs -text
*.WAV filter=lfs diff=lfs merge=lfs -text
*.wav123321321 filter=lfs diff=lfs merge=lfs -text
*.sfk filter=lfs diff=lfs merge=lfs -text
*.zip filter=lfs diff=lfs merge=lfs -text
*.rar filter=lfs diff=lfs merge=lfs -text
*.ttf filter=lfs diff=lfs merge=lfs -text
*.otf filter=lfs diff=lfs merge=lfs -text
*.lnk filter=lfs diff=lfs merge=lfs -text
*.pk filter=lfs diff=lfs merge=lfs -text
*.fig filter=lfs diff=lfs merge=lfs -text
*.fds filter=lfs diff=lfs merge=lfs -text
*.pdn filter=lfs diff=lfs merge=lfs -text
*.osk filter=lfs diff=lfs merge=lfs -text
*.osr filter=lfs diff=lfs merge=lfs -text
*.osz filter=lfs diff=lfs merge=lfs -text
*.pack filter=lfs diff=lfs merge=lfs -text
*.mp4 filter=lfs diff=lfs merge=lfs -text
*.pdn filter=lfs diff=lfs merge=lfs -text
*.wav filter=lfs diff=lfs merge=lfs -text
*.WAV filter=lfs diff=lfs merge=lfs -text

View File

@@ -1,4 +1,4 @@
name: Generate Skin previews, OSK files and per skin documentation
name: CI/CD Pipeline
on:
push:
@@ -12,112 +12,884 @@ on:
required: false
default: 'false'
target_skins:
description: >
JSON array of skins to rebuild.
If a skin name contains a single quote ('), escape it for Bash.
Raw: ["Beyond Journey's End"]
Escaped: ["Beyond Journey'\''s End"]
Example: '[\"skin1\", \"skin2\"]'
description: 'Comma-separated list of skin folder names to rebuild (e.g., "Skin1,Skin2")'
required: false
default: ''
env:
DANSER_PATH: "/app/danser/danser-cli"
DANSER_DIR: "/app/danser"
DANSER_VIDEO_DIR: "/app/danser/videos"
DANSER_SCREENSHOT_DIR: "/app/danser/screenshots"
SKINS_DIR: "${{ github.workspace }}/Skins"
DANSER_SKINS_DIR: "/app/danser/skins"
DEFAULT_SKIN_DIR: "/app/danser/skins/default-skin"
DEFAULT_SKIN_DIR: "${{ github.workspace }}/src/default-skin"
REPO_SCREENSHOT_DIR: "${{ github.workspace }}/media/gameplay"
REPO_MOD_ICONS_DIR: "${{ github.workspace }}/media/icons"
REPO_RANKING_PANEL_DIR: "${{ github.workspace }}/media/panel"
REPO_THUMBNAIL_DIR: "${{ github.workspace }}/media/thumbnail"
SETTINGS_JSON_PATH: "/app/danser/settings/default.json"
README_PATH: "${{ github.workspace }}/README.md"
GAMEPLAY_REPLAY_PATH: "/app/danser/custom-replays/yomi_yori.osr"
THUMBNAIL_REPLAY_PATH: "/app/danser/custom-replays/combo_colors.osr"
PANEL_REPLAY_PATH: "/app/danser/custom-replays/2000_gekis.osr"
REPLAY_PATH: "${{ github.workspace }}/src/replay.osr"
OSK_PATH: "${{ github.workspace }}/export"
IMAGE_NAME: osc/skins-image
REGISTRY_URL: "https://${{ vars.CONTAINER_REGISTRY }}"
OSU_ID: ${{ vars.OSUID }}
DOC_DIR: "${{ github.workspace }}/docs"
permissions:
contents: write
jobs:
generate_everything:
name: Full CI/CD Pipeline
runs-on: danser
runs-on: ubuntu-latest
container:
image: ${{ vars.CONTAINER_REGISTRY }}/${{ env.IMAGE_NAME }}:latest
options: >-
--gpus all
--privileged
--security-opt seccomp=unconfined
--security-opt apparmor=unconfined
--cap-add=ALL
--env NVIDIA_DRIVER_CAPABILITIES=all
--env NVIDIA_VISIBLE_DEVICES=all
--user 0:0
steps:
- name: Checkout repository
uses: actions/checkout@v4
with:
fetch-depth: 0
token: ${{ secrets.GITHUB_TOKEN }}
tags: true
token: ${{ secrets.TOKEN }}
- name: Discover and Detect Skins
id: discover
uses: ${{ env.REGISTRY_URL}}/osc/reusable-actions/.gitea/actions/discover-skins@main
with:
force_rebuild: ${{ github.event.inputs.force_rebuild }}
target_skins: ${{ github.event.inputs.target_skins }}
- name: Discover all skins
shell: bash
run: |
echo "Discovering all skins in $SKINS_DIR…"
mapfile -t skins < <(
find "$SKINS_DIR" -mindepth 1 -maxdepth 1 -type d \
| sed 's|'"$SKINS_DIR"'/||'
)
{
echo 'ALL_SKINS_DIR<<EOF'
for s in "${skins[@]}"; do
echo "$s"
done
echo 'EOF'
} >> "$GITHUB_ENV"
echo "→ ALL_SKINS_DIR set (newline-delimited list)"
- name: Pull Git LFS
uses: ${{ env.REGISTRY_URL}}/osc/reusable-actions/.gitea/actions/pull-lfs@main
with:
changed_skins_file: ${{ steps.discover.outputs.changed_skins_file }}
- name: Detect Changed Skin Directories
shell: bash
run: |
echo "[Detect Changed Skin Directories Started]"
- name: Prepare Assets
id: prepare
uses: ${{ env.REGISTRY_URL}}/osc/reusable-actions/.gitea/actions/prepare-assets@main
with:
all_skins: ${{ steps.discover.outputs.all_skins }}
readarray -t all_skins <<< "$ALL_SKINS_DIR"
- name: Create Tag
id: tag
uses: ${{ env.REGISTRY_URL}}/osc/reusable-actions/.gitea/actions/create-tag@main
force_rebuild="${{ github.event.inputs.force_rebuild }}"
target_skins="${{ github.event.inputs.target_skins }}"
skins=()
deleted_skins=()
- name: Generate Previews
uses: ${{ env.REGISTRY_URL}}/osc/reusable-actions/.gitea/actions/generate-previews@main
with:
changed_skins_file: ${{ steps.discover.outputs.changed_skins_file }}
echo "→ Force rebuild flag: $force_rebuild"
echo "→ Target skins input: $target_skins"
- name: Generate Mod Icons and Convert Images
uses: ${{ env.REGISTRY_URL}}/osc/reusable-actions/.gitea/actions/generate-icons@main
with:
changed_skins_file: ${{ steps.discover.outputs.changed_skins_file }}
if [[ "$force_rebuild" == "true" ]]; then
echo "→ Force rebuild is enabled. Using ALL_SKINS_DIR for full list…"
skins=("${all_skins[@]}")
echo " ✓ Found ${#skins[@]} skin directories (from ALL_SKINS_DIR)"
- name: Generate OSK
uses: ${{ env.REGISTRY_URL}}/osc/reusable-actions/.gitea/actions/generate-osk@main
with:
changed_skins_file: ${{ steps.discover.outputs.changed_skins_file }}
elif [[ -n "$target_skins" ]]; then
echo "→ Target skins specified. Using target_skins input…"
IFS=',' read -r -a input_skins <<< "$target_skins"
for s in "${input_skins[@]}"; do
s="${s#"${s%%[![:space:]]*}"}" # trim leading whitespace
s="${s%"${s##*[![:space:]]}"}" # trim trailing whitespace
[[ -n "$s" ]] && skins+=("$s")
done
echo " ✓ Found ${#skins[@]} skin(s) from target_skins input"
- name: Generate Documentation
uses: ${{ env.REGISTRY_URL}}/osc/reusable-actions/.gitea/actions/generate-docs@main
with:
new_tag: ${{ steps.tag.outputs.new_tag }}
readme_path: ${{ env.README_PATH }}
doc_dir: ${{ env.DOC_DIR }}
user_repository: ${{ steps.prepare.outputs.user_repository }}
else
echo "→ No rebuild flags set. Finding latest git tag..."
latest_tag=$(git tag --sort=-creatordate | head -n 1 || true)
- name: Cleanup Files
uses: ${{ env.REGISTRY_URL}}/osc/reusable-actions/.gitea/actions/cleanup@main
with:
all_skins: ${{ steps.discover.outputs.all_skins }}
if [[ -n "$latest_tag" ]]; then
echo "→ Latest tag found: $latest_tag"
echo "→ Finding added/modified skins since $latest_tag…"
- name: Commit and Push
uses: ${{ env.REGISTRY_URL}}/osc/reusable-actions/.gitea/actions/git-commit-push@main
with:
new_tag: ${{ steps.tag.outputs.new_tag }}
mapfile -t skins < <(
git diff --name-only -z --diff-filter=AM "$latest_tag" HEAD \
| while IFS= read -r -d '' file; do
[[ $file == Skins/* ]] && echo "${file#Skins/}" | cut -d/ -f1
done
)
echo " ✓ Found ${#skins[@]} added/modified skins"
- name: Test links
uses: ${{ env.REGISTRY_URL}}/osc/reusable-actions/.gitea/actions/test-links@main
with:
user_repository: ${{ steps.prepare.outputs.user_repository }}
echo "→ Finding deleted skins since $latest_tag…"
mapfile -t deleted_skins < <(
git diff --name-only -z --diff-filter=D "$latest_tag" HEAD \
| while IFS= read -r -d '' file; do
[[ $file == Skins/* ]] && echo "${file#Skins/}" | cut -d/ -f1
done
)
if [ "${#deleted_skins[@]}" -gt 0 ]; then
for d in "${deleted_skins[@]}"; do
echo "→ Skin '$d' was deleted"
done
else
echo " ✓ No skins deleted"
fi
else
echo "→ No tag found. Falling back to ALL_SKINS_DIR for full list…"
skins=("${all_skins[@]}")
echo " ✓ Found ${#skins[@]} skin directories (from ALL_SKINS_DIR)"
fi
fi
echo ""
echo "[Cleaning Skin Names]"
uniq_skins=()
for skin in "${skins[@]}"; do
skin="${skin#"${skin%%[![:space:]]*}"}"
skin="${skin%"${skin##*[![:space:]]}"}"
[[ -n "$skin" ]] && uniq_skins+=("$skin")
done
echo " ✓ ${#uniq_skins[@]} valid skin names after cleaning"
echo ""
if [ "${#uniq_skins[@]}" -eq 0 ]; then
echo "→ No added/modified skins detected."
echo "CHANGED_SKINS_FILE=" >> "$GITHUB_ENV"
else
echo "[Writing Changed Skins to File]"
changed_skins_file=$(mktemp)
printf "%s\n" "${uniq_skins[@]}" > "$changed_skins_file"
echo " ✓ Skins written to $changed_skins_file"
echo "CHANGED_SKINS_FILE=$changed_skins_file" >> "$GITHUB_ENV"
fi
echo ""
echo "[Detect Changed Skin Directories Complete — ${#uniq_skins[@]} skins processed, ${#deleted_skins[@]} skins deleted]"
- name: Pull Git LFS objects for changed skins (and core assets)
shell: bash
run: |
if [ -z "${CHANGED_SKINS_FILE:-}" ] || [ ! -s "$CHANGED_SKINS_FILE" ]; then
echo "No skins changed. Skipping git pull lfs."
exit 0
fi
includes="src/**,export/**,media/**"
skin_includes=$(
while IFS= read -r skin; do
esc=$(printf '%s' "$skin" \
| sed -e 's/\[/\\[/g' -e 's/\]/\\]/g')
printf 'Skins/%s/**\n' "$esc"
done < "$CHANGED_SKINS_FILE" \
| paste -sd ','
)
includes="$includes,$skin_includes"
echo "→ Pulling LFS objects for patterns: $includes"
git lfs pull --include="$includes"
- name: Extract Repository path
shell: bash
run: |
echo "Extracting repository path..."
USER_REPOSITORY="${{ github.workspace }}"
USER_REPOSITORY="${USER_REPOSITORY#/workspace/}"
USER_REPOSITORY="${USER_REPOSITORY%/}"
echo "Repository path extracted: $USER_REPOSITORY"
echo "USER_REPOSITORY=$USER_REPOSITORY" >> $GITHUB_ENV
- name: Set XDG_RUNTIME_DIR
shell: bash
run: |
echo "Setting XDG_RUNTIME_DIR..."
mkdir -p /tmp/xdg_runtime_dir
chmod 0700 /tmp/xdg_runtime_dir
echo "XDG_RUNTIME_DIR=/tmp/xdg_runtime_dir" >> "$GITHUB_ENV"
echo "XDG_RUNTIME_DIR set."
- name: Create directories for assets
shell: bash
run: |
echo "Creating base directories for assets..."
mkdir -p "$REPO_SCREENSHOT_DIR" "$REPO_MOD_ICONS_DIR" "$REPO_RANKING_PANEL_DIR" "$OSK_PATH" "$REPO_THUMBNAIL_DIR"
readarray -t skins <<< "$ALL_SKINS_DIR"
for skin in "${skins[@]}"; do
echo " → Creating subdirs for '$skin'…"
mkdir -p \
"$REPO_SCREENSHOT_DIR/$skin" \
"$REPO_MOD_ICONS_DIR/$skin" \
"$REPO_RANKING_PANEL_DIR/$skin" \
"$OSK_PATH/$skin" \
"$REPO_THUMBNAIL_DIR/$skin"
done
echo "All asset directories created for ${#skins[@]} skins."
- name: Create New Tag
shell: bash
run: |
echo "Computing new tag..."
latest_tag=$(git describe --tags $(git rev-list --tags --max-count=1) 2>/dev/null || echo "")
if [ -z "$latest_tag" ]; then
new_tag="v1.0.0"
else
IFS='.' read -r major minor patch <<< "${latest_tag#v}"
minor=$((minor + 1))
patch=0
new_tag="v${major}.${minor}.${patch}"
fi
echo "new_tag=$new_tag" >> $GITHUB_ENV
echo "Computed new tag: $new_tag"
- name: Move Skin files to Danser Skins directory
shell: bash
run: |
echo "Moving Skin files to Danser Skins directory..."
mkdir -p "$DANSER_SKINS_DIR"
mv "$SKINS_DIR"/* "$DANSER_SKINS_DIR"
echo "Skin files moved."
- name: Generate Danser videos and screenshots
shell: bash
run: |
echo "[Danser Job Started]"
if [ -z "${CHANGED_SKINS_FILE:-}" ] || [ ! -s "$CHANGED_SKINS_FILE" ]; then
echo "No skins changed. Skipping generation."
exit 0
fi
mapfile -t skins < "$CHANGED_SKINS_FILE"
[ "${#skins[@]}" -eq 0 ] && { echo "No skins to process. Exiting."; exit 0; }
SKIN_COUNT=${#skins[@]}
INDEX=1
for skin_path in "${skins[@]}"; do
[ -z "$skin_path" ] && continue
SKIN_DIR="$DANSER_SKINS_DIR/$skin_path"
[ ! -d "$SKIN_DIR" ] && { echo "Skipping missing skin: $skin_path"; continue; }
SKIN_NAME="$skin_path"
OUT_VIDEO_DIR="$REPO_SCREENSHOT_DIR/$SKIN_NAME"
OUT_PNG_DIR="$REPO_RANKING_PANEL_DIR/$SKIN_NAME"
OUT_THUMBNAIL_DIR="$REPO_THUMBNAIL_DIR/$SKIN_NAME"
echo ""
echo "[$INDEX/$SKIN_COUNT] Generating for skin: $SKIN_NAME"
LOGFILE="/tmp/danser_log_$INDEX.txt"
echo " → Generating video..."
if ! xvfb-run -a "$DANSER_DIR/danser-cli" \
-replay "$REPLAY_PATH" -record -skip -start=215 -end=230 -noupdatecheck \
-out="$SKIN_NAME" -skin="$SKIN_NAME" >"$LOGFILE" 2>&1; then
echo " ✖ Video failed for $SKIN_NAME"; cat "$LOGFILE"; INDEX=$((INDEX+1)); continue
fi
if [ -f "$DANSER_VIDEO_DIR/$SKIN_NAME.mp4" ]; then
echo " → Trimming MP4 with ffmpeg..."
ffmpeg -hide_banner -loglevel error \
-i "$DANSER_VIDEO_DIR/$SKIN_NAME.mp4" \
-ss 5 -t 10 \
-c:v h264_nvenc -preset fast -c:a aac -b:a 128k \
"$DANSER_VIDEO_DIR/${SKIN_NAME}_trimmed.mp4"
if [ -f "$DANSER_VIDEO_DIR/${SKIN_NAME}_trimmed.mp4" ]; then
mv "$DANSER_VIDEO_DIR/${SKIN_NAME}_trimmed.mp4" "$DANSER_VIDEO_DIR/$SKIN_NAME.mp4"
mkdir -p "$OUT_VIDEO_DIR"
mv "$DANSER_VIDEO_DIR/$SKIN_NAME.mp4" "$OUT_VIDEO_DIR/$SKIN_NAME.mp4"
echo " ✓ Trimmed MP4 moved to $OUT_VIDEO_DIR/"
else
echo " ✖ ffmpeg trimming failed for $SKIN_NAME"
fi
else
echo " ✖ No MP4 found for $SKIN_NAME"
fi
echo " → Taking screenshot..."
if ! xvfb-run -a "$DANSER_DIR/danser-cli" \
-replay "$REPLAY_PATH" -skip -noupdatecheck -ss 243 \
-out="$SKIN_NAME" -skin="$SKIN_NAME" >>"$LOGFILE" 2>&1; then
echo " ✖ Screenshot failed for $SKIN_NAME"; cat "$LOGFILE"; INDEX=$((INDEX+1)); continue
fi
if [ -f "$DANSER_SCREENSHOT_DIR/$SKIN_NAME.png" ]; then
mkdir -p "$OUT_PNG_DIR"
mv "$DANSER_SCREENSHOT_DIR/$SKIN_NAME.png" "$OUT_PNG_DIR/$SKIN_NAME.png"
echo " ✓ PNG moved to $OUT_PNG_DIR/"
else
echo " ✖ No PNG found for $SKIN_NAME"
fi
echo " → Taking thumbnail screenshot..."
if ! xvfb-run -a "$DANSER_DIR/danser-cli" \
-replay "$REPLAY_PATH" -skip -noupdatecheck -ss 220 \
-out="${SKIN_NAME}_thumb" -skin="$SKIN_NAME" >>"$LOGFILE" 2>&1; then
echo " ✖ Thumbnail screenshot failed for $SKIN_NAME"; cat "$LOGFILE"; INDEX=$((INDEX+1)); continue
fi
if [ -f "$DANSER_SCREENSHOT_DIR/${SKIN_NAME}_thumb.png" ]; then
mkdir -p "$OUT_THUMBNAIL_DIR"
mv "$DANSER_SCREENSHOT_DIR/${SKIN_NAME}_thumb.png" "$OUT_THUMBNAIL_DIR/$SKIN_NAME.png"
echo " ✓ Thumbnail PNG moved to $OUT_THUMBNAIL_DIR/"
else
echo " ✖ No thumbnail PNG found for $SKIN_NAME"
fi
INDEX=$((INDEX + 1))
done
echo ""
echo "[Danser Job Finished — processed $SKIN_COUNT skins]"
- name: Rename Generated Assets Based on skin.ini
shell: bash
run: |
echo "[Asset Renaming Job Started]"
if [ -z "${CHANGED_SKINS_FILE:-}" ] || [ ! -s "$CHANGED_SKINS_FILE" ]; then
echo "No skins changed. Skipping asset renaming."
exit 0
fi
mapfile -t skins < "$CHANGED_SKINS_FILE"
[ "${#skins[@]}" -eq 0 ] && { echo "No skins to rename. Exiting."; exit 0; }
SKIN_COUNT=${#skins[@]}
INDEX=1
sanitize_filename() {
echo "$1" | \
tr -d '\000-\037' | \
sed -e 's#[\\/:\*\?"<>|]#-#g' | \
sed -e 's/^[[:space:]]*//' -e 's/[[:space:]]*$//'
}
for skin_path in "${skins[@]}"; do
[ -z "$skin_path" ] && continue
SKIN_DIR_NAME="$skin_path"
SKIN_DIR="$DANSER_SKINS_DIR/$skin_path"
if [ ! -d "$SKIN_DIR" ]; then
echo "Skipping missing skin directory: $SKIN_DIR"
continue
fi
echo "Processing skin $INDEX/$SKIN_COUNT: $SKIN_DIR_NAME"
skin_header="$SKIN_DIR_NAME"
ini_file=$(find "$SKIN_DIR" -maxdepth 1 -iname "skin.ini" | head -n1 || true)
if [ -f "$ini_file" ]; then
name_line=$(grep -i '^[[:space:]]*Name:' "$ini_file" | head -n1 || true)
if [ -n "$name_line" ]; then
val="${name_line#*:}"
val="$(echo "$val" | sed 's/^[[:space:]]*//;s/[[:space:]]*$//')"
sanitized="$(sanitize_filename "$val")"
[ -n "$sanitized" ] && skin_header="$sanitized"
fi
fi
VIDEO_DIR="$REPO_SCREENSHOT_DIR/$SKIN_DIR_NAME"
PNG_DIR="$REPO_RANKING_PANEL_DIR/$SKIN_DIR_NAME"
THUMBNAIL_DIR="$REPO_THUMBNAIL_DIR/$SKIN_DIR_NAME"
if [ -f "$VIDEO_DIR/$SKIN_DIR_NAME.mp4" ] && [ "$SKIN_DIR_NAME" != "$skin_header" ]; then
mv -f "$VIDEO_DIR/$SKIN_DIR_NAME.mp4" \
"$VIDEO_DIR/$skin_header.mp4" || true
echo " ✓ Renamed MP4 to $VIDEO_DIR/$skin_header.mp4"
fi
if [ -f "$PNG_DIR/$SKIN_DIR_NAME.png" ] && [ "$SKIN_DIR_NAME" != "$skin_header" ]; then
mv -f "$PNG_DIR/$SKIN_DIR_NAME.png" \
"$PNG_DIR/$skin_header.png" || true
echo " ✓ Renamed PNG to $PNG_DIR/$skin_header.png"
fi
if [ -f "$THUMBNAIL_DIR/$SKIN_DIR_NAME.png" ] && [ "$SKIN_DIR_NAME" != "$skin_header" ]; then
mv -f "$THUMBNAIL_DIR/$SKIN_DIR_NAME.png" \
"$THUMBNAIL_DIR/$skin_header.png" || true
echo " ✓ Renamed thumbnail to $THUMBNAIL_DIR/$skin_header.png"
fi
INDEX=$((INDEX + 1))
done
echo ""
echo "[Asset Renaming Complete — processed $SKIN_COUNT skins]"
- name: Generate Mod Icons (WEBP)
shell: bash
run: |
echo "[Mod Icon Generation Job Started]"
if [ -z "${CHANGED_SKINS_FILE:-}" ] || [ ! -s "$CHANGED_SKINS_FILE" ]; then
echo "No skins changed. Skipping mod icon generation."
exit 0
fi
mapfile -t skin_dirs < "$CHANGED_SKINS_FILE"
[ "${#skin_dirs[@]}" -eq 0 ] && { echo "No skins to process. Exiting."; exit 0; }
sanitize_filename() {
echo "$1" | \
tr -d '\000-\037' | \
sed -e 's#[\\/:\*\?"<>|]#-#g' | \
sed -e 's/^[[:space:]]*//' -e 's/[[:space:]]*$//'
}
ICONS_JSON_FILE="${{ github.workspace }}/.gitea/workflows/icons.json"
group1_icons=$(jq -r '.group1 | join(" ")' "$ICONS_JSON_FILE")
group2_icons=$(jq -r '.group2 | join(" ")' "$ICONS_JSON_FILE")
group3_icons=$(jq -r '.group3 | join(" ")' "$ICONS_JSON_FILE")
BLANK_IMAGE="blank.png"
magick -size "160x160" xc:none "$BLANK_IMAGE"
SKIN_COUNT=${#skin_dirs[@]}
INDEX=1
for skin_path in "${skin_dirs[@]}"; do
SKIN_DIR="$DANSER_SKINS_DIR/$skin_path"
[ ! -d "$SKIN_DIR" ] && { echo "Skipping missing skin directory: $SKIN_DIR"; ((INDEX++)); continue; }
skin_header="$skin_path"
ini_file=$(find "$SKIN_DIR" -maxdepth 1 -iname "skin.ini" | head -n1 || true)
if [ -f "$ini_file" ]; then
name_line=$(grep -i '^[[:space:]]*Name:' "$ini_file" | head -n1 || true)
if [ -n "$name_line" ]; then
val="${name_line#*:}"
val="$(echo "$val" | sed 's/^[[:space:]]*//;s/[[:space:]]*$//')"
sanitized="$(sanitize_filename "$val")"
[ -n "$sanitized" ] && skin_header="$sanitized"
fi
fi
echo ""
echo "[$INDEX/$SKIN_COUNT] Skin: $skin_header"
ICON_FOLDER="$SKIN_DIR"
OUTPUT_DIR="$REPO_MOD_ICONS_DIR/$skin_path"
mkdir -p "$OUTPUT_DIR"
OUTPUT="$OUTPUT_DIR/${skin_header}-mod-icons.webp"
row_images=()
row_index=1
for group_list in "$group1_icons" "$group2_icons" "$group3_icons"; do
montage_files=()
for icon in $group_list; do
if [ -f "${ICON_FOLDER}/selection-mod-${icon}@2x.png" ]; then
montage_files+=("${ICON_FOLDER}/selection-mod-${icon}@2x.png")
elif [ -f "${DEFAULT_SKIN_DIR}/selection-mod-${icon}@2x.png" ]; then
montage_files+=("${DEFAULT_SKIN_DIR}/selection-mod-${icon}@2x.png")
fi
done
while [ "${#montage_files[@]}" -lt 7 ]; do
montage_files+=("$BLANK_IMAGE")
done
magick montage "${montage_files[@]}" \
-tile "7x1" -geometry "160x160+10+10" -background none \
"row_${row_index}.png"
row_images+=("row_${row_index}.png")
row_index=$((row_index + 1))
done
magick montage "${row_images[@]}" \
-tile "1x${#row_images[@]}" -geometry "+10+10" -background none \
"temp_combined.png"
magick "temp_combined.png" -define webp:lossless=true "$OUTPUT"
rm temp_combined.png row_*.png
echo " ✓ Mod Icons Generated at $OUTPUT"
INDEX=$((INDEX + 1))
done
rm "$BLANK_IMAGE"
echo ""
echo "[Mod Icon Generation Finished — processed $SKIN_COUNT skins]"
- name: Convert PNGs to WEBPs
shell: bash
run: |
echo "[Convert PNG → WEBP Started]"
if [ -z "${CHANGED_SKINS_FILE:-}" ] || [ ! -s "$CHANGED_SKINS_FILE" ]; then
echo "No skins changed. Skipping conversion."
exit 0
fi
mapfile -t skins < "$CHANGED_SKINS_FILE"
[ "${#skins[@]}" -eq 0 ] && { echo "No skins to process. Exiting."; exit 0; }
convert_pngs_to_webp() {
local base_dir="$1"
local skin_path="$2"
local dir="$base_dir/$skin_path"
echo " → Processing: $dir"
[ ! -d "$dir" ] && { echo " ✖ Directory does not exist: $dir"; return; }
find "$dir" -type f -iname "*.png" | while read -r png; do
webp="${png%.png}.webp"
echo " ↳ Converting: $png → $webp"
magick "$png" -define webp:lossless=false -quality 90 "$webp" && rm -f "$png"
done
}
for skin_path in "${skins[@]}"; do
[ -z "$skin_path" ] && continue
convert_pngs_to_webp "$REPO_RANKING_PANEL_DIR" "$skin_path"
convert_pngs_to_webp "$REPO_THUMBNAIL_DIR" "$skin_path"
done
echo "[Convert PNG → WEBP Finished]"
- name: Create OSK Files
shell: bash
run: |
echo "[OSK Creation Job Started]"
if [ -z "${CHANGED_SKINS_FILE:-}" ] || [ ! -s "$CHANGED_SKINS_FILE" ]; then
echo "No skins changed. Skipping OSK creation."
exit 0
fi
mapfile -t skin_dirs < "$CHANGED_SKINS_FILE"
[ "${#skin_dirs[@]}" -eq 0 ] && { echo "No skins to process. Exiting."; exit 0; }
sanitize_filename() {
echo "$1" | \
tr -d '\000-\037' | \
sed -e 's#[\\/:\*\?"<>|]#-#g' | \
sed -e 's/^[[:space:]]*//' -e 's/[[:space:]]*$//'
}
FIXED_TIMESTAMP="2025-01-01 00:00:00"
SKIN_COUNT=${#skin_dirs[@]}
INDEX=1
for skin_path in "${skin_dirs[@]}"; do
SKIN_DIR="$DANSER_SKINS_DIR/$skin_path"
[ ! -d "$SKIN_DIR" ] && { echo "Skipping missing skin directory: $SKIN_DIR"; ((INDEX++)); continue; }
OUTPUT_DIR="$OSK_PATH/$skin_path"
mkdir -p "$OUTPUT_DIR"
skin_header="$skin_path"
ini_file=$(find "$SKIN_DIR" -maxdepth 1 -iname "skin.ini" | head -n1 || true)
if [ -f "$ini_file" ]; then
name_line=$(grep -i '^[[:space:]]*name:' "$ini_file" | head -n1 || true)
if [ -n "$name_line" ]; then
val="${name_line#*:}"
val="$(echo "$val" | sed 's/^[[:space:]]*//;s/[[:space:]]*$//')"
sanitized="$(sanitize_filename "$val")"
[ -n "$sanitized" ] && skin_header="$sanitized"
fi
fi
echo ""
echo "[$INDEX/$SKIN_COUNT] Processing skin: $skin_header"
(cd "$SKIN_DIR" && find . -type f -exec touch -d "$FIXED_TIMESTAMP" {} +)
(cd "$SKIN_DIR" && find . -type f | sort | \
zip -rq -D -X -9 --compression-method deflate \
"$OUTPUT_DIR/${skin_header}.osk" -@)
echo " ✓ OSK file created at $OUTPUT_DIR/${skin_header}.osk"
INDEX=$((INDEX + 1))
done
echo ""
echo "[OSK Creation Job Finished — processed $SKIN_COUNT skins]"
- name: Generate README
shell: bash
run: |
echo "Generating README index…"
sanitize_filename() {
echo "$1" | \
tr -d '\000-\037' | \
sed -e 's#[\\/:\*\?"<>|]#-#g' | \
sed -e 's/^[[:space:]]*//' -e 's/[[:space:]]*$//'
}
url_encode_path() {
local IFS='/'
local parts=($1)
local encoded=""
for part in "${parts[@]}"; do
[ -n "$encoded" ] && encoded+="/"
encoded+=$(printf '%s' "$part" | jq -sRr @uri)
done
echo "$encoded"
}
SKINS_JSON_FILE="${{ github.workspace }}/.gitea/workflows/skins.json"
DESC_FILE=$(mktemp)
echo "---" > "$README_PATH"
echo "gitea: none" >> "$README_PATH"
echo "include_toc: true" >> "$README_PATH"
echo "---" >> "$README_PATH"
echo "" >> "$README_PATH"
echo "# Skins" >> "$README_PATH"
echo "" >> "$README_PATH"
echo "<!--" >> "$README_PATH"
echo "osuid: $OSU_ID" >> "$README_PATH"
echo "-->" >> "$README_PATH"
echo "" >> "$README_PATH"
echo "**Go back to [osc/skins]($REGISTRY_URL/osc/skins)**" >> "$README_PATH"
echo "" >> "$README_PATH"
echo "**Click on the Skin name to download it, or click on the thumbnail to see more about the skin, including a video preview, screenshots, and mod icons.**" >> "$README_PATH"
echo "" >> "$README_PATH"
jq -r '.descriptions | to_entries[] | "\(.key)=\(.value)"' "$SKINS_JSON_FILE" > "$DESC_FILE"
jq -r '.order[]?' "$SKINS_JSON_FILE" > order.txt
get_desc() {
grep -F -m1 -- "$1=" "$DESC_FILE" 2>/dev/null | cut -d '=' -f2-
}
declare -A ordered
while IFS= read -r skin; do
ordered["$skin"]=1
dir="$DANSER_SKINS_DIR/$skin"
[ ! -d "$dir" ] && continue
ini_file=$(find "$dir" -maxdepth 1 -iname "skin.ini" | head -n1)
skin_header="$skin"
if [ -f "$ini_file" ]; then
line=$(grep -i '^[[:space:]]*Name:' "$ini_file" | head -n1)
[ -n "$line" ] && skin_header=$(sanitize_filename "${line#*:}")
fi
raw_path="$(printf "%s/%s" "$skin" "$skin_header" | sed 's/^ *//;s/ *$//')"
base_path=$(url_encode_path "$raw_path")
echo "## [$skin_header]($REGISTRY_URL/$USER_REPOSITORY/media/tag/$new_tag/export/${base_path}.osk)" >> "$README_PATH"
echo "" >> "$README_PATH"
desc=$(get_desc "$skin")
[ -n "$desc" ] && { echo "$desc" >> "$README_PATH"; echo "" >> "$README_PATH"; }
echo "[![$skin_header Thumbnail](media/thumbnail/${base_path}.webp)](/docs/${base_path}.md)" >> "$README_PATH"
echo "" >> "$README_PATH"
done < order.txt
echo "Adding extra skins not in order.json..."
for dir in "$DANSER_SKINS_DIR"/*; do
[ -d "$dir" ] || continue
skin=$(basename "$dir")
[[ -n "${ordered[$skin]}" ]] && continue
ini_file=$(find "$dir" -maxdepth 1 -iname "skin.ini" | head -n1)
skin_header="$skin"
if [ -f "$ini_file" ]; then
line=$(grep -i '^[[:space:]]*Name:' "$ini_file" | head -n1 2>/dev/null || true)
[ -n "$line" ] && skin_header=$(sanitize_filename "${line#*:}")
fi
raw_path="$(printf "%s/%s" "$skin" "$skin_header" | sed 's/^ *//;s/ *$//')"
base_path=$(url_encode_path "$raw_path")
echo "## [$skin_header]($REGISTRY_URL/$USER_REPOSITORY/media/tag/$new_tag/export/${base_path}.osk)" >> "$README_PATH"
echo "" >> "$README_PATH"
echo "[![$skin_header Thumbnail](media/thumbnail/${base_path}.webp)](/docs/${base_path}.md)" >> "$README_PATH"
echo "" >> "$README_PATH"
done
echo "# Build History" >> "$README_PATH"
echo "" >> "$README_PATH"
echo "| Version | Date |" >> "$README_PATH"
echo "| ------- | ---- |" >> "$README_PATH"
current_commit_date=$(TZ="Europe/Zurich" date -d "$(git log -1 --format=%cI)" "+%d.%m.%Y %H:%M:%S")
echo "| [\`$new_tag (Current)\`]($REGISTRY_URL/$USER_REPOSITORY/src/tag/$new_tag/README.md) | $current_commit_date |" >> "$README_PATH"
old_tags=$(git tag --sort=-v:refname | grep -v "^$new_tag$" | grep -E '^v[0-9]+\.[0-9]+\.[0-9]+$' || true)
if [ -n "$old_tags" ]; then
echo "$old_tags" | while read -r tag; do
tag_date=$(git log -1 --format=%ci "$tag")
formatted_date=$(TZ="Europe/Zurich" date -d "$tag_date" "+%d.%m.%Y %H:%M:%S")
echo "| [\`$tag\`]($REGISTRY_URL/$USER_REPOSITORY/src/tag/$tag/README.md) | $formatted_date |" >> "$README_PATH"
done
fi
echo "README index generated successfully."
- name: Generate Per-Skin Pages
shell: bash
run: |
echo "Generating detailed per-skin markdown pages…"
sanitize_filename() {
echo "$1" | \
tr -d '\000-\037' | \
sed -e 's#[\\/:\*\?"<>|]#-#g' | \
sed -e 's/^[[:space:]]*//' -e 's/[[:space:]]*$//'
}
url_encode_path() {
local IFS='/'
local parts=($1)
local encoded=""
for part in "${parts[@]}"; do
[ -n "$encoded" ] && encoded+="/"
encoded+=$(printf '%s' "$part" | jq -sRr @uri)
done
echo "$encoded"
}
mkdir -p "$DOC_DIR"
for dir in "$DANSER_SKINS_DIR"/*; do
[ -d "$dir" ] || continue
skin=$(basename "$dir")
ini_file=$(find "$dir" -maxdepth 1 -iname "skin.ini" | head -n1 || true)
skin_header="$skin"
if [ -f "$ini_file" ]; then
line=$(grep -i '^[[:space:]]*Name:' "$ini_file" | head -n1 || true)
[ -n "$line" ] && skin_header=$(sanitize_filename "${line#*:}")
fi
raw_path="${skin}/${skin_header}"
base_path=$(url_encode_path "$raw_path")
osk_url="$REGISTRY_URL/$USER_REPOSITORY/media/tag/$new_tag/export/${base_path}.osk"
md_file_path="${DOC_DIR}/${raw_path}.md"
mkdir -p "$(dirname "$md_file_path")"
video_url="$REGISTRY_URL/$USER_REPOSITORY/raw/tag/$new_tag/media/gameplay/${base_path}.mp4"
{
echo "# [$skin_header]($osk_url)"
echo ""
echo "<video controls autoplay loop muted playsinline src=\"$video_url\" type=\"video/mp4\">"
echo "</video>"
echo ""
echo "![](/media/panel/${base_path}.webp)"
echo ""
echo "![](/media/icons/${base_path}-mod-icons.webp)"
} > "$md_file_path"
echo " → Wrote $md_file_path"
done
echo "Per-skin markdown pages complete."
- name: Cleanup Extra Files
shell: bash
run: |
set -euo pipefail
echo "[Cleanup Extra Files Started]"
[ -f how-to-use.md ] && rm -f how-to-use.md
readarray -t skins <<< "$ALL_SKINS_DIR"
sanitize_filename() {
echo "$1" | \
tr -d '\000-\037' | \
sed -e 's#[\\/:\*\?"<>|]#-#g' | \
sed -e 's/^[[:space:]]*//' -e 's/[[:space:]]*$//'
}
prune_dir() {
local root="$1"
local skin="$2"
local expected="$3"
for f in "$root"/*; do
[ -f "$f" ] || continue
name="$(basename "$f")"
if printf '%s\n' "${skins[@]}" | grep -Fxq -- "$name"; then
continue
fi
echo " → Removing unexpected root file: $f"
rm -f "$f"
done
dir="$root/$skin"
[ -d "$dir" ] || return
for f in "$dir"/*; do
[ -e "$f" ] || continue
if [[ "$(basename "$f")" != "$expected" ]]; then
echo " → Removing unexpected file: $f"
rm -f "$f"
fi
done
}
for root in "$REPO_SCREENSHOT_DIR" "$REPO_RANKING_PANEL_DIR" "$REPO_MOD_ICONS_DIR" "$REPO_THUMBNAIL_DIR" "$OSK_PATH" "$DOC_DIR"; do
[ -d "$root" ] || continue
for dir in "$root"/*; do
[ -d "$dir" ] || continue
name="$(basename "$dir")"
if ! printf '%s\n' "${skins[@]}" | grep -Fxq -- "$name"; then
echo " → Skin '$name' deleted—removing directory $dir"
rm -rf "$dir"
fi
done
done
for skin in "${skins[@]}"; do
header=$(sanitize_filename "$skin")
ini=$(find "$DANSER_SKINS_DIR/$skin" -maxdepth 1 -type f -iname "skin.ini" -print -quit || true)
if [[ -f "$ini" ]]; then
raw=$(grep -i '^[[:space:]]*Name:' "$ini" | head -n1 || true)
raw="${raw#*:}"
tmp_header=$(sanitize_filename "$raw")
[[ -n "$tmp_header" ]] && header="$tmp_header"
fi
prune_dir "$REPO_SCREENSHOT_DIR" "$skin" "$header.mp4"
prune_dir "$REPO_RANKING_PANEL_DIR" "$skin" "$header.webp"
prune_dir "$REPO_MOD_ICONS_DIR" "$skin" "$header-mod-icons.webp"
prune_dir "$REPO_THUMBNAIL_DIR" "$skin" "$header.webp"
prune_dir "$OSK_PATH" "$skin" "$header.osk"
prune_dir "$DOC_DIR" "$skin" "$header.md"
done
echo "[Cleanup Extra Files Complete]"
- name: Configure Git
shell: bash
run: |
git config user.email "arlind@sulej.ch"
git config user.name "ci-bot"
- name: Add and Commit changes
shell: bash
run: |
git config advice.addIgnoredFile false
for p in docs/ media/gameplay media/thumbnail media/panel media/icons export README.md how-to-use.md src; do
if [ -e "$p" ]; then
git add -A "$p"
fi
done
git commit -m "[ci skip] push back from pipeline" -q || echo "No changes to commit"
- name: Push changes and create tag
shell: bash
run: |
if [ "${GITHUB_REF}" = "refs/heads/main" ]; then
git push origin HEAD:main || echo "No changes to push"
git tag "$new_tag"
git push origin "$new_tag"
else
git push origin HEAD:"${GITHUB_REF_NAME}" || echo "No changes to push"
fi

View File

@@ -1,24 +1,10 @@
{
"order": [
"stella kii",
"stellerino 2",
"rafis_gothic",
"zadymiarz onymki",
"zadymiarz onymki - Copy",
"summer pockets (pink)",
"- ⊹ aia",
"- rafis pinkity edit by henry",
"prezes",
"prezes - Copy",
"prezes - Copy - Copy",
"prezes - Copy (2)",
"prezes - Copy (2) - Copy - Copy",
"hyeok20441610-1",
"boop ts",
"mario+bro+⌞DT⌝",
"- kodama - nogi"
"example1",
"example2"
],
"descriptions": {
"example1": "Description of example1",
"example2": "Description of example2"
}
}

465
README.md
View File

@@ -5,414 +5,131 @@ include_toc: true
# Skins
<<<<<<< HEAD
This README is automatically generated using CI/CD pipelines, Danser, ImageMagick, and FFmpeg. The workflow generates gameplay previews, creates mod icons, packages .osk files, and updates the README with media and descriptions, with the Skins included in [Skins](./Skins).
## [no](https://git.sulejmani.xyz/Skellers/ooga_booga/media/tag/v1.0.0/export/no.osk)
**Author:** henry
![no Gameplay](media/gameplay/no.gif)
![no Ranking Panel](media/panel/no.png)
![no Mods](media/icons/no-mod-icons.png)
## [++scylla funny mix EPIC](https://git.sulejmani.xyz/Skellers/ooga_booga/media/tag/v1.0.0/export/++scylla%20funny%20mix%20EPIC.osk)
![++scylla funny mix EPIC Gameplay](media/gameplay/++scylla%20funny%20mix%20EPIC.gif)
![++scylla funny mix EPIC Ranking Panel](media/panel/++scylla%20funny%20mix%20EPIC.png)
![++scylla funny mix EPIC Mods](media/icons/++scylla%20funny%20mix%20EPIC-mod-icons.png)
## [Aleph DT](https://git.sulejmani.xyz/Skellers/ooga_booga/media/tag/v1.0.0/export/Aleph%20DT.osk)
**Author:** various
![Aleph DT Gameplay](media/gameplay/Aleph%20DT.gif)
![Aleph DT Ranking Panel](media/panel/Aleph%20DT.png)
![Aleph DT Mods](media/icons/Aleph%20DT-mod-icons.png)
## [- ⊹ aia](https://git.sulejmani.xyz/Skellers/ooga_booga/media/tag/v1.0.0/export/-%20%20%20⊹%20aia.osk)
**Author:** sera
![- ⊹ aia Gameplay](media/gameplay/-%20%20%20⊹%20aia.gif)
![- ⊹ aia Ranking Panel](media/panel/-%20%20%20⊹%20aia.png)
![- ⊹ aia Mods](media/icons/-%20%20%20⊹%20aia-mod-icons.png)
## [hddthr aristia](https://git.sulejmani.xyz/Skellers/ooga_booga/media/tag/v1.0.0/export/hddthr%20aristia.osk)
**Author:** some osu players
![hddthr aristia Gameplay](media/gameplay/hddthr%20aristia.gif)
![hddthr aristia Ranking Panel](media/panel/hddthr%20aristia.png)
![hddthr aristia Mods](media/icons/hddthr%20aristia-mod-icons.png)
## [019](https://git.sulejmani.xyz/Skellers/ooga_booga/media/tag/v1.0.0/export/019.osk)
![019 Gameplay](media/gameplay/019.gif)
![019 Ranking Panel](media/panel/019.png)
![019 Mods](media/icons/019-mod-icons.png)
## [Utami (WubWoofWolf)](https://git.sulejmani.xyz/Skellers/ooga_booga/media/tag/v1.0.0/export/Utami%20(WubWoofWolf).osk)
**Author:** Various Artists
![Utami (WubWoofWolf) Gameplay](media/gameplay/Utami%20(WubWoofWolf).gif)
![Utami (WubWoofWolf) Ranking Panel](media/panel/Utami%20(WubWoofWolf).png)
![Utami (WubWoofWolf) Mods](media/icons/Utami%20(WubWoofWolf)-mod-icons.png)
=======
<!--
osuid: 8040245
-->
**Go back to [osc/skins](https://git.sulej.net/osc/skins)**
**Go back to [osc/skins](https://git.sulejmani.xyz/osc/skins)**
**Click on the Skin name to download it, or click on the thumbnail to see more about the skin, including a video preview, screenshots, and mod icons.**
## [stella kii](https://git.sulej.net/Skellers/ooga_booga/media/tag/v1.0.0/export/stella%20kii/stella%20kii.osk)
**Author:** ypan kiirochii stellasu
[![stella kii Thumbnail](media/thumbnail/stella%20kii/stella%20kii.webp)](/docs/stella%20kii/stella%20kii.md)
## [stellerino](https://git.sulej.net/Skellers/ooga_booga/media/tag/v1.0.0/export/stellerino%202/stellerino.osk)
**Author:** stellasu
[![stellerino Thumbnail](media/thumbnail/stellerino%202/stellerino.webp)](/docs/stellerino%202/stellerino.md)
## [Rafis 2018-03-26 HDDT](https://git.sulej.net/Skellers/ooga_booga/media/tag/v1.0.0/export/rafis_gothic/Rafis%202018-03-26%20HDDT.osk)
**Author:** DDK RPK
[![Rafis 2018-03-26 HDDT Thumbnail](media/thumbnail/rafis_gothic/Rafis%202018-03-26%20HDDT.webp)](/docs/rafis_gothic/Rafis%202018-03-26%20HDDT.md)
## [_• zadymiarz bandana 1](https://git.sulej.net/Skellers/ooga_booga/media/tag/v1.0.0/export/zadymiarz%20onymki/_%E2%80%A2%20zadymiarz%20bandana%201.osk)
[![_• zadymiarz bandana 1 Thumbnail](media/thumbnail/zadymiarz%20onymki/_%E2%80%A2%20zadymiarz%20bandana%201.webp)](/docs/zadymiarz%20onymki/_%E2%80%A2%20zadymiarz%20bandana%201.md)
## [_• zadymiarz bandana 1](https://git.sulej.net/Skellers/ooga_booga/media/tag/v1.0.0/export/zadymiarz%20onymki%20-%20Copy/_%E2%80%A2%20zadymiarz%20bandana%201.osk)
[![_• zadymiarz bandana 1 Thumbnail](media/thumbnail/zadymiarz%20onymki%20-%20Copy/_%E2%80%A2%20zadymiarz%20bandana%201.webp)](/docs/zadymiarz%20onymki%20-%20Copy/_%E2%80%A2%20zadymiarz%20bandana%201.md)
## [summer pockets (pink)](https://git.sulej.net/Skellers/ooga_booga/media/tag/v1.0.0/export/summer%20pockets%20%28pink%29/summer%20pockets%20%28pink%29.osk)
**Author:** xek
[![summer pockets (pink) Thumbnail](media/thumbnail/summer%20pockets%20%28pink%29/summer%20pockets%20%28pink%29.webp)](/docs/summer%20pockets%20%28pink%29/summer%20pockets%20%28pink%29.md)
## [- ⊹ aia](https://git.sulej.net/Skellers/ooga_booga/media/tag/v1.0.0/export/-%20%E2%8A%B9%20aia/-%20%20%20%E2%8A%B9%20aia.osk)
**Author:** sera
[![- ⊹ aia Thumbnail](media/thumbnail/-%20%E2%8A%B9%20aia/-%20%20%20%E2%8A%B9%20aia.webp)](/docs/-%20%E2%8A%B9%20aia/-%20%20%20%E2%8A%B9%20aia.md)
## [no](https://git.sulej.net/Skellers/ooga_booga/media/tag/v1.0.0/export/-%20rafis%20pinkity%20edit%20by%20henry/no.osk)
**Author:** henry
[![no Thumbnail](media/thumbnail/-%20rafis%20pinkity%20edit%20by%20henry/no.webp)](/docs/-%20rafis%20pinkity%20edit%20by%20henry/no.md)
## [prezes](https://git.sulej.net/Skellers/ooga_booga/media/tag/v1.0.0/export/prezes/prezes.osk)
[![prezes Thumbnail](media/thumbnail/prezes/prezes.webp)](/docs/prezes/prezes.md)
## [prezes red](https://git.sulej.net/Skellers/ooga_booga/media/tag/v1.0.0/export/prezes%20-%20Copy/prezes%20red.osk)
[![prezes red Thumbnail](media/thumbnail/prezes%20-%20Copy/prezes%20red.webp)](/docs/prezes%20-%20Copy/prezes%20red.md)
## [prezes blue](https://git.sulej.net/Skellers/ooga_booga/media/tag/v1.0.0/export/prezes%20-%20Copy%20-%20Copy/prezes%20blue.osk)
[![prezes blue Thumbnail](media/thumbnail/prezes%20-%20Copy%20-%20Copy/prezes%20blue.webp)](/docs/prezes%20-%20Copy%20-%20Copy/prezes%20blue.md)
## [prezes diff combo numbers](https://git.sulej.net/Skellers/ooga_booga/media/tag/v1.0.0/export/prezes%20-%20Copy%20%282%29/prezes%20diff%20combo%20numbers.osk)
[![prezes diff combo numbers Thumbnail](media/thumbnail/prezes%20-%20Copy%20%282%29/prezes%20diff%20combo%20numbers.webp)](/docs/prezes%20-%20Copy%20%282%29/prezes%20diff%20combo%20numbers.md)
## [prezes](https://git.sulej.net/Skellers/ooga_booga/media/tag/v1.0.0/export/prezes%20-%20Copy%20%282%29%20-%20Copy%20-%20Copy/prezes.osk)
[![prezes Thumbnail](media/thumbnail/prezes%20-%20Copy%20%282%29%20-%20Copy%20-%20Copy/prezes.webp)](/docs/prezes%20-%20Copy%20%282%29%20-%20Copy%20-%20Copy/prezes.md)
## [Hyeok2044](https://git.sulej.net/Skellers/ooga_booga/media/tag/v1.0.0/export/hyeok20441610-1/Hyeok2044.osk)
**Author:** fiery,fancylad,ryuk,alfie,velvet,hyeok2044
[![Hyeok2044 Thumbnail](media/thumbnail/hyeok20441610-1/Hyeok2044.webp)](/docs/hyeok20441610-1/Hyeok2044.md)
## [boop ts](https://git.sulej.net/Skellers/ooga_booga/media/tag/v1.0.0/export/boop%20ts/boop%20ts.osk)
**Author:** ieth
[![boop ts Thumbnail](media/thumbnail/boop%20ts/boop%20ts.webp)](/docs/boop%20ts/boop%20ts.md)
## [mario bro ⌞DT⌝](https://git.sulej.net/Skellers/ooga_booga/media/tag/v1.0.0/export/mario%2Bbro%2B%E2%8C%9EDT%E2%8C%9D/mario%20bro%20%E2%8C%9EDT%E2%8C%9D.osk)
**Author:** i forgor
[![mario bro ⌞DT⌝ Thumbnail](media/thumbnail/mario%2Bbro%2B%E2%8C%9EDT%E2%8C%9D/mario%20bro%20%E2%8C%9EDT%E2%8C%9D.webp)](/docs/mario%2Bbro%2B%E2%8C%9EDT%E2%8C%9D/mario%20bro%20%E2%8C%9EDT%E2%8C%9D.md)
## [nogi - heterochromia](https://git.sulej.net/Skellers/ooga_booga/media/tag/v1.0.0/export/-%20kodama%20-%20nogi/nogi%20-%20heterochromia.osk)
**Author:** kodama
[![nogi - heterochromia Thumbnail](media/thumbnail/-%20kodama%20-%20nogi/nogi%20-%20heterochromia.webp)](/docs/-%20kodama%20-%20nogi/nogi%20-%20heterochromia.md)
## [++scylla funny mix EPIC](https://git.sulej.net/Skellers/ooga_booga/media/tag/v1.0.0/export/%2B%2Bscylla%20funny%20mix%20EPIC/%2B%2Bscylla%20funny%20mix%20EPIC.osk)
## [++scylla funny mix EPIC](https://git.sulejmani.xyz/Skellers/ooga_booga/media/tag/v1.1.0/export/%2B%2Bscylla%20funny%20mix%20EPIC/%2B%2Bscylla%20funny%20mix%20EPIC.osk)
[![++scylla funny mix EPIC Thumbnail](media/thumbnail/%2B%2Bscylla%20funny%20mix%20EPIC/%2B%2Bscylla%20funny%20mix%20EPIC.webp)](/docs/%2B%2Bscylla%20funny%20mix%20EPIC/%2B%2Bscylla%20funny%20mix%20EPIC.md)
## [- + morgan spring](https://git.sulej.net/Skellers/ooga_booga/media/tag/v1.0.0/export/-%20%2B%20morgan%20spring/-%20%2B%20morgan%20spring.osk)
## [no](https://git.sulejmani.xyz/Skellers/ooga_booga/media/tag/v1.1.0/export/-%20rafis%20pinkity%20edit%20by%20henry/no.osk)
[![- + morgan spring Thumbnail](media/thumbnail/-%20%2B%20morgan%20spring/-%20%2B%20morgan%20spring.webp)](/docs/-%20%2B%20morgan%20spring/-%20%2B%20morgan%20spring.md)
[![no Thumbnail](media/thumbnail/-%20rafis%20pinkity%20edit%20by%20henry/no.webp)](/docs/-%20rafis%20pinkity%20edit%20by%20henry/no.md)
## [- Seoul v11 Asta Edit](https://git.sulej.net/Skellers/ooga_booga/media/tag/v1.0.0/export/-%20Seoul%20v11%20Asta%20Edit/-%20Seoul%20v11%20Asta%20Edit.osk)
## [- ⊹ aia](https://git.sulejmani.xyz/Skellers/ooga_booga/media/tag/v1.1.0/export/-%20%E2%8A%B9%20aia%20-%20Copy/-%20%20%20%E2%8A%B9%20aia.osk)
**Author:** Seouless
[![- ⊹ aia Thumbnail](media/thumbnail/-%20%E2%8A%B9%20aia%20-%20Copy/-%20%20%20%E2%8A%B9%20aia.webp)](/docs/-%20%E2%8A%B9%20aia%20-%20Copy/-%20%20%20%E2%8A%B9%20aia.md)
[![- Seoul v11 Asta Edit Thumbnail](media/thumbnail/-%20Seoul%20v11%20Asta%20Edit/-%20Seoul%20v11%20Asta%20Edit.webp)](/docs/-%20Seoul%20v11%20Asta%20Edit/-%20Seoul%20v11%20Asta%20Edit.md)
## [- TekkitoTopoi](https://git.sulej.net/Skellers/ooga_booga/media/tag/v1.0.0/export/-%20TekkitoTopoi/-%20TekkitoTopoi.osk)
[![- TekkitoTopoi Thumbnail](media/thumbnail/-%20TekkitoTopoi/-%20TekkitoTopoi.webp)](/docs/-%20TekkitoTopoi/-%20TekkitoTopoi.md)
## [v1i4qqq](https://git.sulej.net/Skellers/ooga_booga/media/tag/v1.0.0/export/-%20v1i4qqq/v1i4qqq.osk)
**Author:** osu! skin mixer by rednir
[![v1i4qqq Thumbnail](media/thumbnail/-%20v1i4qqq/v1i4qqq.webp)](/docs/-%20v1i4qqq/v1i4qqq.md)
## [aia edit 1](https://git.sulej.net/Skellers/ooga_booga/media/tag/v1.0.0/export/-%20%E2%8A%B9%20aia%201/aia%20edit%201.osk)
**Author:** Skellers
[![aia edit 1 Thumbnail](media/thumbnail/-%20%E2%8A%B9%20aia%201/aia%20edit%201.webp)](/docs/-%20%E2%8A%B9%20aia%201/aia%20edit%201.md)
## [aia edit 2](https://git.sulej.net/Skellers/ooga_booga/media/tag/v1.0.0/export/-%20%E2%8A%B9%20aia%202/aia%20edit%202.osk)
**Author:** Skellers
[![aia edit 2 Thumbnail](media/thumbnail/-%20%E2%8A%B9%20aia%202/aia%20edit%202.webp)](/docs/-%20%E2%8A%B9%20aia%202/aia%20edit%202.md)
## [aia edit 3](https://git.sulej.net/Skellers/ooga_booga/media/tag/v1.0.0/export/-%20%E2%8A%B9%20aia%203/aia%20edit%203.osk)
**Author:** Skellers
[![aia edit 3 Thumbnail](media/thumbnail/-%20%E2%8A%B9%20aia%203/aia%20edit%203.webp)](/docs/-%20%E2%8A%B9%20aia%203/aia%20edit%203.md)
## [Utami (WubWoofWolf)](https://git.sulej.net/Skellers/ooga_booga/media/tag/v1.0.0/export/--/Utami%20%28WubWoofWolf%29.osk)
**Author:** Various Artists
## [Utami (WubWoofWolf)](https://git.sulejmani.xyz/Skellers/ooga_booga/media/tag/v1.1.0/export/--/Utami%20%28WubWoofWolf%29.osk)
[![Utami (WubWoofWolf) Thumbnail](media/thumbnail/--/Utami%20%28WubWoofWolf%29.webp)](/docs/--/Utami%20%28WubWoofWolf%29.md)
## [33](https://git.sulej.net/Skellers/ooga_booga/media/tag/v1.0.0/export/7lqdv4/33.osk)
**Author:** osu! skin mixer by rednir
[![33 Thumbnail](media/thumbnail/7lqdv4/33.webp)](/docs/7lqdv4/33.md)
## [Aleph DT](https://git.sulej.net/Skellers/ooga_booga/media/tag/v1.0.0/export/Aleph%20DT/Aleph%20DT.osk)
**Author:** various
## [Aleph DT](https://git.sulejmani.xyz/Skellers/ooga_booga/media/tag/v1.1.0/export/Aleph%20DT/Aleph%20DT.osk)
[![Aleph DT Thumbnail](media/thumbnail/Aleph%20DT/Aleph%20DT.webp)](/docs/Aleph%20DT/Aleph%20DT.md)
## [Aristia(Edit)](https://git.sulej.net/Skellers/ooga_booga/media/tag/v1.0.0/export/Aristia%28Edit%29%20%2B%20KaBa%20-%20Copy/Aristia%28Edit%29.osk)
**Author:** [Garin] + Aristia + Various
[![Aristia(Edit) Thumbnail](media/thumbnail/Aristia%28Edit%29%20%2B%20KaBa%20-%20Copy/Aristia%28Edit%29.webp)](/docs/Aristia%28Edit%29%20%2B%20KaBa%20-%20Copy/Aristia%28Edit%29.md)
## [Azer+ 2023](https://git.sulej.net/Skellers/ooga_booga/media/tag/v1.0.0/export/Azer%2B%202023/Azer%2B%202023.osk)
**Author:** Azer, Various others
[![Azer+ 2023 Thumbnail](media/thumbnail/Azer%2B%202023/Azer%2B%202023.webp)](/docs/Azer%2B%202023/Azer%2B%202023.md)
## [tekkito2](https://git.sulej.net/Skellers/ooga_booga/media/tag/v1.0.0/export/ELBBANG%20-%20NM3.5%20%28Maliszewski%20x%20SWAGGYSWAGSTER%29/tekkito2.osk)
[![tekkito2 Thumbnail](media/thumbnail/ELBBANG%20-%20NM3.5%20%28Maliszewski%20x%20SWAGGYSWAGSTER%29/tekkito2.webp)](/docs/ELBBANG%20-%20NM3.5%20%28Maliszewski%20x%20SWAGGYSWAGSTER%29/tekkito2.md)
## [Prawilosc vJP without followpoints](https://git.sulej.net/Skellers/ooga_booga/media/tag/v1.0.0/export/Luciano%20DT/Prawilosc%20vJP%20without%20followpoints.osk)
**Author:** DDK RPK
[![Prawilosc vJP without followpoints Thumbnail](media/thumbnail/Luciano%20DT/Prawilosc%20vJP%20without%20followpoints.webp)](/docs/Luciano%20DT/Prawilosc%20vJP%20without%20followpoints.md)
## [Aristia(Edit (Mistya))](https://git.sulej.net/Skellers/ooga_booga/media/tag/v1.0.0/export/Luciano%20NM/Aristia%28Edit%20%28Mistya%29%29.osk)
**Author:** [Garin] + Aristia + Various
[![Aristia(Edit (Mistya)) Thumbnail](media/thumbnail/Luciano%20NM/Aristia%28Edit%20%28Mistya%29%29.webp)](/docs/Luciano%20NM/Aristia%28Edit%20%28Mistya%29%29.md)
## [cool skin](https://git.sulej.net/Skellers/ooga_booga/media/tag/v1.0.0/export/Luciano%20The%20Game/cool%20skin.osk)
**Author:** soul
[![cool skin Thumbnail](media/thumbnail/Luciano%20The%20Game/cool%20skin.webp)](/docs/Luciano%20The%20Game/cool%20skin.md)
## [Niko-v5](https://git.sulej.net/Skellers/ooga_booga/media/tag/v1.0.0/export/Niko-LUCIANO/Niko-v5.osk)
**Author:** some awesome people
[![Niko-v5 Thumbnail](media/thumbnail/Niko-LUCIANO/Niko-v5.webp)](/docs/Niko-LUCIANO/Niko-v5.md)
## [Rafis HDDT mrekk](https://git.sulej.net/Skellers/ooga_booga/media/tag/v1.0.0/export/Rafis%20HDDT%20mrekk/Rafis%20HDDT%20mrekk.osk)
**Author:** DDK RPK (scorebar edit by DevenRam)
[![Rafis HDDT mrekk Thumbnail](media/thumbnail/Rafis%20HDDT%20mrekk/Rafis%20HDDT%20mrekk.webp)](/docs/Rafis%20HDDT%20mrekk/Rafis%20HDDT%20mrekk.md)
## [Rafis but SZ](https://git.sulej.net/Skellers/ooga_booga/media/tag/v1.0.0/export/Rafis%20but%20SZ/Rafis%20but%20SZ.osk)
**Author:** DDK RPK
## [Rafis but SZ](https://git.sulejmani.xyz/Skellers/ooga_booga/media/tag/v1.1.0/export/Rafis%20but%20SZ/Rafis%20but%20SZ.osk)
[![Rafis but SZ Thumbnail](media/thumbnail/Rafis%20but%20SZ/Rafis%20but%20SZ.webp)](/docs/Rafis%20but%20SZ/Rafis%20but%20SZ.md)
## [- + - tkori_r](https://git.sulej.net/Skellers/ooga_booga/media/tag/v1.0.0/export/Rafis%20tkori_r/-%20%2B%20-%20tkori_r.osk)
**Author:** mixed
[![- + - tkori_r Thumbnail](media/thumbnail/Rafis%20tkori_r/-%20%2B%20-%20tkori_r.webp)](/docs/Rafis%20tkori_r/-%20%2B%20-%20tkori_r.md)
## [Replicant](https://git.sulej.net/Skellers/ooga_booga/media/tag/v1.0.0/export/Replicant/Replicant.osk)
**Author:** altruism
[![Replicant Thumbnail](media/thumbnail/Replicant/Replicant.webp)](/docs/Replicant/Replicant.md)
## [Rohulk 5.0b](https://git.sulej.net/Skellers/ooga_booga/media/tag/v1.0.0/export/Rohulk%205.0b/Rohulk%205.0b.osk)
**Author:** Fatal3ty/Rohulk (Interface/Menu from Clear Skin Ultra 3.0 by Fatal3ty)
[![Rohulk 5.0b Thumbnail](media/thumbnail/Rohulk%205.0b/Rohulk%205.0b.webp)](/docs/Rohulk%205.0b/Rohulk%205.0b.md)
## [Welter-azerinoo](https://git.sulej.net/Skellers/ooga_booga/media/tag/v1.0.0/export/Welter-azerinoo/Welter-azerinoo.osk)
**Author:** Gnahus-Remix-Welter
[![Welter-azerinoo Thumbnail](media/thumbnail/Welter-azerinoo/Welter-azerinoo.webp)](/docs/Welter-azerinoo/Welter-azerinoo.md)
## [ZachTV fixedexport](https://git.sulej.net/Skellers/ooga_booga/media/tag/v1.0.0/export/ZachTV%20Pink/ZachTV%20fixedexport.osk)
**Author:** Zach
[![ZachTV fixedexport Thumbnail](media/thumbnail/ZachTV%20Pink/ZachTV%20fixedexport.webp)](/docs/ZachTV%20Pink/ZachTV%20fixedexport.md)
## [adidas for3v3r](https://git.sulej.net/Skellers/ooga_booga/media/tag/v1.0.0/export/_%E2%80%A2%20adidas%20for3v3r/adidas%20for3v3r.osk)
**Author:** adidas pocan
## [adidas for3v3r](https://git.sulejmani.xyz/Skellers/ooga_booga/media/tag/v1.1.0/export/_%E2%80%A2%20adidas%20for3v3r/adidas%20for3v3r.osk)
[![adidas for3v3r Thumbnail](media/thumbnail/_%E2%80%A2%20adidas%20for3v3r/adidas%20for3v3r.webp)](/docs/_%E2%80%A2%20adidas%20for3v3r/adidas%20for3v3r.md)
## [rafisedit](https://git.sulej.net/Skellers/ooga_booga/media/tag/v1.0.0/export/_%E2%80%A2%20rafisedit/rafisedit.osk)
## [019](https://git.sulejmani.xyz/Skellers/ooga_booga/media/tag/v1.1.0/export/a%D0%BB%D1%91/019.osk)
**Author:** draingang remake - https://github.com/thepro2k/Maliszewski-osu-skins/blob/main/skin.md
[![019 Thumbnail](media/thumbnail/a%D0%BB%D1%91/019.webp)](/docs/a%D0%BB%D1%91/019.md)
[![rafisedit Thumbnail](media/thumbnail/_%E2%80%A2%20rafisedit/rafisedit.webp)](/docs/_%E2%80%A2%20rafisedit/rafisedit.md)
## [altruism](https://git.sulej.net/Skellers/ooga_booga/media/tag/v1.0.0/export/altruism/altruism.osk)
**Author:** altruism
[![altruism Thumbnail](media/thumbnail/altruism/altruism.webp)](/docs/altruism/altruism.md)
## [altruism red niko cursor](https://git.sulej.net/Skellers/ooga_booga/media/tag/v1.0.0/export/altruism%20-%20Copy/altruism%20red%20niko%20cursor.osk)
**Author:** altruism
[![altruism red niko cursor Thumbnail](media/thumbnail/altruism%20-%20Copy/altruism%20red%20niko%20cursor.webp)](/docs/altruism%20-%20Copy/altruism%20red%20niko%20cursor.md)
## [altruism alt](https://git.sulej.net/Skellers/ooga_booga/media/tag/v1.0.0/export/altruism%20alt/altruism%20alt.osk)
**Author:** altruism
[![altruism alt Thumbnail](media/thumbnail/altruism%20alt/altruism%20alt.webp)](/docs/altruism%20alt/altruism%20alt.md)
## [awawawawadesu](https://git.sulej.net/Skellers/ooga_booga/media/tag/v1.0.0/export/awawawawadesu/awawawawadesu.osk)
**Author:** -duff
[![awawawawadesu Thumbnail](media/thumbnail/awawawawadesu/awawawawadesu.webp)](/docs/awawawawadesu/awawawawadesu.md)
## [boblow](https://git.sulej.net/Skellers/ooga_booga/media/tag/v1.0.0/export/boblowedit/boblow.osk)
**Author:** boblow
[![boblow Thumbnail](media/thumbnail/boblowedit/boblow.webp)](/docs/boblowedit/boblow.md)
## [+GN](https://git.sulej.net/Skellers/ooga_booga/media/tag/v1.0.0/export/boshyman%20gn%20white2/%2BGN.osk)
**Author:** -GN, eren-desu, Yasen etc.
[![+GN Thumbnail](media/thumbnail/boshyman%20gn%20white2/%2BGN.webp)](/docs/boshyman%20gn%20white2/%2BGN.md)
## [fukari alt](https://git.sulej.net/Skellers/ooga_booga/media/tag/v1.0.0/export/fukari%20alt/fukari%20alt.osk)
**Author:** Fukari-tan
[![fukari alt Thumbnail](media/thumbnail/fukari%20alt/fukari%20alt.webp)](/docs/fukari%20alt/fukari%20alt.md)
## [parannoul gold river SS](https://git.sulej.net/Skellers/ooga_booga/media/tag/v1.0.0/export/gold%20river/parannoul%20gold%20river%20SS.osk)
**Author:** draingang remake - https://github.com/thepro2k/Maliszewski-osu-skins/blob/main/skin.md
[![parannoul gold river SS Thumbnail](media/thumbnail/gold%20river/parannoul%20gold%20river%20SS.webp)](/docs/gold%20river/parannoul%20gold%20river%20SS.md)
## [hddthr aristia](https://git.sulej.net/Skellers/ooga_booga/media/tag/v1.0.0/export/hddthr_aristia/hddthr%20aristia.osk)
**Author:** some osu players
## [hddthr aristia](https://git.sulejmani.xyz/Skellers/ooga_booga/media/tag/v1.1.0/export/hddthr_aristia/hddthr%20aristia.osk)
[![hddthr aristia Thumbnail](media/thumbnail/hddthr_aristia/hddthr%20aristia.webp)](/docs/hddthr_aristia/hddthr%20aristia.md)
## [herofest_v2](https://git.sulej.net/Skellers/ooga_booga/media/tag/v1.0.0/export/herofest_v2/herofest_v2.osk)
## [prezes](https://git.sulejmani.xyz/Skellers/ooga_booga/media/tag/v1.1.0/export/prezes/prezes.osk)
**Author:** unknown
[![herofest_v2 Thumbnail](media/thumbnail/herofest_v2/herofest_v2.webp)](/docs/herofest_v2/herofest_v2.md)
## [how the sky was](https://git.sulej.net/Skellers/ooga_booga/media/tag/v1.0.0/export/how%20the%20sky%20was/how%20the%20sky%20was.osk)
**Author:** Forever
[![how the sky was Thumbnail](media/thumbnail/how%20the%20sky%20was/how%20the%20sky%20was.webp)](/docs/how%20the%20sky%20was/how%20the%20sky%20was.md)
## [- oepep stoof edit -](https://git.sulej.net/Skellers/ooga_booga/media/tag/v1.0.0/export/hr%20%2B%20hr/-%20oepep%20stoof%20edit%20-.osk)
**Author:** Luciano / oepep
[![- oepep stoof edit - Thumbnail](media/thumbnail/hr%20%2B%20hr/-%20oepep%20stoof%20edit%20-.webp)](/docs/hr%20%2B%20hr/-%20oepep%20stoof%20edit%20-.md)
## [- oepep stoof edit -](https://git.sulej.net/Skellers/ooga_booga/media/tag/v1.0.0/export/hr%20%2B%20hr%20hard%20hs/-%20oepep%20stoof%20edit%20-.osk)
**Author:** Luciano / oepep
[![- oepep stoof edit - Thumbnail](media/thumbnail/hr%20%2B%20hr%20hard%20hs/-%20oepep%20stoof%20edit%20-.webp)](/docs/hr%20%2B%20hr%20hard%20hs/-%20oepep%20stoof%20edit%20-.md)
## [pew2022 LITE](https://git.sulej.net/Skellers/ooga_booga/media/tag/v1.0.0/export/pew2022%20LITE/pew2022%20LITE.osk)
[![pew2022 LITE Thumbnail](media/thumbnail/pew2022%20LITE/pew2022%20LITE.webp)](/docs/pew2022%20LITE/pew2022%20LITE.md)
## [prezes](https://git.sulej.net/Skellers/ooga_booga/media/tag/v1.0.0/export/prezes%20-%20Copy%20%282%29%20-%20Copy/prezes.osk)
[![prezes Thumbnail](media/thumbnail/prezes%20-%20Copy%20%282%29%20-%20Copy/prezes.webp)](/docs/prezes%20-%20Copy%20%282%29%20-%20Copy/prezes.md)
## [Rafis Gothic Lolita HS](https://git.sulej.net/Skellers/ooga_booga/media/tag/v1.0.0/export/rafis%20gothic%20hs/Rafis%20Gothic%20Lolita%20HS.osk)
**Author:** DDK RPK
[![Rafis Gothic Lolita HS Thumbnail](media/thumbnail/rafis%20gothic%20hs/Rafis%20Gothic%20Lolita%20HS.webp)](/docs/rafis%20gothic%20hs/Rafis%20Gothic%20Lolita%20HS.md)
## [sora](https://git.sulej.net/Skellers/ooga_booga/media/tag/v1.0.0/export/sora%20%28copy%29/sora.osk)
**Author:** Hidoi (onnneetti helped too)
[![sora Thumbnail](media/thumbnail/sora%20%28copy%29/sora.webp)](/docs/sora%20%28copy%29/sora.md)
## [spilicia - EZ](https://git.sulej.net/Skellers/ooga_booga/media/tag/v1.0.0/export/spilicia%20-%20EZ/spilicia%20-%20EZ.osk)
**Author:** spilicia
[![spilicia - EZ Thumbnail](media/thumbnail/spilicia%20-%20EZ/spilicia%20-%20EZ.webp)](/docs/spilicia%20-%20EZ/spilicia%20-%20EZ.md)
## [spilicia - NM](https://git.sulej.net/Skellers/ooga_booga/media/tag/v1.0.0/export/spilicia%20-%20NM/spilicia%20-%20NM.osk)
**Author:** spilicia
[![spilicia - NM Thumbnail](media/thumbnail/spilicia%20-%20NM/spilicia%20-%20NM.webp)](/docs/spilicia%20-%20NM/spilicia%20-%20NM.md)
## [stellerino](https://git.sulej.net/Skellers/ooga_booga/media/tag/v1.0.0/export/stellerino/stellerino.osk)
**Author:** stellasu
[![stellerino Thumbnail](media/thumbnail/stellerino/stellerino.webp)](/docs/stellerino/stellerino.md)
## [tekkito2 malisz](https://git.sulej.net/Skellers/ooga_booga/media/tag/v1.0.0/export/styl%20hong%20kong/tekkito2%20malisz.osk)
[![tekkito2 malisz Thumbnail](media/thumbnail/styl%20hong%20kong/tekkito2%20malisz.webp)](/docs/styl%20hong%20kong/tekkito2%20malisz.md)
## [tekkito2 malisz](https://git.sulej.net/Skellers/ooga_booga/media/tag/v1.0.0/export/styl%20hong%20kong%20-%20Copy/tekkito2%20malisz.osk)
[![tekkito2 malisz Thumbnail](media/thumbnail/styl%20hong%20kong%20-%20Copy/tekkito2%20malisz.webp)](/docs/styl%20hong%20kong%20-%20Copy/tekkito2%20malisz.md)
## [tekkito aleph edit](https://git.sulej.net/Skellers/ooga_booga/media/tag/v1.0.0/export/tekkito%2Baleph%2Bedit/tekkito%20aleph%20edit.osk)
[![tekkito aleph edit Thumbnail](media/thumbnail/tekkito%2Baleph%2Bedit/tekkito%20aleph%20edit.webp)](/docs/tekkito%2Baleph%2Bedit/tekkito%20aleph%20edit.md)
## [tko](https://git.sulej.net/Skellers/ooga_booga/media/tag/v1.0.0/export/tko%20reused/tko.osk)
**Author:** various authors
[![tko Thumbnail](media/thumbnail/tko%20reused/tko.webp)](/docs/tko%20reused/tko.md)
## [tourney player or somethin](https://git.sulej.net/Skellers/ooga_booga/media/tag/v1.0.0/export/tourney%20player%20or%20somethin/tourney%20player%20or%20somethin.osk)
**Author:** many//edited by zibi
[![tourney player or somethin Thumbnail](media/thumbnail/tourney%20player%20or%20somethin/tourney%20player%20or%20somethin.webp)](/docs/tourney%20player%20or%20somethin/tourney%20player%20or%20somethin.md)
## [- zibi instafade](https://git.sulej.net/Skellers/ooga_booga/media/tag/v1.0.0/export/whypan-azerino/-%20zibi%20instafade.osk)
**Author:** many//edited by zibi
[![- zibi instafade Thumbnail](media/thumbnail/whypan-azerino/-%20zibi%20instafade.webp)](/docs/whypan-azerino/-%20zibi%20instafade.md)
## [zadymiarz](https://git.sulej.net/Skellers/ooga_booga/media/tag/v1.0.0/export/zadymiarz/zadymiarz.osk)
[![zadymiarz Thumbnail](media/thumbnail/zadymiarz/zadymiarz.webp)](/docs/zadymiarz/zadymiarz.md)
## [# 心 Kokoro 「3.0」 DT](https://git.sulej.net/Skellers/ooga_booga/media/tag/v1.0.0/export/%E5%BF%83kokoro%20dt/%23%20%E5%BF%83%20Kokoro%20%E3%80%8C3.0%E3%80%8D%20DT.osk)
**Author:** Duckyzie
[![# 心 Kokoro 「3.0」 DT Thumbnail](media/thumbnail/%E5%BF%83kokoro%20dt/%23%20%E5%BF%83%20Kokoro%20%E3%80%8C3.0%E3%80%8D%20DT.webp)](/docs/%E5%BF%83kokoro%20dt/%23%20%E5%BF%83%20Kokoro%20%E3%80%8C3.0%E3%80%8D%20DT.md)
[![prezes Thumbnail](media/thumbnail/prezes/prezes.webp)](/docs/prezes/prezes.md)
>>>>>>> 312c74cbe1893ebb2b3313cdc9f18c22cd01082c
# Build History
| Version | Date |
| ------- | ---- |
| [`v1.0.0 (Current)`](https://git.sulej.net/Skellers/ooga_booga/src/tag/v1.0.0/README.md) | 23.11.2025 17:02:03 |
<<<<<<< HEAD
| [`v1.0.0 (Current)`](https://git.sulejmani.xyz/arlind/skins/src/tag/v1.0.0/README.md) | 06.06.2025 12:53:02 |
=======
| [`v1.1.0 (Current)`](https://git.sulejmani.xyz/Skellers/ooga_booga/src/tag/v1.1.0/README.md) | 16.06.2025 21:12:46 |
| [`v1.0.0`](https://git.sulejmani.xyz/Skellers/ooga_booga/src/tag/v1.0.0/README.md) | 16.06.2025 10:51:47 |
>>>>>>> 312c74cbe1893ebb2b3313cdc9f18c22cd01082c

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

View File

@@ -1,52 +0,0 @@
[LocalizedFileNames]
taiko-soft-hitwhistle.wav=@taiko-soft-hitwhistle.wav,0
taiko-soft-hitnormal.wav=@taiko-soft-hitnormal.wav,0
taiko-soft-hitfinish.wav=@taiko-soft-hitfinish.wav,0
taiko-soft-hitclap.wav=@taiko-soft-hitclap.wav,0
taiko-normal-hitwhistle.wav=@taiko-normal-hitwhistle.wav,0
taiko-normal-hitnormal.wav=@taiko-normal-hitnormal.wav,0
taiko-normal-hitfinish.wav=@taiko-normal-hitfinish.wav,0
taiko-normal-hitclap.wav=@taiko-normal-hitclap.wav,0
soft-hitwhistle1.wav=@soft-hitwhistle1.wav,0
soft-hitnormal4.wav=@soft-hitnormal4.wav,0
soft-hitnormal3.wav=@soft-hitnormal3.wav,0
shutter.wav=@shutter.wav,0
match-start.wav=@match-start.wav,0
match-leave.wav=@match-leave.wav,0
match-join.wav=@match-join.wav,0
match-confirm.wav=@match-confirm.wav,0
count2s.WAV=@count2s.WAV,0
spinnerbonus.wav=@spinnerbonus.wav,0
spinnerspin.wav=@spinnerspin.wav,0
soft-sliderwhistle.wav=@soft-sliderwhistle.wav,0
soft-slidertick2.wav=@soft-slidertick2.wav,0
soft-sliderslide.wav=@soft-sliderslide.wav,0
soft-sliderslide2.wav=@soft-sliderslide2.wav,0
soft-slidertick.wav=@soft-slidertick.wav,0
soft-hitwhistle2.wav=@soft-hitwhistle2.wav,0
soft-hitwhistle.wav=@soft-hitwhistle.wav,0
soft-hitnormal2.wav=@soft-hitnormal2.wav,0
soft-hitnormal1.wav=@soft-hitnormal1.wav,0
soft-hitnormal.wav=@soft-hitnormal.wav,0
soft-hitfinish.wav=@soft-hitfinish.wav,0
soft-hitfinish2.wav=@soft-hitfinish2.wav,0
soft-hitclap.wav=@soft-hitclap.wav,0
soft-hitclap2.wav=@soft-hitclap2.wav,0
normal-slidertick.wav=@normal-slidertick.wav,0
normal-sliderwhistle.wav=@normal-sliderwhistle.wav,0
normal-sliderslide2.wav=@normal-sliderslide2.wav,0
normal-sliderslide.wav=@normal-sliderslide.wav,0
normal-hitwhistle2.wav=@normal-hitwhistle2.wav,0
normal-hitwhistle.wav=@normal-hitwhistle.wav,0
normal-hitnormal2.wav=@normal-hitnormal2.wav,0
normal-hitnormal.wav=@normal-hitnormal.wav,0
normal-hitfinish2.wav=@normal-hitfinish2.wav,0
normal-hitfinish.wav=@normal-hitfinish.wav,0
normal-hitclap2.wav=@normal-hitclap2.wav,0
normal-hitclap.wav=@normal-hitclap.wav,0
menuhit.wav=@menuhit.wav,0
menuclick.wav=@menuclick.wav,0
menuback.wav=@menuback.wav,0
gos.WAV=@gos.WAV,0
failsound.wav=@failsound.wav,0
count3s.WAV=@count3s.WAV,0

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

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