10 Commits

Author SHA1 Message Date
Cametendo
8e01a89ab8 Merge pull request #7 from Cametendo/codex/add-images-for-characters-and-devil-fruits
Fetch/hydrate proper wiki images, improve portraits, and add deceased filter
2026-08-15 02:21:33 +02:00
Cametendo
34908f7108 Show full character roster by default 2026-08-15 02:21:19 +02:00
Cametendo
84d3be478e Merge pull request #6 from Cametendo/codex/add-images-for-characters-and-devil-fruits-q49vz4
Load wiki thumbnails for portraits and refine character bounty/rank labels
2026-08-15 02:07:53 +02:00
copilot-swe-agent[bot]
47d40c0cc6 Merge remote-tracking branch 'origin/claude/one-piece-wiki-hjbn4q' into codex/add-images-for-characters-and-devil-fruits-q49vz4
# Conflicts:
#	css/styles.css

Co-authored-by: Cametendo <119795084+Cametendo@users.noreply.github.com>
2026-08-15 00:06:58 +00:00
Cametendo
c76119b923 Refine portrait frames and non-bounty cards 2026-08-15 02:04:46 +02:00
Cametendo
266925ff4a Merge pull request #5 from Cametendo/codex/add-images-for-characters-and-devil-fruits
Load proper Fandom thumbnails for character and fruit portraits
2026-08-15 01:59:04 +02:00
Cametendo
29a2243690 Add proper wiki images for portraits 2026-08-15 01:58:40 +02:00
Claude
c645ee09d2 Add original generated portrait/icon artwork for every entry
Adds js/portraits.js: procedurally generated, original SVG artwork for
all 101 characters (a role-themed line-art medallion — sword for
swordsmen, crown for royalty, compass for navigators, etc., derived
from each character's role/epithet/affiliation) and all 58 Devil
Fruits (a stylized swirled-fruit icon colored by category with the
fruit's symbolic emoji at center).

Official One Piece artwork is copyrighted (Oda/Shueisha/Toei), so
rather than scraping and re-hosting character art from the web, every
image here is drawn from scratch with basic SVG primitives — no
external assets, no copyright risk, fully offline-capable, and crisp
at any size since it's vector.

Wires the new generators into every card and detail view: character
cards/profile header, Devil Fruit cards/detail header, the Devil-Fruit
callout on character pages, and user chips on Devil Fruit pages.
Removes the now-unused plain-letter initialFor() avatar helper.
2026-08-14 23:47:39 +00:00
Claude
ee140dbe4d Add Uta and her Uta Uta no Mi
Adds the One Piece Film: Red character Uta and her Song-Song devil
fruit, cross-linked the same way as every other character/fruit pair.
Both automatically appear in the existing search/filter grids and
detail pages since the site is fully data-driven.
2026-08-14 23:30:57 +00:00
Claude
8f60ff8499 Rebuild site as a full One Piece character & Devil Fruit wiki
Replaces the 4-card quickstart mockup with a data-driven wiki covering
the 100 most well-known One Piece characters and every Devil Fruit they
carry (57 fruits total), each with its own linked detail page.

- js/characters-data.js: 100 character profiles (stats, bio, abilities)
- js/fruits-data.js: 57 Devil Fruit entries (history, powers, strengths/
  weaknesses, full user lineage) cross-linked to character ids
- index.html + main.js: searchable/filterable character grid
- character.html + character.js: character detail template driven by ?id=
- fruits.html + fruits.js: searchable Devil Fruit index with type filter
- fruit.html + fruit.js: Devil Fruit detail template driven by ?id=
- css/styles.css: new wanted-poster/ocean-navy design system, responsive
- Fixed docker-compose volume mount (previously pointed at a nonexistent
  ./data directory) and rewrote README for the new structure

Verified with a headless browser: all four page types render without
script errors, search/filter interactions work, and every character-
fruit cross-reference resolves correctly.
2026-08-14 23:19:44 +00:00
16 changed files with 3526 additions and 210 deletions

View File

@@ -1,34 +1,74 @@
# devil-fruit-encyclopedia # One Piece Wiki — Character & Devil Fruit Encyclopedia
An encyclopedia about One Piece devil fruits build with HTML, CSS and JS
[![License: MIT](https://img.shields.io/badge/License-MIT-blue.svg)](https://opensource.org/licenses/MIT) [![License: MIT](https://img.shields.io/badge/License-MIT-blue.svg)](https://opensource.org/licenses/MIT)
[![Status](https://img.shields.io/badge/Status-Beta-red.svg)](https://en.wikipedia.org/wiki/Software_release_life_cycle#Beta) [![Status](https://img.shields.io/badge/Status-Beta-red.svg)](https://en.wikipedia.org/wiki/Software_release_life_cycle#Beta)
# About > ⚠ **SPOILER WARNING:** this site covers the entire One Piece story, including its most recent arcs. Browse at your own risk!
A simple and small encyclopedia about the One Piece devil fruits built with HTML, CSS and JS.
SPOILER-WARNING: THIS WEBSITE WILL SPOILER MANY FRUITS ASWELL AS DETAILS RELATED TO EACH FRUIT! VISIT AT YOUR OWN RISK!!
# Requirements ## About
- `Web-Browser`: Firefox (recommended), Chrome / Chromium, Safari (if on MacOS)
- `JavaScript`: enabled
- `Internet`: active connection
# Usage A fan-made, static wiki covering the **100 most well-known One Piece characters** — Straw Hats, Marines, Yonko, Warlords, Revolutionaries, and more — plus a full **Devil Fruit encyclopedia**. Every character who has eaten a Devil Fruit links straight to that fruit's own page, and every fruit page lists its type, history, powers, strengths/weaknesses, and the complete chain of everyone who has ever used it (e.g. the Mera Mera no Mi links both Portgas D. Ace and Sabo; the Gura Gura no Mi links Whitebeard and Blackbeard).
- View fruits: Users can view existing fruits (f. e. the "gomu gomu no mi", the Gum-Gum fruit)
- Add fruits: Users can add fruits (f. e. the "bara bara no mi", Chop-Chop fruit)
- Update fruits: Users can update fruits (those they added themself) to add / remove details
- Delete fruits: Users can delete fruits they added
# Supported OS (Operating System) Built with plain **HTML, CSS, and JavaScript** — no frameworks, no build step, no backend. All content lives in two data files and is rendered client-side.
- Linux, MacOS, FreeBSD, Windows, Android, iOS <sub>(TL;DR: every OS that supports a web-browser with javascript)</sub>
# Access ## Features
1. (To be added)
- 🏴‍☠️ **100 character profiles** — bounty, affiliation, origin, stats, biography, and abilities
- 🍈 **57 linked Devil Fruit pages** — Paramecia, Zoan, and Logia, each with history, powers, strengths/weaknesses, and every known user
- 🔍 Live search & filtering on both the character index and the Devil Fruit index (by name, affiliation, or fruit type)
- 🔗 Two-way linking: character pages link to their fruit, fruit pages link back to every user
- 🎨 A wanted-poster inspired design, fully responsive
## Project structure
```
.
├── index.html # Character wiki home (search + filter + grid)
├── character.html # Character detail template (rendered via ?id=)
├── fruits.html # Devil Fruit index (search + type filter + grid)
├── fruit.html # Devil Fruit detail template (rendered via ?id=)
├── css/
│ └── styles.css # Full design system
└── js/
├── characters-data.js # 100 character records
├── fruits-data.js # 57 Devil Fruit records (linked to characters)
├── app.js # Shared rendering/formatting utilities
├── main.js # Home page controller
├── character.js # Character detail page controller
├── fruits.js # Devil Fruit index controller
└── fruit.js # Devil Fruit detail page controller
```
## Running locally
No build step required — it's static HTML/CSS/JS. Just serve the directory:
```bash
python3 -m http.server 8080
# then open http://localhost:8080
```
Or with Docker:
```bash
docker compose up
# then open http://localhost:8080
```
## Requirements
- A modern web browser with JavaScript enabled (Firefox, Chrome/Chromium, Safari, Edge)
- No internet connection required after the initial page load (the Pirata One / Inter fonts are loaded from Google Fonts)
## Roadmap
- [ ] More characters and Devil Fruits as the story continues
- [ ] Crew/faction pages
- [ ] Timeline view of arcs
## License and Credits
# License and Credits
**Author**: [Cametendo](https://www.github.com/Cametendo) **Author**: [Cametendo](https://www.github.com/Cametendo)
**License**: MIT **License**: MIT
## Note This is a fan-made project for educational and entertainment purposes. One Piece is created by Eiichiro Oda and published by Shueisha. This site is not affiliated with or endorsed by Eiichiro Oda, Shueisha, or Toei Animation.
This is just a small school project. Because of that, I don't know if I'll continue after presenting the end result
- Cametendo

41
character.html Normal file
View File

@@ -0,0 +1,41 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>Character — One Piece Wiki</title>
<meta name="description" content="Character profile: biography, stats, abilities, and Devil Fruit." />
<link rel="icon" href="data:image/svg+xml,<svg xmlns=%22http://www.w3.org/2000/svg%22 viewBox=%220 0 100 100%22><text y=%22.9em%22 font-size=%2290%22>🏴‍☠️</text></svg>" />
<link rel="stylesheet" href="css/styles.css" />
</head>
<body>
<header class="site-header">
<div class="container site-header__inner">
<a class="brand" href="index.html"><span class="brand__mark"></span> One Piece Wiki</a>
<nav class="site-nav">
<a href="index.html">Characters</a>
<a href="fruits.html">Devil Fruits</a>
</nav>
</div>
</header>
<main class="container" id="character-root">
<a class="back-link" href="index.html">← Back to Characters</a>
<div id="character-content"><div class="empty-state">Loading character…</div></div>
</main>
<footer class="site-footer">
<div class="container">
<span class="footer-warning">⚠ This wiki covers the entire One Piece story, including its most recent arcs.</span>
<p>Fan-made encyclopedia for educational and entertainment purposes only. One Piece is created by Eiichiro Oda. Not affiliated with Shueisha, Toei Animation, or Eiichiro Oda.</p>
<p>Built with HTML, CSS &amp; JavaScript by <a href="https://www.github.com/Cametendo" target="_blank" rel="noopener">Cametendo</a> · MIT License</p>
</div>
</footer>
<script src="js/characters-data.js"></script>
<script src="js/fruits-data.js"></script>
<script src="js/portraits.js"></script>
<script src="js/app.js"></script>
<script src="js/character.js"></script>
</body>
</html>

820
css/styles.css Normal file
View File

@@ -0,0 +1,820 @@
@import url('https://fonts.googleapis.com/css2?family=Pirata+One&family=Inter:wght@400;500;600;700;800&display=swap');
/* ---------- Design tokens ---------- */
:root {
color-scheme: dark;
--bg: #070f1f;
--bg-deep: #030711;
--surface: #0f1c33;
--surface-2: #142748;
--surface-border: rgba(227, 176, 75, 0.18);
--surface-border-strong: rgba(227, 176, 75, 0.4);
--text: #eef2fb;
--text-muted: #9db0d1;
--text-faint: #6b7ea3;
--gold: #e3b04b;
--gold-soft: #f2d488;
--gold-deep: #a97a1f;
--red: #c0392b;
--red-soft: #e0685a;
--parchment: #f3e6c4;
--parchment-dark: #e4d1a0;
--ink: #2c2013;
--paramecia: #a06cd5;
--zoan: #4c9a5a;
--logia: #3f9bd0;
--mythical: #e3b04b;
--radius-sm: 8px;
--radius: 14px;
--radius-lg: 22px;
--shadow: 0 12px 30px rgba(0, 0, 0, 0.35);
--shadow-sm: 0 4px 14px rgba(0, 0, 0, 0.28);
--font-display: 'Pirata One', 'Georgia', serif;
--font-body: 'Inter', -apple-system, BlinkMacSystemFont, 'Segoe UI', sans-serif;
}
* { box-sizing: border-box; }
html { scroll-behavior: smooth; }
body {
margin: 0;
font-family: var(--font-body);
color: var(--text);
line-height: 1.6;
background:
radial-gradient(ellipse 900px 500px at 15% -10%, rgba(63, 155, 208, 0.14), transparent 60%),
radial-gradient(ellipse 800px 600px at 100% 0%, rgba(227, 176, 75, 0.08), transparent 55%),
linear-gradient(180deg, var(--bg) 0%, var(--bg-deep) 100%);
background-attachment: fixed;
min-height: 100vh;
}
img { max-width: 100%; display: block; }
a { color: inherit; text-decoration: none; }
h1, h2, h3, h4 {
font-family: var(--font-display);
font-weight: 400;
letter-spacing: 0.02em;
line-height: 1.15;
margin: 0 0 0.5em;
color: var(--gold-soft);
}
h1 { font-size: clamp(2.2rem, 5vw, 3.4rem); }
h2 { font-size: clamp(1.35rem, 3vw, 1.75rem); }
h3 { font-size: 1.15rem; }
p { margin: 0 0 1em; color: var(--text-muted); }
.container {
width: min(1180px, 92%);
margin-inline: auto;
}
/* ---------- Header / nav ---------- */
.site-header {
position: sticky;
top: 0;
z-index: 50;
background: rgba(7, 15, 31, 0.85);
backdrop-filter: blur(10px);
border-bottom: 1px solid var(--surface-border);
}
.site-header__inner {
display: flex;
align-items: center;
gap: 1.5rem;
padding: 0.9rem 0;
flex-wrap: wrap;
}
.brand {
font-family: var(--font-display);
font-size: 1.5rem;
color: var(--gold-soft);
display: flex;
align-items: center;
gap: 0.5rem;
white-space: nowrap;
}
.brand__mark { font-size: 1.4rem; }
.site-nav {
display: flex;
gap: 0.35rem;
flex-wrap: wrap;
}
.site-nav a {
padding: 0.45rem 0.9rem;
border-radius: 999px;
font-weight: 600;
font-size: 0.92rem;
color: var(--text-muted);
transition: background 0.15s, color 0.15s;
}
.site-nav a:hover,
.site-nav a.is-active {
background: rgba(227, 176, 75, 0.14);
color: var(--gold-soft);
}
.site-header__search {
margin-left: auto;
min-width: 200px;
flex: 1 1 220px;
max-width: 320px;
}
/* ---------- Buttons / inputs ---------- */
.input,
.select {
width: 100%;
font: inherit;
color: var(--text);
background: var(--surface);
border: 1px solid var(--surface-border);
border-radius: var(--radius-sm);
padding: 0.6rem 0.85rem;
outline: none;
transition: border-color 0.15s, box-shadow 0.15s;
}
.input::placeholder { color: var(--text-faint); }
.input:focus,
.select:focus {
border-color: var(--gold);
box-shadow: 0 0 0 3px rgba(227, 176, 75, 0.18);
}
.checkbox {
display: inline-flex;
align-items: center;
gap: 0.5rem;
font-size: 0.9rem;
color: var(--text-muted);
white-space: nowrap;
cursor: pointer;
}
.checkbox input { accent-color: var(--gold); width: 16px; height: 16px; }
.btn {
display: inline-flex;
align-items: center;
gap: 0.4rem;
font: inherit;
font-weight: 600;
font-size: 0.9rem;
padding: 0.55rem 1rem;
border-radius: 999px;
border: 1px solid var(--surface-border-strong);
background: var(--surface-2);
color: var(--gold-soft);
cursor: pointer;
transition: transform 0.12s, background 0.15s;
}
.btn:hover { background: rgba(227, 176, 75, 0.15); }
.btn:active { transform: translateY(1px); }
/* ---------- Hero ---------- */
.hero {
position: relative;
padding: 3.5rem 0 2.5rem;
overflow: hidden;
border-bottom: 1px solid var(--surface-border);
}
.hero::before {
content: '';
position: absolute;
inset: -20% -10%;
background: radial-gradient(ellipse 600px 300px at 50% 0%, rgba(227, 176, 75, 0.12), transparent 65%);
pointer-events: none;
}
.hero__inner { position: relative; text-align: center; }
.hero__eyebrow {
display: inline-flex;
align-items: center;
gap: 0.4rem;
font-weight: 700;
font-size: 0.78rem;
letter-spacing: 0.08em;
text-transform: uppercase;
color: var(--red-soft);
background: rgba(192, 57, 43, 0.12);
border: 1px solid rgba(192, 57, 43, 0.35);
padding: 0.3rem 0.8rem;
border-radius: 999px;
margin-bottom: 1rem;
}
.hero__sub {
max-width: 620px;
margin: 0 auto 1.75rem;
font-size: 1.05rem;
}
.hero__stats {
display: flex;
justify-content: center;
gap: 1rem;
flex-wrap: wrap;
margin-bottom: 2rem;
}
.stat-pill {
background: var(--surface);
border: 1px solid var(--surface-border);
border-radius: var(--radius);
padding: 0.75rem 1.4rem;
min-width: 130px;
}
.stat-pill strong {
display: block;
font-family: var(--font-display);
font-size: 1.6rem;
color: var(--gold-soft);
}
.stat-pill span {
font-size: 0.78rem;
color: var(--text-faint);
text-transform: uppercase;
letter-spacing: 0.06em;
}
/* ---------- Filter bar ---------- */
.filter-bar {
display: flex;
gap: 0.75rem;
flex-wrap: wrap;
align-items: center;
padding: 1.5rem 0 1.25rem;
}
.filter-bar .input { max-width: 320px; }
.filter-bar .select { max-width: 220px; }
.filter-meta {
margin-left: auto;
font-size: 0.85rem;
color: var(--text-faint);
}
.chip-row {
display: flex;
gap: 0.5rem;
flex-wrap: wrap;
padding-bottom: 1.25rem;
}
.chip {
font-size: 0.82rem;
font-weight: 600;
padding: 0.4rem 0.9rem;
border-radius: 999px;
border: 1px solid var(--surface-border);
background: var(--surface);
color: var(--text-muted);
cursor: pointer;
transition: all 0.15s;
}
.chip:hover { border-color: var(--surface-border-strong); color: var(--text); }
.chip.is-active {
background: var(--gold);
border-color: var(--gold);
color: #241a05;
}
/* ---------- Grid & section shell ---------- */
.section { padding: 1rem 0 3rem; }
.section__head {
display: flex;
align-items: baseline;
justify-content: space-between;
gap: 1rem;
margin-bottom: 1.25rem;
}
.grid {
display: grid;
grid-template-columns: repeat(auto-fill, minmax(230px, 1fr));
gap: 1.25rem;
}
.empty-state {
text-align: center;
padding: 3rem 1rem;
color: var(--text-faint);
border: 1px dashed var(--surface-border-strong);
border-radius: var(--radius);
}
/* ---------- Character "wanted poster" card ---------- */
.char-card {
background: var(--parchment);
color: var(--ink);
border-radius: var(--radius);
overflow: hidden;
box-shadow: var(--shadow-sm);
border: 1px solid var(--parchment-dark);
transition: transform 0.18s ease, box-shadow 0.18s ease;
position: relative;
}
.char-card:hover {
transform: translateY(-4px);
box-shadow: var(--shadow);
}
.char-card__poster {
position: relative;
padding: 0.9rem 0.9rem 0.6rem;
text-align: center;
background:
repeating-linear-gradient(135deg, rgba(0,0,0,0.02) 0 2px, transparent 2px 6px),
linear-gradient(180deg, var(--parchment) 0%, var(--parchment-dark) 100%);
border-bottom: 2px solid var(--accent, var(--gold-deep));
}
.char-card__wanted {
display: block;
font-family: var(--font-display);
font-size: 1.4rem;
letter-spacing: 0.12em;
color: var(--ink);
margin-bottom: 0.5rem;
}
.portrait-svg {
display: block;
width: 100%;
height: 100%;
}
.char-card__avatar {
width: 84px;
height: 84px;
margin: 0 auto 0.5rem;
border-radius: 50%;
overflow: hidden;
border: 3px solid var(--ink);
box-shadow: inset 0 0 0 2px rgba(255,255,255,0.25);
}
.char-card__status {
position: absolute;
top: 0.6rem;
right: 0.6rem;
font-size: 0.62rem;
font-weight: 800;
letter-spacing: 0.06em;
text-transform: uppercase;
padding: 0.2rem 0.5rem;
border-radius: 999px;
background: var(--red);
color: #fff;
}
.char-card__body { padding: 0.9rem 1rem 1.1rem; }
.char-card__body h3 {
font-family: var(--font-body);
font-weight: 800;
font-size: 1.02rem;
color: var(--ink);
margin: 0 0 0.15rem;
}
.char-card__epithet {
font-size: 0.82rem;
font-style: italic;
color: #5b4a2f;
margin: 0 0 0.55rem;
}
.char-card__bounty {
font-weight: 800;
font-size: 0.92rem;
color: var(--gold-deep);
margin: 0 0 0.6rem;
font-variant-numeric: tabular-nums;
}
.char-card__tags {
display: flex;
flex-wrap: wrap;
gap: 0.35rem;
}
.tag {
font-size: 0.68rem;
font-weight: 700;
padding: 0.22rem 0.55rem;
border-radius: 999px;
background: rgba(44, 32, 19, 0.08);
color: #4a3a22;
border: 1px solid rgba(44, 32, 19, 0.15);
white-space: nowrap;
}
.tag--fruit {
background: rgba(160, 108, 213, 0.15);
color: #5b3286;
border-color: rgba(160, 108, 213, 0.3);
}
/* ---------- Devil fruit card ---------- */
.fruit-card {
background: var(--surface);
border: 1px solid var(--surface-border);
border-radius: var(--radius);
overflow: hidden;
transition: transform 0.18s ease, border-color 0.18s ease, box-shadow 0.18s ease;
border-top: 3px solid var(--cat-color, var(--gold));
}
.fruit-card:hover {
transform: translateY(-4px);
border-color: var(--surface-border-strong);
box-shadow: var(--shadow-sm);
}
.fruit-card__inner { padding: 1.1rem 1.15rem; }
.fruit-card__icon {
width: 56px;
height: 56px;
border-radius: 50%;
overflow: hidden;
margin-bottom: 0.7rem;
box-shadow: 0 0 0 1px var(--surface-border);
}
.fruit-card__inner h3 {
color: var(--text);
font-family: var(--font-body);
font-weight: 800;
font-size: 1rem;
margin-bottom: 0.2rem;
}
.fruit-card__type {
display: inline-block;
font-size: 0.7rem;
font-weight: 800;
letter-spacing: 0.05em;
text-transform: uppercase;
color: var(--cat-color, var(--gold));
margin-bottom: 0.55rem;
}
.fruit-card__tagline {
font-size: 0.86rem;
margin-bottom: 0.6rem;
}
.fruit-card__user {
font-size: 0.78rem;
color: var(--text-faint);
border-top: 1px solid var(--surface-border);
padding-top: 0.55rem;
margin: 0;
}
.fruit-card__user strong { color: var(--text-muted); }
[data-cat="Paramecia"] { --cat-color: var(--paramecia); }
[data-cat="Zoan"] { --cat-color: var(--zoan); }
[data-cat="Logia"] { --cat-color: var(--logia); }
/* ---------- Detail pages ---------- */
.back-link {
display: inline-flex;
align-items: center;
gap: 0.4rem;
font-size: 0.88rem;
font-weight: 600;
color: var(--text-faint);
margin: 1.5rem 0 1.25rem;
transition: color 0.15s;
}
.back-link:hover { color: var(--gold-soft); }
.profile-header {
display: flex;
gap: 1.5rem;
align-items: center;
padding: 1.75rem;
background: linear-gradient(135deg, var(--surface) 0%, var(--surface-2) 100%);
border: 1px solid var(--surface-border);
border-radius: var(--radius-lg);
margin-bottom: 1.75rem;
flex-wrap: wrap;
}
.profile-avatar {
width: 110px;
height: 110px;
flex-shrink: 0;
border-radius: 50%;
overflow: hidden;
border: 4px solid var(--bg);
box-shadow: 0 0 0 3px var(--accent, var(--gold)), var(--shadow-sm);
}
.profile-eyebrow {
font-size: 0.8rem;
font-weight: 700;
letter-spacing: 0.04em;
text-transform: uppercase;
color: var(--accent, var(--gold));
margin-bottom: 0.35rem;
}
.profile-header h1 { margin-bottom: 0.15rem; }
.profile-epithet {
font-style: italic;
color: var(--text-muted);
margin-bottom: 0.75rem;
}
.profile-badges {
display: flex;
gap: 0.5rem;
flex-wrap: wrap;
}
.badge {
font-size: 0.78rem;
font-weight: 700;
padding: 0.3rem 0.75rem;
border-radius: 999px;
background: var(--surface);
border: 1px solid var(--surface-border-strong);
color: var(--text-muted);
}
.badge--alive { color: #7fd996; border-color: rgba(127, 217, 150, 0.4); }
.badge--deceased { color: var(--red-soft); border-color: rgba(224, 104, 90, 0.4); }
.badge--unknown { color: var(--text-faint); }
.badge--bounty { color: var(--gold-soft); border-color: var(--surface-border-strong); }
.profile-layout {
display: grid;
grid-template-columns: minmax(0, 2fr) minmax(240px, 1fr);
gap: 1.5rem;
align-items: start;
}
.card {
background: var(--surface);
border: 1px solid var(--surface-border);
border-radius: var(--radius);
padding: 1.4rem 1.5rem;
margin-bottom: 1.5rem;
}
.card:last-child { margin-bottom: 0; }
.card h2 {
font-size: 1.15rem;
margin-bottom: 0.75rem;
padding-bottom: 0.6rem;
border-bottom: 1px solid var(--surface-border);
}
.card p:last-child { margin-bottom: 0; }
.fruit-callout {
display: flex;
gap: 1rem;
align-items: center;
padding: 1.1rem 1.25rem;
border-radius: var(--radius);
background: linear-gradient(135deg, rgba(227, 176, 75, 0.12), rgba(227, 176, 75, 0.03));
border: 1px solid var(--surface-border-strong);
margin-bottom: 1.5rem;
transition: border-color 0.15s, transform 0.15s;
}
.fruit-callout:hover { transform: translateX(2px); border-color: var(--gold); }
.fruit-callout__icon {
width: 68px;
height: 68px;
flex-shrink: 0;
border-radius: 50%;
overflow: hidden;
box-shadow: 0 0 0 1px var(--surface-border-strong);
}
.fruit-callout__label {
font-size: 0.72rem;
font-weight: 800;
text-transform: uppercase;
letter-spacing: 0.06em;
color: var(--text-faint);
margin-bottom: 0.2rem;
}
.fruit-callout h3 { margin: 0 0 0.2rem; color: var(--gold-soft); }
.fruit-callout p { margin: 0; font-size: 0.86rem; }
.ability-list, .power-list {
list-style: none;
margin: 0;
padding: 0;
display: grid;
gap: 0.55rem;
}
.ability-list li, .power-list li {
position: relative;
padding-left: 1.4rem;
color: var(--text-muted);
font-size: 0.94rem;
}
.ability-list li::before, .power-list li::before {
content: '▸';
position: absolute;
left: 0;
color: var(--gold);
font-size: 0.95rem;
}
.power-list li::before { content: '✦'; font-size: 0.8rem; }
.stat-list {
margin: 0;
display: grid;
gap: 0.7rem;
}
.stat-list div {
display: flex;
justify-content: space-between;
gap: 0.75rem;
font-size: 0.88rem;
padding-bottom: 0.6rem;
border-bottom: 1px dashed var(--surface-border);
}
.stat-list div:last-child { border-bottom: none; padding-bottom: 0; }
.stat-list dt { color: var(--text-faint); }
.stat-list dd { margin: 0; text-align: right; font-weight: 600; color: var(--text); }
.prose p { white-space: pre-line; }
.user-list {
display: grid;
gap: 0.75rem;
}
.user-chip {
display: flex;
align-items: center;
gap: 0.75rem;
padding: 0.65rem 0.85rem;
border-radius: var(--radius-sm);
background: var(--surface-2);
border: 1px solid var(--surface-border);
transition: border-color 0.15s, transform 0.15s;
}
.user-chip:hover { border-color: var(--gold); transform: translateX(3px); }
.user-chip__avatar {
width: 38px;
height: 38px;
border-radius: 50%;
overflow: hidden;
flex-shrink: 0;
}
.user-chip__name { font-weight: 700; font-size: 0.92rem; color: var(--text); }
.user-chip__status { font-size: 0.78rem; color: var(--text-faint); }
.fruit-detail-header {
display: flex;
gap: 1.5rem;
align-items: center;
padding: 1.75rem;
border-radius: var(--radius-lg);
border: 1px solid var(--surface-border);
margin-bottom: 1.75rem;
background: linear-gradient(135deg, var(--surface) 0%, var(--surface-2) 100%);
border-top: 4px solid var(--cat-color, var(--gold));
flex-wrap: wrap;
}
.fruit-detail-header__icon {
width: 100px;
height: 100px;
flex-shrink: 0;
border-radius: 50%;
overflow: hidden;
box-shadow: 0 0 0 3px var(--cat-color, var(--gold)), var(--shadow-sm);
}
.fruit-detail-header h1 { margin-bottom: 0.2rem; }
.fruit-meaning {
font-size: 0.88rem;
color: var(--text-faint);
margin-bottom: 0.6rem;
}
/* ---------- Footer ---------- */
.site-footer {
border-top: 1px solid var(--surface-border);
padding: 2.5rem 0;
margin-top: 3rem;
text-align: center;
color: var(--text-faint);
font-size: 0.85rem;
}
.site-footer strong { color: var(--text-muted); }
.site-footer a { color: var(--gold-soft); font-weight: 600; }
.site-footer a:hover { text-decoration: underline; }
.footer-warning {
display: inline-block;
margin-bottom: 1rem;
padding: 0.5rem 1rem;
border-radius: var(--radius-sm);
background: rgba(192, 57, 43, 0.1);
border: 1px solid rgba(192, 57, 43, 0.3);
color: var(--red-soft);
font-weight: 600;
font-size: 0.82rem;
}
/* ---------- Responsive ---------- */
@media (max-width: 760px) {
.profile-layout { grid-template-columns: 1fr; }
.site-header__inner { gap: 0.75rem; }
.site-header__search { order: 3; max-width: none; flex-basis: 100%; }
.profile-header { padding: 1.25rem; }
.fruit-detail-header { padding: 1.25rem; }
.filter-meta { margin-left: 0; width: 100%; }
}
/* ---------- Proper wiki images ---------- */
.proper-image {
position: relative;
display: block;
width: 100%;
height: 100%;
background: #0b1220;
}
.proper-image__fallback,
.proper-image__img {
position: absolute;
inset: 0;
width: 100%;
height: 100%;
}
.proper-image__img {
object-fit: cover;
object-position: top center;
z-index: 1;
}
.proper-image--fruit .proper-image__img {
object-fit: cover;
object-position: center;
padding: 0;
background: #0b1220;
}
.proper-image.is-loaded .proper-image__fallback { opacity: 0; }

View File

@@ -3,7 +3,7 @@ services:
image: nginx:alpine image: nginx:alpine
container_name: devil-fruit-encyclopedia container_name: devil-fruit-encyclopedia
restart: unless-stopped restart: unless-stopped
expose: ports:
- "80" - "8080:80"
volumes: volumes:
- ./data:/usr/share/nginx/html:ro - .:/usr/share/nginx/html:ro

41
fruit.html Normal file
View File

@@ -0,0 +1,41 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>Devil Fruit — One Piece Wiki</title>
<meta name="description" content="Devil Fruit history, powers, strengths, weaknesses, and every user who ever held it." />
<link rel="icon" href="data:image/svg+xml,<svg xmlns=%22http://www.w3.org/2000/svg%22 viewBox=%220 0 100 100%22><text y=%22.9em%22 font-size=%2290%22>🏴‍☠️</text></svg>" />
<link rel="stylesheet" href="css/styles.css" />
</head>
<body>
<header class="site-header">
<div class="container site-header__inner">
<a class="brand" href="index.html"><span class="brand__mark"></span> One Piece Wiki</a>
<nav class="site-nav">
<a href="index.html">Characters</a>
<a href="fruits.html">Devil Fruits</a>
</nav>
</div>
</header>
<main class="container" id="fruit-root">
<a class="back-link" href="fruits.html">← Back to Devil Fruits</a>
<div id="fruit-content"><div class="empty-state">Loading Devil Fruit…</div></div>
</main>
<footer class="site-footer">
<div class="container">
<span class="footer-warning">⚠ This wiki covers the entire One Piece story, including its most recent arcs.</span>
<p>Fan-made encyclopedia for educational and entertainment purposes only. One Piece is created by Eiichiro Oda. Not affiliated with Shueisha, Toei Animation, or Eiichiro Oda.</p>
<p>Built with HTML, CSS &amp; JavaScript by <a href="https://www.github.com/Cametendo" target="_blank" rel="noopener">Cametendo</a> · MIT License</p>
</div>
</footer>
<script src="js/characters-data.js"></script>
<script src="js/fruits-data.js"></script>
<script src="js/portraits.js"></script>
<script src="js/app.js"></script>
<script src="js/fruit.js"></script>
</body>
</html>

67
fruits.html Normal file
View File

@@ -0,0 +1,67 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>Devil Fruit Encyclopedia — One Piece Wiki</title>
<meta name="description" content="Every Devil Fruit's history, powers, strengths, weaknesses, and full user lineage — Paramecia, Zoan, and Logia." />
<link rel="icon" href="data:image/svg+xml,<svg xmlns=%22http://www.w3.org/2000/svg%22 viewBox=%220 0 100 100%22><text y=%22.9em%22 font-size=%2290%22>🏴‍☠️</text></svg>" />
<link rel="stylesheet" href="css/styles.css" />
</head>
<body>
<header class="site-header">
<div class="container site-header__inner">
<a class="brand" href="index.html"><span class="brand__mark"></span> One Piece Wiki</a>
<nav class="site-nav">
<a href="index.html">Characters</a>
<a href="fruits.html">Devil Fruits</a>
</nav>
</div>
</header>
<section class="hero">
<div class="container hero__inner">
<span class="hero__eyebrow">⚠ Spoiler warning — covers the full story</span>
<h1>Devil Fruit Encyclopedia</h1>
<p class="hero__sub">
Every Devil Fruit carried by a character in this wiki — its history, its powers,
its strengths and weaknesses, and every user who ever held it.
</p>
<div class="hero__stats">
<div class="stat-pill"><strong id="stat-fruits">57</strong><span>Devil Fruits</span></div>
<div class="stat-pill"><strong id="stat-paramecia">0</strong><span>Paramecia</span></div>
<div class="stat-pill"><strong id="stat-zoan">0</strong><span>Zoan</span></div>
<div class="stat-pill"><strong id="stat-logia">0</strong><span>Logia</span></div>
</div>
</div>
</section>
<main>
<section class="container">
<div class="filter-bar">
<input type="search" id="search-input" class="input" placeholder="Search by fruit name or user…" autocomplete="off" />
<span class="filter-meta" id="result-count"></span>
</div>
<div class="chip-row" id="category-chips"></div>
</section>
<section class="section container">
<div class="grid fruit-grid" id="fruit-grid" aria-live="polite"></div>
</section>
</main>
<footer class="site-footer">
<div class="container">
<span class="footer-warning">⚠ This wiki covers the entire One Piece story, including its most recent arcs.</span>
<p>Fan-made encyclopedia for educational and entertainment purposes only. One Piece is created by Eiichiro Oda. Not affiliated with Shueisha, Toei Animation, or Eiichiro Oda.</p>
<p>Built with HTML, CSS &amp; JavaScript by <a href="https://www.github.com/Cametendo" target="_blank" rel="noopener">Cametendo</a> · MIT License</p>
</div>
</footer>
<script src="js/characters-data.js"></script>
<script src="js/fruits-data.js"></script>
<script src="js/portraits.js"></script>
<script src="js/app.js"></script>
<script src="js/fruits.js"></script>
</body>
</html>

View File

@@ -3,82 +3,68 @@
<head> <head>
<meta charset="UTF-8" /> <meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" /> <meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>Devil Fruit Encyclopedia</title> <title>One Piece Wiki — Characters &amp; Devil Fruit Encyclopedia</title>
<link rel="stylesheet" href="styles.css" /> <meta name="description" content="A fan-made encyclopedia of the 100 most well-known One Piece characters and every Devil Fruit they carry — history, powers, and prior users." />
<link rel="icon" href="data:image/svg+xml,<svg xmlns=%22http://www.w3.org/2000/svg%22 viewBox=%220 0 100 100%22><text y=%22.9em%22 font-size=%2290%22>🏴‍☠️</text></svg>" />
<link rel="stylesheet" href="css/styles.css" />
</head> </head>
<body> <body>
<header class="page-header"> <header class="site-header">
<h1>Devil Fruit Encyclopedia</h1> <div class="container site-header__inner">
<p>Quickstart UI mockup (no JavaScript yet).</p> <a class="brand" href="index.html"><span class="brand__mark"></span> One Piece Wiki</a>
<nav class="site-nav">
<a href="index.html">Characters</a>
<a href="fruits.html">Devil Fruits</a>
</nav>
</div>
</header> </header>
<main class="content"> <section class="hero">
<section class="toolbar card"> <div class="container hero__inner">
<h2>Fruit Collection</h2> <span class="hero__eyebrow">⚠ Spoiler warning — covers the full story</span>
<p> <h1>The One Piece Wiki</h1>
Later, your JS can hook into these buttons and cards for add, update, and <p class="hero__sub">
delete actions. An encyclopedia of the Grand Line's most legendary pirates, marines, and revolutionaries —
and every Devil Fruit that made them famous, from history and awakening to every user who ever held it.
</p> </p>
<div class="toolbar-actions"> <div class="hero__stats">
<button type="button">+ Add Fruit</button> <div class="stat-pill"><strong id="stat-characters">100</strong><span>Characters</span></div>
<button type="button">Update Selected</button> <div class="stat-pill"><strong id="stat-fruits">57</strong><span>Devil Fruits</span></div>
<button type="button" class="danger">Delete Selected</button> <div class="stat-pill"><strong>3</strong><span>Fruit Classes</span></div>
</div>
</div> </div>
</section> </section>
<section class="fruit-grid" aria-label="Devil fruit list preview"> <main>
<article class="fruit-card"> <section class="container">
<img <div class="filter-bar">
src="https://picsum.photos/seed/gomu/400/260" <input type="search" id="search-input" class="input" placeholder="Search by name, epithet, or affiliation…" autocomplete="off" />
alt="Placeholder image for Gomu Gomu no Mi" <select id="affiliation-select" class="select">
/> <option value="">All affiliations</option>
<div class="fruit-info"> </select>
<h3>Gomu Gomu no Mi</h3> <label class="checkbox"><input type="checkbox" id="fruit-only-checkbox" autocomplete="off" /> Devil Fruit users only</label>
<p><strong>Type:</strong> Paramecia</p> <label class="checkbox"><input type="checkbox" id="deceased-only-checkbox" autocomplete="off" /> Deceased only</label>
<p><strong>User:</strong> Monkey D. Luffy</p> <span class="filter-meta" id="result-count"></span>
<p>Makes the users body rubber-like.</p>
</div> </div>
</article> </section>
<article class="fruit-card"> <section class="section container">
<img <div class="grid character-grid" id="character-grid" aria-live="polite"></div>
src="https://picsum.photos/seed/mera/400/260"
alt="Placeholder image for Mera Mera no Mi"
/>
<div class="fruit-info">
<h3>Mera Mera no Mi</h3>
<p><strong>Type:</strong> Logia</p>
<p><strong>User:</strong> Portgas D. Ace / Sabo</p>
<p>Allows creation and control of fire.</p>
</div>
</article>
<article class="fruit-card">
<img
src="https://picsum.photos/seed/ope/400/260"
alt="Placeholder image for Ope Ope no Mi"
/>
<div class="fruit-info">
<h3>Ope Ope no Mi</h3>
<p><strong>Type:</strong> Paramecia</p>
<p><strong>User:</strong> Trafalgar D. Water Law</p>
<p>Creates a ROOM where the user can manipulate objects.</p>
</div>
</article>
<article class="fruit-card">
<img
src="https://picsum.photos/seed/yami/400/260"
alt="Placeholder image for Yami Yami no Mi"
/>
<div class="fruit-info">
<h3>Yami Yami no Mi</h3>
<p><strong>Type:</strong> Logia</p>
<p><strong>User:</strong> Marshall D. Teach</p>
<p>Manipulates darkness and gravity-like pull.</p>
</div>
</article>
</section> </section>
</main> </main>
<footer class="site-footer">
<div class="container">
<span class="footer-warning">⚠ This wiki covers the entire One Piece story, including its most recent arcs.</span>
<p>Fan-made encyclopedia for educational and entertainment purposes only. One Piece is created by Eiichiro Oda. Not affiliated with Shueisha, Toei Animation, or Eiichiro Oda.</p>
<p>Built with HTML, CSS &amp; JavaScript by <a href="https://www.github.com/Cametendo" target="_blank" rel="noopener">Cametendo</a> · MIT License</p>
</div>
</footer>
<script src="js/characters-data.js"></script>
<script src="js/fruits-data.js"></script>
<script src="js/portraits.js"></script>
<script src="js/app.js"></script>
<script src="js/main.js"></script>
</body> </body>
</html> </html>

150
js/app.js Normal file
View File

@@ -0,0 +1,150 @@
/* One Piece Wiki — shared utilities used by every page. */
const FACTION_COLORS = [
[/straw hat/i, '#e63946'],
[/whitebeard/i, '#6fb7e8'],
[/blackbeard/i, '#7a5ea8'],
[/big mom/i, '#e0559a'],
[/beast pirates/i, '#2f8f7a'],
[/kozuki|wano/i, '#b3372c'],
[/revolutionary/i, '#3fa34d'],
[/donquixote/i, '#e08a2b'],
[/roger pirates/i, '#d4af37'],
[/heart pirates/i, '#f2c230'],
[/kid pirates/i, '#b23a48'],
[/cp0|cp9|world government/i, '#8a93a6'],
[/marine/i, '#4c7fc0'],
[/warlord|cross guild/i, '#9c7a3c'],
[/germa/i, '#2f96a3'],
[/fishman|ryugu|amazon lily|kuja/i, '#2aa38f'],
];
function hashHue(str) {
let hash = 0;
for (let i = 0; i < str.length; i++) {
hash = (hash << 5) - hash + str.charCodeAt(i);
hash |= 0;
}
return Math.abs(hash) % 360;
}
function accentFor(entity) {
const key = (entity.affiliation || entity.name || '').toString();
for (const [pattern, color] of FACTION_COLORS) {
if (pattern.test(key)) return color;
}
return `hsl(${hashHue(entity.name || key)}, 58%, 48%)`;
}
function formatBounty(amount) {
if (amount === null || amount === undefined) return 'Unknown';
return '฿' + amount.toLocaleString('en-US');
}
function escapeHtml(str) {
return String(str ?? '').replace(/[&<>"']/g, (c) => ({
'&': '&amp;', '<': '&lt;', '>': '&gt;', '"': '&quot;', "'": '&#39;'
}[c]));
}
function qs(name) {
return new URLSearchParams(window.location.search).get(name);
}
function findCharacter(id) {
return CHARACTERS.find((c) => c.id === id) || null;
}
function findFruit(id) {
return FRUITS.find((f) => f.id === id) || null;
}
function characterLink(id) {
return `character.html?id=${encodeURIComponent(id)}`;
}
function fruitLink(id) {
return `fruit.html?id=${encodeURIComponent(id)}`;
}
function statusBadgeClass(status) {
if (!status) return 'badge--unknown';
if (/alive/i.test(status)) return 'badge--alive';
if (/deceased/i.test(status)) return 'badge--deceased';
return 'badge--unknown';
}
function characterPosterLabel(c) {
if (c.bounty !== null && c.bounty !== undefined) return 'WANTED';
if (/marine/i.test(c.affiliation || '')) return 'MARINE';
return (c.affiliation || c.role || 'UNKNOWN').split(/[/(]/)[0].trim().toUpperCase();
}
function characterBountyOrRank(c) {
return c.bounty !== null && c.bounty !== undefined ? formatBounty(c.bounty) : c.role || 'Rank unknown';
}
function characterCardHTML(c) {
const accent = accentFor(c);
const deadRibbon = /deceased/i.test(c.status || '') ? '<span class="char-card__status">Deceased</span>' : '';
const fruitTag = c.devilFruit ? '<span class="tag tag--fruit">Devil Fruit</span>' : '';
return `
<article class="char-card" style="--accent:${accent}">
<a href="${characterLink(c.id)}" aria-label="View ${escapeHtml(c.name)}">
<div class="char-card__poster">
${deadRibbon}
<span class="char-card__wanted">${escapeHtml(characterPosterLabel(c))}</span>
<div class="char-card__avatar">${characterPortraitSVG(c)}</div>
</div>
<div class="char-card__body">
<h3>${escapeHtml(c.name)}</h3>
<p class="char-card__epithet">${c.epithet ? '"' + escapeHtml(c.epithet) + '"' : ' '}</p>
<p class="char-card__bounty">${escapeHtml(characterBountyOrRank(c))}</p>
<div class="char-card__tags">
<span class="tag">${escapeHtml(c.affiliation)}</span>
${fruitTag}
</div>
</div>
</a>
</article>
`;
}
function fruitCardHTML(f) {
const owner = f.users.find((u) => /current/i.test(u.status)) || f.users[0];
const ownerChar = owner ? findCharacter(owner.id) : null;
return `
<article class="fruit-card" data-cat="${escapeHtml(f.category)}">
<a href="${fruitLink(f.id)}" aria-label="View ${escapeHtml(f.name)}">
<div class="fruit-card__inner">
<div class="fruit-card__icon">${fruitPortraitSVG(f)}</div>
<h3>${escapeHtml(f.name)}</h3>
<span class="fruit-card__type">${escapeHtml(f.category)}${f.subtype ? ' · ' + escapeHtml(f.subtype.split(' —')[0].split(' (')[0]) : ''}</span>
<p class="fruit-card__tagline">${escapeHtml(f.tagline)}</p>
<p class="fruit-card__user">${ownerChar ? `<strong>${owner.status.replace(/former|current/i, (m) => m[0].toUpperCase() + m.slice(1))}:</strong> ${escapeHtml(ownerChar.name)}` : 'No known user'}</p>
</div>
</a>
</article>
`;
}
function renderCardGrid(container, items, renderFn, emptyMessage) {
if (!items.length) {
container.innerHTML = `<div class="empty-state">${escapeHtml(emptyMessage || 'No results found.')}</div>`;
return;
}
container.innerHTML = items.map(renderFn).join('');
}
function markActiveNav() {
const page = window.location.pathname.split('/').pop() || 'index.html';
document.querySelectorAll('.site-nav a').forEach((a) => {
const href = a.getAttribute('href');
const isCharacters = page === 'index.html' && href === 'index.html';
const isFruits = (page === 'fruits.html' || page === 'fruit.html') && href === 'fruits.html';
const isCharDetail = page === 'character.html' && href === 'index.html';
if (isCharacters || isFruits || isCharDetail) a.classList.add('is-active');
});
}
document.addEventListener('DOMContentLoaded', markActiveNav);

87
js/character.js Normal file
View File

@@ -0,0 +1,87 @@
/* Character detail page: renders a full profile from ?id= against CHARACTERS/FRUITS. */
(function () {
const root = document.getElementById('character-content');
const id = qs('id');
const character = id ? findCharacter(id) : null;
if (!character) {
root.innerHTML = `
<div class="empty-state">
Character not found. <a href="index.html">Return to the character index</a>.
</div>
`;
return;
}
document.title = `${character.name} — One Piece Wiki`;
const metaDesc = document.querySelector('meta[name="description"]');
if (metaDesc) metaDesc.setAttribute('content', `${character.name}${character.epithet ? ' "' + character.epithet + '"' : ''} — profile, abilities, and Devil Fruit on the One Piece Wiki.`);
const accent = accentFor(character);
const fruit = character.devilFruit ? findFruit(character.devilFruit) : null;
const fruitRelation = fruit ? fruit.users.find((u) => u.id === character.id) : null;
const statRows = [
['Affiliation', character.affiliation],
['Role', character.role],
['Origin', character.origin],
['Age', character.age ?? 'Unknown'],
['Height', character.height || 'Unknown'],
['Birthday', character.birthday || 'Unknown'],
['Status', character.status || 'Unknown'],
['First Appearance', character.firstAppearance || 'Unknown'],
];
root.innerHTML = `
<section class="profile-header" style="--accent:${accent}">
<div class="profile-avatar">${characterPortraitSVG(character)}</div>
<div>
<p class="profile-eyebrow">${escapeHtml(character.affiliation)} · ${escapeHtml(character.role)}</p>
<h1>${escapeHtml(character.name)}</h1>
<p class="profile-epithet">${character.epithet ? '"' + escapeHtml(character.epithet) + '"' : ''}</p>
<div class="profile-badges">
<span class="badge ${statusBadgeClass(character.status)}">${escapeHtml(character.status || 'Unknown')}</span>
<span class="badge badge--bounty">${escapeHtml(characterBountyOrRank(character))}</span>
${fruit ? `<span class="badge" data-cat="${escapeHtml(fruit.category)}" style="color:var(--cat-color)">${escapeHtml(fruit.category)} User</span>` : ''}
</div>
</div>
</section>
<div class="profile-layout">
<div class="profile-main">
${fruit ? `
<a class="fruit-callout" href="${fruitLink(fruit.id)}">
<div class="fruit-callout__icon">${fruitPortraitSVG(fruit)}</div>
<div>
<p class="fruit-callout__label">${escapeHtml(fruitRelation ? fruitRelation.status : 'Devil Fruit')}</p>
<h3>${escapeHtml(fruit.name)}</h3>
<p>${escapeHtml(fruit.tagline)}</p>
</div>
</a>
` : ''}
<div class="card">
<h2>Biography</h2>
<p>${escapeHtml(character.bio)}</p>
</div>
<div class="card">
<h2>Abilities &amp; Haki</h2>
<ul class="ability-list">
${character.abilities.map((a) => `<li>${escapeHtml(a)}</li>`).join('')}
</ul>
</div>
</div>
<aside class="profile-stats card">
<h2>Profile</h2>
<dl class="stat-list">
${statRows.map(([label, value]) => `<div><dt>${escapeHtml(label)}</dt><dd>${escapeHtml(value)}</dd></div>`).join('')}
</dl>
</aside>
</div>
`;
hydrateProperImages(root);
})();

813
js/characters-data.js Normal file
View File

@@ -0,0 +1,813 @@
/* One Piece Wiki — Character dataset (100 characters).
Each entry links to a Devil Fruit page via `devilFruit` (id into FRUITS), or null if none. */
const CHARACTERS = [
{
id: 'monkey-d-luffy', name: 'Monkey D. Luffy', epithet: 'Straw Hat',
affiliation: 'Straw Hat Pirates', role: 'Captain', origin: 'Foosha Village, East Blue',
age: 19, height: '174 cm', birthday: 'May 5', bounty: 3000000000, status: 'Alive',
devilFruit: 'gomu-gomu-no-mi', firstAppearance: 'Chapter 1, "Romance Dawn"',
abilities: ['Gomu Gomu no Mi / Nika Awakening', "Conqueror's Haki", 'Armament Haki', 'Observation Haki', 'Gear 2, 3, 4 & 5'],
bio: 'The rubber-bodied captain of the Straw Hat Pirates, sailing to find the One Piece and become King of the Pirates. Raised in spirit by Shanks and Garp, Luffy leads through sheer conviction and an unbreakable loyalty to his crew. His awakening of the Gomu Gomu no Mi revealed its true identity as the mythical Human-Human Model: Nika, the "Sun God" fruit said to herald the world\'s liberation.'
},
{
id: 'roronoa-zoro', name: 'Roronoa Zoro', epithet: 'Pirate Hunter',
affiliation: 'Straw Hat Pirates', role: 'Combatant / Swordsman', origin: 'Shimotsuki Village, East Blue',
age: 21, height: '181 cm', birthday: 'November 11', bounty: 1111000000, status: 'Alive',
devilFruit: null, firstAppearance: 'Chapter 3, "Romance Dawn"',
abilities: ['Santoryu (Three-Sword Style)', 'Armament Haki (advanced, Conqueror\'s-level durability)', 'Observation Haki', 'Ittoryu techniques'],
bio: 'The Straw Hats\' swordsman, honor-bound to become the World\'s Strongest Swordsman in memory of his late friend and rival Kuina. Zoro wields three blades at once, including the legendary black sword Enma, and treats every wound taken for his captain as the cost of his own ambition. His near-fatal duel with Dracule Mihawk before the timeskip forged him into one of the crew\'s heaviest hitters.'
},
{
id: 'nami', name: 'Nami', epithet: 'Cat Burglar',
affiliation: 'Straw Hat Pirates', role: 'Navigator', origin: 'Cocoyview Village, East Blue',
age: 20, height: '170 cm', birthday: 'July 3', bounty: 366000000, status: 'Alive',
devilFruit: null, firstAppearance: 'Chapter 8, "Friends"',
abilities: ['Master navigation & weather prediction', 'Clima-Tact / Zeus (sentient cloud, formerly Big Mom\'s)', 'Thunder Lance Tempo, Weather Egg'],
bio: 'A brilliant navigator who once worked for the fishman pirate Arlong before Luffy freed her village. Nami charts the Straw Hats\' course across the Grand Line with an unmatched read of the weather, and fights with a staff powered by Zeus, a living cloud she inherited from Big Mom. Her dream is to draw a complete map of the world.'
},
{
id: 'usopp', name: 'Usopp', epithet: 'God / Sogeking',
affiliation: 'Straw Hat Pirates', role: 'Sniper', origin: 'Syrup Village, East Blue',
age: 19, height: '176 cm', birthday: 'April 1', bounty: 500000000, status: 'Alive',
devilFruit: null, firstAppearance: 'Chapter 23, "The Great Liar Usopp"',
abilities: ['Master marksmanship (Kabuto slingshot)', 'Pop Greens (plant-based ammunition)', 'Observation Haki', 'Engineering & explosives'],
bio: 'The Straw Hats\' sharpshooter and self-styled "brave warrior of the sea," son of Red-Haired Shanks\' crewmate Yasopp. Usopp grew from a compulsive liar into a genuinely courageous fighter, using invented Pop Green ammunition and precision Haki-infused shots to punch above his weight. His running feud with pride and fear has made him one of the crew\'s most human arcs.'
},
{
id: 'vinsmoke-sanji', name: 'Vinsmoke Sanji', epithet: 'Black Leg',
affiliation: 'Straw Hat Pirates', role: 'Cook', origin: 'Germa Kingdom / East Blue',
age: 21, height: '180 cm', birthday: 'March 2', bounty: 1032000000, status: 'Alive',
devilFruit: null, firstAppearance: 'Chapter 43, "Sanji, the Politeness King"',
abilities: ['Black Leg Style (kick-based combat)', 'Diable Jambe (fire kicks)', 'Armament & Observation Haki', 'Raid Suit (Germa technology)'],
bio: 'The Straw Hats\' cook and youngest son of the Vinsmoke royal family, who fled his engineered upbringing to become a chef who never uses his hands in a fight, refusing to damage the tools that feed people. His Diable Jambe technique lets him fight with fire-hardened kicks, and his genetic modifications grant him an exoskeleton and heat resistance he long tried to hide.'
},
{
id: 'tony-tony-chopper', name: 'Tony Tony Chopper', epithet: 'Cotton Candy Lover',
affiliation: 'Straw Hat Pirates', role: 'Doctor', origin: 'Drum Island',
age: 17, height: '90 cm (human form varies)', birthday: 'December 24', bounty: 1000, status: 'Alive',
devilFruit: 'hito-hito-no-mi', firstAppearance: 'Chapter 172, "Doctor"',
abilities: ['Hito Hito no Mi (multiple hybrid forms)', 'Rumble Ball (forced transformations)', 'Monster Point'],
bio: 'A reindeer who ate the Human-Human Fruit and became the Straw Hats\' doctor after training under Dr. Kureha on Drum Island. Chopper shifts between seven forms using his devil fruit and the dangerous Rumble Ball drug, culminating in the monstrous Monster Point. His bounty of a mere 1,000 berries is a running joke, set by marines who refused to believe a "tanuki" could be dangerous.'
},
{
id: 'nico-robin', name: 'Nico Robin', epithet: 'Devil Child / Demon Child',
affiliation: 'Straw Hat Pirates', role: 'Archaeologist', origin: 'Ohara, West Blue',
age: 30, height: '188 cm', birthday: 'February 6', bounty: 930000000, status: 'Alive',
devilFruit: 'hana-hana-no-mi', firstAppearance: 'Chapter 114, "Vivi\'s Chart"',
abilities: ['Hana Hana no Mi (Dorei/Gigantesco Mano fusions)', 'Archaeology & Poneglyph reading', 'Observation Haki'],
bio: 'The last survivor of the scholarly island of Ohara, hunted for decades for her ability to read Poneglyphs and her dream of uncovering the True History. Robin\'s Hana Hana no Mi lets her sprout limbs anywhere in range, and her later mastery of giant fused-limb techniques makes her one of the crew\'s most versatile fighters. She finally found a family willing to say "I want to live" with her.'
},
{
id: 'franky', name: 'Franky', epithet: 'Cyborg',
affiliation: 'Straw Hat Pirates', role: 'Shipwright', origin: 'South Blue',
age: 36, height: '240 cm', birthday: 'March 9', bounty: 394000000, status: 'Alive',
devilFruit: null, firstAppearance: 'Chapter 328, "Adventure in Water Seven"',
abilities: ['Cyborg body modifications', 'General Franky (giant battle form)', 'Coup de Vent, Radical Beam', 'Shipwright mastery (built the Thousand Sunny)'],
bio: 'The self-modified cyborg shipwright who built the Thousand Sunny, successor to the legendary Tom\'s Workers of Water 7. Franky rebuilt his own body after a near-fatal train accident and has kept upgrading it ever since, from cola-powered cannons to the giant battle-armor form General Franky. He is fiercely protective of ships as living things deserving respect.'
},
{
id: 'brook', name: 'Brook', epithet: 'Soul King',
affiliation: 'Straw Hat Pirates', role: 'Musician', origin: 'West Blue (Brook Pirates)',
age: 90, height: '277 cm', birthday: 'April 3', bounty: 383000000, status: 'Alive',
devilFruit: 'yomi-yomi-no-mi', firstAppearance: 'Chapter 442, "The Man Who Once Died"',
abilities: ['Yomi Yomi no Mi (soul manipulation)', 'Swordsmanship (Soul Solid)', 'Devil Fruit-enhanced cold resistance', 'Music'],
bio: 'A skeleton musician who died decades ago and was returned to life by the Yomi Yomi no Mi after his soul found its way back to his bones, alone for fifty years before meeting the Straw Hats. Brook combines swordsmanship with soul-freezing techniques and never fails to offer to show a lady his panties — which is moot, since he has no skin. His music keeps the memory of his old crew alive.'
},
{
id: 'jinbe', name: 'Jinbe', epithet: 'Knight of the Sea',
affiliation: 'Straw Hat Pirates', role: 'Helmsman', origin: 'Fishman Island',
age: 46, height: '301 cm', birthday: 'April 2', bounty: 1100000000, status: 'Alive',
devilFruit: null, firstAppearance: 'Chapter 528, "Whitebeard vs. Blackbeard"',
abilities: ['Fish-Man Karate', 'Water-based combat (Fishman physiology)', 'Armament & Observation Haki'],
bio: 'A former Warlord of the Sea and Sun Pirates captain who fought to protect fishman-human relations his whole life. Jinbe stood with Whitebeard at Marineford and later joined the Straw Hats as their helmsman, bringing decades of experience and Fish-Man Karate that can shatter the sea itself with a punch.'
},
{
id: 'portgas-d-ace', name: 'Portgas D. Ace', epithet: 'Fire Fist',
affiliation: 'Whitebeard Pirates (2nd Division Commander)', role: 'Commander', origin: 'South Blue (born at sea)',
age: 20, height: '185 cm', birthday: 'January 1', bounty: 550000000, status: 'Deceased',
devilFruit: 'mera-mera-no-mi', firstAppearance: 'Chapter 154, "Fire Fist Ace"',
abilities: ['Mera Mera no Mi (fire generation)', "Conqueror's Haki", 'Armament Haki', 'Hiken (Fire Fist)'],
bio: 'The son of Pirate King Gol D. Roger, raised alongside Luffy and Sabo as sworn brothers, who became Whitebeard\'s Second Division Commander. Ace wielded the Mera Mera no Mi with reckless confidence until he died at Marineford shielding Luffy from Akainu\'s magma fist, a loss that reshaped the entire war and the Straw Hats\' journey afterward.'
},
{
id: 'sabo', name: 'Sabo', epithet: 'Chief of Staff',
affiliation: 'Revolutionary Army', role: 'Chief of Staff', origin: 'Goa Kingdom, East Blue',
age: 22, height: '187 cm', birthday: 'March 20', bounty: null, status: 'Alive',
devilFruit: 'mera-mera-no-mi', firstAppearance: 'Chapter 583, "Sabo" (flashback earlier)',
abilities: ["Mera Mera no Mi (inherited)", "Conqueror's Haki", 'Armament Haki', 'Dragon Claw (martial arts)'],
bio: 'The third sworn brother of Luffy and Ace, believed dead for years after a Celestial Dragon shot down his boat, but secretly rescued and raised into the Revolutionary Army\'s Chief of Staff. Sabo inherited the Mera Mera no Mi after Ace\'s death at Marineford, and now fights for the Revolutionaries\' cause of dismantling the World Government.'
},
{
id: 'shanks', name: 'Shanks', epithet: 'Red-Haired',
affiliation: 'Red Hair Pirates', role: 'Captain / Yonko', origin: 'West Blue',
age: 41, height: '199 cm', birthday: 'March 9', bounty: 4048900000, status: 'Alive',
devilFruit: null, firstAppearance: 'Chapter 1, "Romance Dawn"',
abilities: ["Conqueror's Haki (advanced)", 'Swordsmanship', 'Advanced Armament & Observation Haki'],
bio: 'One of the Four Emperors of the sea and the man who gave young Luffy his straw hat, sacrificing an arm to a sea king to save him. Shanks\' calm, easygoing demeanor masks a swordsman powerful enough to stare down Whitebeard and end the Marineford war with a word. His true agenda remains one of the story\'s biggest mysteries.'
},
{
id: 'trafalgar-law', name: 'Trafalgar D. Water Law', epithet: 'Surgeon of Death',
affiliation: 'Heart Pirates', role: 'Captain', origin: 'Flevance, North Blue',
age: 26, height: '191 cm', birthday: 'October 6', bounty: 3000000000, status: 'Alive',
devilFruit: 'ope-ope-no-mi', firstAppearance: 'Chapter 498, "Trafalgar Law"',
abilities: ['Ope Ope no Mi (ROOM manipulation)', 'Armament, Observation & Conqueror\'s Haki', 'Nodachi swordsmanship'],
bio: 'A survivor of the deadly Amber Lead poisoning that destroyed his homeland of Flevance, saved as a child by Rosinante (Corazon), who gave his life protecting Law and the Ope Ope no Mi. Law became a Warlord, then a Yonko-rank captain, using ROOM to perform surgery-like manipulation of anything within its range — including his own trademark Shambles teleportation.'
},
{
id: 'boa-hancock', name: 'Boa Hancock', epithet: 'Pirate Empress',
affiliation: 'Kuja Pirates', role: 'Empress of Amazon Lily', origin: 'Amazon Lily',
age: 33, height: '191 cm', birthday: 'September 2', bounty: 1659000000, status: 'Alive',
devilFruit: 'mero-mero-no-mi', firstAppearance: 'Chapter 516, "Amazon Lily"',
abilities: ['Mero Mero no Mi (petrification)', "Conqueror's Haki", 'Slave Arrow, Perfume Femur'],
bio: 'The empress of the all-female island of Amazon Lily and captain of the Kuja Pirates, once a Warlord of the Sea despite carrying the scars of her enslavement as a child at the hands of the World Nobles. Her Mero Mero no Mi turns anyone infatuated with her to stone, but it is her devotion to Luffy, who treated her as a person rather than a weapon, that truly defines her arc.'
},
{
id: 'nefertari-vivi', name: 'Nefertari Vivi', epithet: 'Princess of Alabasta',
affiliation: 'Kingdom of Alabasta', role: 'Princess', origin: 'Alabasta',
age: 19, height: '165 cm', birthday: 'February 2', bounty: null, status: 'Alive',
devilFruit: null, firstAppearance: 'Chapter 92, "Vivi"',
abilities: ['Peacock Slashers (weighted chain fans)', 'Political leadership & diplomacy'],
bio: 'The princess of Alabasta who infiltrated Baroque Works undercover to save her kingdom from Crocodile\'s civil-war scheme, sailing with the Straw Hats before staying behind to rebuild her country. Though never an official crew member, her flag remains painted on the Thousand Sunny\'s sail as one of them in spirit.'
},
{
id: 'koby', name: 'Koby', epithet: 'Hero of the Marines',
affiliation: 'Marines', role: 'Captain (rising rank)', origin: 'East Blue',
age: 19, height: '166 cm', birthday: 'May 30', bounty: null, status: 'Alive',
devilFruit: null, firstAppearance: 'Chapter 1, "Romance Dawn"',
abilities: ["Armament, Observation & Conqueror's Haki", 'Marine swordsmanship & combat training'],
bio: 'Once Alvida\'s frightened cabin boy, freed by Luffy and inspired to join the Marines to fight for genuine justice. Koby trained under Garp alongside Helmeppo and awakened Conqueror\'s Haki, proving that ordinary resolve can rival the world\'s strongest fighters. His public stand for peace at Marineford earned him both admiration and enemies within the Marine hierarchy.'
},
{
id: 'bartholomew-kuma', name: 'Bartholomew Kuma', epithet: 'Tyrant',
affiliation: 'Revolutionary Army (formerly Warlord)', role: 'Former King of Sorbet Kingdom', origin: 'Sorbet Kingdom',
age: 47, height: '689 cm', birthday: 'August 2', bounty: 296000000, status: 'Alive (mechanized)',
devilFruit: 'nikyu-nikyu-no-mi', firstAppearance: 'Chapter 238, "Fake Straw Hat Crew"',
abilities: ['Nikyu Nikyu no Mi (repel anything, including pain and fatigue)', 'Immense physical strength'],
bio: 'A former Revolutionary and king who sold his own body and free will to the World Government to fund his adopted daughter Bonney\'s survival, becoming a near-mindless Pacifista-like weapon. Before losing himself, Kuma quietly used the Nikyu Nikyu no Mi to launch the Straw Hats to safety after the Battle of Marineford, scattering the crew but saving every one of their lives.'
},
{
id: 'bentham', name: 'Bentham', epithet: 'Mr. 2 Bon Clay',
affiliation: 'Baroque Works (formerly) / Revolutionary Army', role: 'Ballerina / Okama', origin: 'Unknown',
age: 25, height: '175 cm', birthday: 'July 28', bounty: 78000000, status: 'Deceased',
devilFruit: 'mane-mane-no-mi', firstAppearance: 'Chapter 101, "Mr. 2 Bon Clay"',
abilities: ['Mane Mane no Mi (face/body transformation)', 'Ballet-based martial arts (Doriki)'],
bio: 'A flamboyant former Baroque Works agent who can copy the exact face and voice of anyone he has touched. Bon Clay became one of Luffy\'s truest friends after their duel at Alubarna, later sacrificing his own life force to help the Straw Hats escape Impel Down. He died fighting for the Revolutionary Army, loyal to Luffy until the end.'
},
{
id: 'silvers-rayleigh', name: 'Silvers Rayleigh', epithet: 'Dark King',
affiliation: 'Roger Pirates (former First Mate)', role: 'Retired / Coating Mechanic', origin: 'South Blue',
age: 78, height: '198 cm', birthday: 'February 15', bounty: null, status: 'Alive',
devilFruit: null, firstAppearance: 'Chapter 500, "Rayleigh, the Dark King"',
abilities: ["Advanced Haki mastery (all three types)", 'Swordsmanship', 'Ship coating expertise'],
bio: 'The first mate of the Pirate King Gol D. Roger, one of the last living men to have sailed the entire Grand Line. Rayleigh spent two years training Luffy on Rusukaina, teaching him the fundamentals of Haki that would carry him through the New World. His calm mastery makes him one of the strongest men alive despite his age.'
},
{
id: 'monkey-d-garp', name: 'Monkey D. Garp', epithet: 'Hero of the Marines',
affiliation: 'Marines', role: 'Former Vice Admiral', origin: 'East Blue',
age: 79, height: '227 cm', birthday: 'June 29', bounty: null, status: 'Alive',
devilFruit: null, firstAppearance: 'Chapter 91, "Vice Admiral Garp"',
abilities: ["Conqueror's Haki", 'Advanced Armament Haki (Fist of Love)', 'Legendary physical strength'],
bio: 'The Marine hero who cornered Gol D. Roger without ever capturing him, and grandfather to Luffy, whom he insists on training with brutal "Fist of Love" beatings. Garp refused multiple offers to become an Admiral, preferring the front lines, and remains one of the few people the Marines, the World Government, and pirates alike all fear.'
},
{
id: 'sengoku', name: 'Sengoku', epithet: 'The Buddha',
affiliation: 'Marines', role: 'Former Fleet Admiral', origin: 'Unknown',
age: 78, height: '221 cm', birthday: 'February 15', bounty: null, status: 'Alive',
devilFruit: 'hito-hito-no-mi-model-daibutsu', firstAppearance: 'Chapter 92, "Vivi"',
abilities: ['Hito Hito no Mi Model: Daibutsu (giant golden Buddha form)', 'Shockwave palm strikes', "Armament Haki"],
bio: 'The former Fleet Admiral who led the Marines through the Golden Age of Pirates, ending Whitebeard\'s war at Marineford with the fallout of Ace and Whitebeard\'s deaths still on his conscience. His Buddha transformation grants an enormous golden form capable of leveling battlefields with air-splitting shockwave palms.'
},
{
id: 'kuzan', name: 'Kuzan', epithet: 'Aokiji',
affiliation: 'Blackbeard Pirates (formerly Marine Admiral)', role: 'Former Admiral', origin: 'Unknown',
age: 54, height: '308 cm', birthday: 'February 1', bounty: null, status: 'Alive',
devilFruit: 'hie-hie-no-mi', firstAppearance: 'Chapter 106, "Marine Admiral Aokiji"',
abilities: ['Hie Hie no Mi (Logia, ice generation)', "Advanced Haki", 'Ice Age, Ice Saber'],
bio: 'A former Marine Admiral who lost the Fleet Admiral succession duel against Akainu, a fight so destructive it reshaped an island. Disillusioned with the Marines\' brand of justice, Kuzan drifted away from the organization and eventually joined Blackbeard\'s crew, his icy Logia power capable of freezing entire seas solid.'
},
{
id: 'sakazuki', name: 'Sakazuki', epithet: 'Akainu',
affiliation: 'Marines', role: 'Fleet Admiral', origin: 'Unknown',
age: 57, height: '200 cm', birthday: 'February 5', bounty: null, status: 'Alive',
devilFruit: 'magu-magu-no-mi', firstAppearance: 'Chapter 550, "Sengoku the Buddha"',
abilities: ['Magu Magu no Mi (Logia, magma generation)', "Advanced Armament & Conqueror's Haki"],
bio: 'The uncompromising Fleet Admiral of the Marines who killed Portgas D. Ace at Marineford and embodies "absolute justice," willing to sacrifice civilians and allies alike if the mission demands it. His magma powers burn hotter than fire itself, making him arguably the single most destructive force in the Marine ranks.'
},
{
id: 'borsalino', name: 'Borsalino', epithet: 'Kizaru',
affiliation: 'Marines (later Blackbeard Pirates)', role: 'Former Admiral', origin: 'Unknown',
age: 56, height: '198 cm', birthday: 'December 8', bounty: null, status: 'Alive',
devilFruit: 'pika-pika-no-mi', firstAppearance: 'Chapter 386, "Marine Admiral Kizaru"',
abilities: ['Pika Pika no Mi (Logia, light generation/light-speed movement)', "Advanced Haki"],
bio: 'A laid-back Marine Admiral whose Pika Pika no Mi lets him move and attack at the speed of light, making him one of the fastest beings in the world despite his lazy demeanor. His loyalties shifted after the Egghead Incident, joining Blackbeard\'s crew as it grew into a new power on the seas.'
},
{
id: 'smoker', name: 'Smoker', epithet: 'White Hunter',
affiliation: 'Marines', role: 'Vice Admiral', origin: 'Loguetown, East Blue',
age: 36, height: '221 cm', birthday: 'December 14', bounty: null, status: 'Alive',
devilFruit: 'moku-moku-no-mi', firstAppearance: 'Chapter 47, "Captain Smoker of the Marines"',
abilities: ['Moku Moku no Mi (Logia, smoke generation)', 'Armament Haki', 'Jutte combat (Haki-coated)'],
bio: 'A relentless Marine officer stationed first in Loguetown and later Punk Hazard, whose smoke body has let Luffy slip through his grasp more than once. Smoker holds an unusually strict but genuine sense of justice, willing to bend the rules of his own organization when he believes it is doing wrong.'
},
{
id: 'tashigi', name: 'Tashigi', epithet: null,
affiliation: 'Marines', role: 'Captain / Rear Admiral', origin: 'Unknown',
age: 24, height: '169 cm', birthday: 'June 27', bounty: null, status: 'Alive',
devilFruit: null, firstAppearance: 'Chapter 47, "Captain Smoker of the Marines"',
abilities: ['Master swordswoman', 'Sword appraisal expertise'],
bio: 'A sword-obsessed Marine officer serving under Smoker, whose striking resemblance to the deceased pirate Kuina links her to Zoro\'s past. Tashigi\'s skill as a swordswoman and knowledge of blades make her one of the Marines\' most capable non-Haki fighters.'
},
{
id: 'issho', name: 'Issho', epithet: 'Fujitora',
affiliation: 'Marines', role: 'Admiral', origin: 'Unknown',
age: 54, height: '295 cm', birthday: 'October 22', bounty: null, status: 'Alive',
devilFruit: 'zushi-zushi-no-mi', firstAppearance: 'Chapter 725, "Fujitora"',
abilities: ['Zushi Zushi no Mi (gravity manipulation, meteor calling)', 'Blind swordsmanship', "Advanced Haki"],
bio: 'A blind Marine Admiral who fights with a sword guided purely by instinct and Haki, and openly criticizes the corruption of the Celestial Dragons and the Warlord system. Fujitora can warp gravity across an entire region, even pulling meteors from orbit, while personally holding some of the most principled ethics in the Marine hierarchy.'
},
{
id: 'vegapunk', name: 'Dr. Vegapunk', epithet: 'The Genius Scientist',
affiliation: 'World Government (formerly)', role: 'Scientist', origin: 'Unknown',
age: 79, height: 'Varies (multiple satellite bodies)', birthday: 'March 3', bounty: null, status: 'Alive (distributed across satellites)',
devilFruit: null, firstAppearance: 'Chapter 985 (mentioned earlier)',
abilities: ['Unmatched scientific genius', 'Creator of Pacifistas, Seraphim, and Devil Fruit research'],
bio: 'Widely regarded as the greatest scientific mind alive, responsible for Pacifista weapons, artificial Devil Fruits (SMILEs), Seraphim clones, and decades of the World Government\'s most advanced technology. Vegapunk split his consciousness across six satellite bodies representing different traits, and his choice to broadcast the world\'s hidden history triggered one of the story\'s largest turning points.'
},
{
id: 'hina', name: 'Hina', epithet: 'Ms. Sunday (undercover) / Handcuffs',
affiliation: 'Marines', role: 'Vice Admiral', origin: 'Unknown',
age: 40, height: '190 cm', birthday: 'April 15', bounty: null, status: 'Alive',
devilFruit: null, firstAppearance: 'Chapter 96, "Governmental Agents"',
abilities: ['Binding/capture combat techniques', 'Marine leadership'],
bio: 'A Marine officer who rose from captain to Vice Admiral, known for her binding "Log Log Fruit"-styled capture techniques that predate her later confirmed powers. Hina crossed paths with the Straw Hats in Alabasta and has remained a steady, disciplined presence within Marine ranks.'
},
{
id: 'dracule-mihawk', name: 'Dracule Mihawk', epithet: "Hawk-Eye",
affiliation: 'Cross Guild (formerly Warlord)', role: 'Swordsman', origin: 'Unknown',
age: 53, height: '198 cm', birthday: 'June 9', bounty: 3590000000, status: 'Alive',
devilFruit: null, firstAppearance: 'Chapter 49, "The Strongest Pirate Hunter"',
abilities: ['World\'s Strongest Swordsman', 'Yoru (black sword)', "Advanced Haki"],
bio: 'Recognized as the World\'s Strongest Swordsman, wielding the black blade Yoru with such precision he can slice ships in half from a distance. Mihawk mentored Zoro out of respect for his ambition, later joining Buggy and Crocodile\'s Cross Guild after the Warlord system\'s dissolution, redefining himself outside the government he once served.'
},
{
id: 'crocodile', name: 'Sir Crocodile', epithet: 'Mr. 0 / Desert Spirit',
affiliation: 'Cross Guild (formerly Warlord / Baroque Works)', role: 'Leader', origin: 'Unknown',
age: 48, height: '203 cm', birthday: 'September 5', bounty: 1965000000, status: 'Alive',
devilFruit: 'suna-suna-no-mi', firstAppearance: 'Chapter 143, "Mr. 0"',
abilities: ['Suna Suna no Mi (Logia, sand generation & dehydration)', "Advanced Haki"],
bio: 'A former Warlord who orchestrated a secret civil war in Alabasta through his criminal syndicate Baroque Works, defeated by Luffy after his Suna Suna no Mi\'s dehydrating sand nearly killed Vivi\'s kingdom. Years later, Crocodile resurfaced as a founder of the bounty-hunting Cross Guild, still every bit as ruthless.'
},
{
id: 'donquixote-doflamingo', name: 'Donquixote Doflamingo', epithet: 'Heavenly Demon',
affiliation: 'Donquixote Pirates (formerly Warlord)', role: 'Former King of Dressrosa', origin: 'Mariejois',
age: 44, height: '305 cm', birthday: 'October 5', bounty: 340000000, status: 'Alive (imprisoned)',
devilFruit: 'ito-ito-no-mi', firstAppearance: 'Chapter 234, "Mr. 0" (mentioned), Chapter 700 (full debut)',
abilities: ['Ito Ito no Mi (string manipulation, Parasite puppetry)', "Conqueror's Haki", 'Advanced Armament Haki'],
bio: 'A disgraced World Noble turned underworld broker of weapons and SMILE fruits, who ruled Dressrosa as a puppet king for a decade using his Ito Ito no Mi to literally control people as marionettes. His fall at Luffy\'s hands ended his criminal empire and exposed the government\'s use of artificial Devil Fruits, though he remains dangerous even in captivity.'
},
{
id: 'gecko-moria', name: 'Gecko Moria', epithet: null,
affiliation: 'Thriller Bark Pirates (formerly Warlord)', role: 'Captain', origin: 'Unknown',
age: 55, height: '288 cm', birthday: 'May 1', bounty: 320000000, status: 'Alive',
devilFruit: 'kage-kage-no-mi', firstAppearance: 'Chapter 442, "The Man Who Once Died"',
abilities: ['Kage Kage no Mi (shadow stealing & zombie animation)', 'Oz (giant zombie general)'],
bio: 'A former Warlord whose entire crew was wiped out by Kaido, driving him to obsessively steal shadows to build an undead zombie army on Thriller Bark. Moria\'s Kage Kage no Mi can animate anything given a stolen shadow, including the giant zombie Oz, though his defeat by Luffy shattered both his army and his pride.'
},
{
id: 'buggy', name: 'Buggy', epithet: 'The Clown',
affiliation: 'Cross Guild (formerly Buggy Pirates)', role: 'Co-leader', origin: 'Unknown',
age: 39, height: '192 cm', birthday: 'August 8', bounty: 3189000000, status: 'Alive',
devilFruit: 'bara-bara-no-mi', firstAppearance: 'Chapter 9, "Buggy the Clown"',
abilities: ['Bara Bara no Mi (body separation)', 'Buggy Ball cannon tricks', "Conqueror's Haki"],
bio: 'A former cabin boy on Gol D. Roger\'s ship who can split his body into floating pieces, immune to slashing attacks. Through a series of accidents mistaken for genius plans, Buggy stumbled into becoming a Warlord, an Emperor-adjacent power broker, and co-founder of the Cross Guild — one of the story\'s most absurd rises to power.'
},
{
id: 'marshall-d-teach', name: 'Marshall D. Teach', epithet: 'Blackbeard',
affiliation: 'Blackbeard Pirates', role: 'Captain / Yonko', origin: 'Unknown',
age: 40, height: '344 cm', birthday: 'August 3', bounty: 3996000000, status: 'Alive',
devilFruit: 'yami-yami-no-mi', firstAppearance: 'Chapter 223, "Blackbeard"',
abilities: ['Yami Yami no Mi (darkness, gravity & nullification)', 'Gura Gura no Mi (quakes, stolen second fruit)', "Conqueror's Haki"],
bio: 'The only known person able to wield two Devil Fruits at once, having murdered his own crewmate Thatch for the Yami Yami no Mi and later stolen the Gura Gura no Mi from a dying Whitebeard at Marineford. Blackbeard\'s rise from Whitebeard\'s lowest-ranked recruit to a fully-fledged Emperor of the Sea makes him one of the story\'s most dangerous wildcards.'
},
{
id: 'jesus-burgess', name: 'Jesus Burgess', epithet: 'Handyman of the Blackbeard Pirates',
affiliation: 'Blackbeard Pirates', role: 'First Mate', origin: 'Unknown',
age: 37, height: '265 cm', birthday: 'June 22', bounty: 470000000, status: 'Alive',
devilFruit: null, firstAppearance: 'Chapter 434, "Whitebeard\'s Sons"',
abilities: ['Colossal physical strength (armwrestling champion)', 'Brute-force combat'],
bio: 'The muscle-bound first mate of the Blackbeard Pirates, famed as an armwrestling champion whose raw physical strength lets him fight on par with Devil Fruit users. Burgess played a key role in the Blackbeard Pirates\' raid on Impel Down and the ambush that let his captain steal the Gura Gura no Mi.'
},
{
id: 'van-augur', name: 'Van Augur', epithet: null,
affiliation: 'Blackbeard Pirates', role: 'Sniper', origin: 'Unknown',
age: 34, height: '203 cm', birthday: 'August 9', bounty: 300000000, status: 'Alive',
devilFruit: null, firstAppearance: 'Chapter 434, "Whitebeard\'s Sons"',
abilities: ['World-class marksmanship (extreme range)', 'Rifle & pistol combat'],
bio: 'The Blackbeard Pirates\' sniper, capable of hitting targets from distances of several kilometers with unnerving precision. Van Augur\'s cold, exacting nature and near-superhuman accuracy make him one of the crew\'s most efficient killers.'
},
{
id: 'shiryu', name: 'Shiryu', epithet: 'Shiryu of the Rain',
affiliation: 'Blackbeard Pirates (formerly Impel Down warden)', role: 'Combatant', origin: 'Unknown',
age: 43, height: '288 cm', birthday: 'February 20', bounty: 700000000, status: 'Alive',
devilFruit: 'suke-suke-no-mi', firstAppearance: 'Chapter 535, "Warden Shiryu"',
abilities: ['Suke Suke no Mi (invisibility, stolen from Absalom)', 'Swordsmanship'],
bio: 'A former Impel Down warden who defected to Blackbeard\'s crew during the prison break, later killing Absalom to steal his Suke Suke no Mi. Shiryu\'s invisibility lets him strike from nowhere, making him one of the Blackbeard Pirates\' most unpredictable members.'
},
{
id: 'catarina-devon', name: 'Catarina Devon', epithet: 'Cat Viper',
affiliation: 'Blackbeard Pirates', role: 'Combatant', origin: 'Unknown',
age: 32, height: '178 cm', birthday: 'Unknown', bounty: 500000000, status: 'Alive',
devilFruit: 'neko-neko-no-mi-model-saber-tiger', firstAppearance: 'Chapter 1060 (Egghead arc)',
abilities: ['Neko Neko no Mi Model: Saber Tiger (Zoan)', 'Claw-based combat'],
bio: 'One of the Blackbeard Pirates\' newer recruits, a Zoan user who transforms into a saber-toothed tiger hybrid for close-quarters combat. Devon took part in the crew\'s assault on Egghead Island as Blackbeard moved to seize Vegapunk\'s research for himself.'
},
{
id: 'edward-newgate', name: 'Edward Newgate', epithet: 'Whitebeard',
affiliation: 'Whitebeard Pirates', role: 'Captain / Yonko', origin: 'Unknown',
age: 72, height: '666 cm', birthday: 'April 6', bounty: 5046000000, status: 'Deceased',
devilFruit: 'gura-gura-no-mi', firstAppearance: 'Chapter 234, "Mr. 0" (mentioned), Chapter 550 (full debut)',
abilities: ['Gura Gura no Mi (quake generation)', "Peak Conqueror's Haki"],
bio: 'Long considered the "World\'s Strongest Man" and captain of the most powerful pirate crew of his era, commanding absolute loyalty from a family of adopted sons rather than blood. Whitebeard died at Marineford defending his crew and Ace\'s memory, his final quake-fueled stand cracking the very structure of the world before Blackbeard finished him off and stole his fruit.'
},
{
id: 'marco', name: 'Marco', epithet: 'The Phoenix',
affiliation: 'Whitebeard Pirates (former 1st Division Commander)', role: 'Commander', origin: 'Unknown',
age: 41, height: '221 cm', birthday: 'April 5', bounty: 1374000000, status: 'Alive',
devilFruit: 'tori-tori-no-mi-model-phoenix', firstAppearance: 'Chapter 550, "Whitebeard vs. Blackbeard"',
abilities: ['Tori Tori no Mi Model: Phoenix (Mythical Zoan, regeneration & blue flame)', "Advanced Haki"],
bio: 'Whitebeard\'s most trusted commander, whose Mythical Zoan grants near-instant regeneration through blue phoenix flames. After his captain\'s death, Marco led the remaining Whitebeard Pirates into quiet retirement on their home island, only resurfacing to defend it and later to aid the Straw Hats in the war against Kaido and Big Mom.'
},
{
id: 'jozu', name: 'Jozu', epithet: 'Diamond',
affiliation: 'Whitebeard Pirates (former 3rd Division Commander)', role: 'Commander', origin: 'Unknown',
age: 44, height: '288 cm', birthday: 'March 9', bounty: 1000000000, status: 'Alive',
devilFruit: null, firstAppearance: 'Chapter 550, "Whitebeard vs. Blackbeard"',
abilities: ['Body hardening into diamond', 'Immense physical & defensive strength'],
bio: 'The Whitebeard Pirates\' Third Division Commander, capable of turning parts of his body into an unbreakable diamond state. Jozu\'s defensive power made him one of the pillars of Whitebeard\'s crew during the war at Marineford, where he was gravely wounded protecting his captain.'
},
{
id: 'vista', name: 'Vista', epithet: 'Flower Sword',
affiliation: 'Whitebeard Pirates (former 5th Division Commander)', role: 'Commander', origin: 'Unknown',
age: 55, height: '198 cm', birthday: 'October 22', bounty: 800000000, status: 'Alive',
devilFruit: null, firstAppearance: 'Chapter 551, "Portgas D. Ace, Executed"',
abilities: ['Dual-sword swordsmanship (flower-patterned slashes)', 'Advanced Armament Haki'],
bio: 'The Whitebeard Pirates\' Fifth Division Commander, a dual-wielding swordsman skilled enough to briefly match Dracule Mihawk in a duel at Marineford. Vista remains one of the old crew\'s most composed and formidable veterans.'
},
{
id: 'charlotte-linlin', name: 'Charlotte Linlin', epithet: 'Big Mom',
affiliation: 'Big Mom Pirates', role: 'Captain / Yonko', origin: 'Unknown (Sweet City / Elbaf-adjacent origins)',
age: 68, height: '880 cm', birthday: 'February 15', bounty: 4388000000, status: 'Alive',
devilFruit: 'soru-soru-no-mi', firstAppearance: 'Chapter 651, "Sanji\'s Reply"',
abilities: ['Soru Soru no Mi (soul manipulation, homies)', "Peak Conqueror's Haki", 'Napoleon & Zeus (living weapons)'],
bio: 'One of the Four Emperors, ruler of Totto Land, and matriarch of the sprawling Charlotte Family, whose devil fruit lets her rip out and consume portions of people\'s lifespans as "soul" to animate objects into living homies. Big Mom\'s hunger for family, sweets, and power drives near-constant chaos in the New World, and her fractured mind and terrifying tantrums make her one of the most volatile Emperors.'
},
{
id: 'charlotte-katakuri', name: 'Charlotte Katakuri', epithet: null,
affiliation: 'Big Mom Pirates', role: 'Sweet Commander', origin: 'Whole Cake Island',
age: 51, height: '1035 cm', birthday: 'January 3', bounty: 1057000000, status: 'Alive',
devilFruit: 'mochi-mochi-no-mi', firstAppearance: 'Chapter 869, "Sweet Commander Katakuri"',
abilities: ['Mochi Mochi no Mi (Special Paramecia, Logia-like mochi manipulation)', 'Advanced Observation Haki (future sight)', "Conqueror's Haki"],
bio: 'Big Mom\'s most powerful son and heir apparent, whose mochi-based Special Paramecia and mastery of Observation Haki let him perceive attacks moments before they happen. Katakuri\'s duel with Luffy at Whole Cake Island, fought to protect his secret mochi-stained mouth from public shame, became one of the series\' most respected rival fights.'
},
{
id: 'charlotte-smoothie', name: 'Charlotte Smoothie', epithet: null,
affiliation: 'Big Mom Pirates', role: 'Sweet Commander', origin: 'Whole Cake Island',
age: 40, height: '653 cm', birthday: 'March 3', bounty: 932000000, status: 'Alive',
devilFruit: 'shibo-shibo-no-mi', firstAppearance: 'Chapter 826, "Smoothie"',
abilities: ['Shibo Shibo no Mi (squeezing liquid out of anything, including people)', 'Perception Haki'],
bio: 'One of Big Mom\'s Sweet Commanders and the governor of Fish-Man Island under her rule, capable of wringing the fluids — and vitality — out of any living being she touches. Smoothie\'s calm, calculating presence makes her one of the family\'s most dangerous enforcers.'
},
{
id: 'charlotte-cracker', name: 'Charlotte Cracker', epithet: null,
affiliation: 'Big Mom Pirates', role: 'Sweet Commander', origin: 'Whole Cake Island',
age: 36, height: '881 cm', birthday: 'April 4', bounty: 860000000, status: 'Alive',
devilFruit: 'bisu-bisu-no-mi', firstAppearance: 'Chapter 843, "Cracker"',
abilities: ['Bisu Bisu no Mi (biscuit soldier golems)', 'Armament Haki-infused biscuit armor'],
bio: 'A Sweet Commander who fights through an endless army of biscuit soldiers animated from his own devil fruit, wearing a suit of hardened biscuit armor beneath his cloak. Cracker\'s grueling battle with Luffy on Whole Cake Island pushed the young captain to his limit through sheer attrition.'
},
{
id: 'charlotte-perospero', name: 'Charlotte Perospero', epithet: null,
affiliation: 'Big Mom Pirates', role: 'Eldest Son', origin: 'Whole Cake Island',
age: 43, height: '698 cm', birthday: 'June 3', bounty: null, status: 'Alive',
devilFruit: 'peto-peto-no-mi', firstAppearance: 'Chapter 826, "Smoothie"',
abilities: ['Peto Peto no Mi (candy creation & manipulation)', 'Candy constructs (staircases, weapons, restraints)'],
bio: 'Big Mom\'s eldest son and a key architect of Totto Land\'s political schemes, able to conjure and shape candy into staircases, chains, or weapons at will. Perospero\'s sharp mind for manipulation makes him one of his mother\'s most trusted advisors.'
},
{
id: 'charlotte-pudding', name: 'Charlotte Pudding', epithet: null,
affiliation: 'Big Mom Pirates', role: 'Princess', origin: 'Whole Cake Island',
age: 20, height: '162 cm', birthday: 'July 7', bounty: null, status: 'Alive',
devilFruit: null, firstAppearance: 'Chapter 825, "Whole Cake Island"',
abilities: ['Third Eye (memory manipulation Haki)', 'Political scheming'],
bio: 'A Charlotte princess with a rare third eye that lets her erase and manipulate memories, initially raised to despise humans for her mixed heritage. Pudding\'s planned betrayal of Sanji at their wedding gave way to a genuine change of heart, and she went on to help guide the Thousand Sunny out of Whole Cake Island.'
},
{
id: 'kaido', name: 'Kaido', epithet: "World's Strongest Creature",
affiliation: 'Beast Pirates (former Yonko)', role: 'Former Captain', origin: 'Unknown',
age: 60, height: '709 cm', birthday: 'May 1', bounty: 4611100000, status: 'Alive',
devilFruit: 'uo-uo-no-mi-model-seiryu', firstAppearance: 'Chapter 795 (mentioned), Chapter 909 (full debut)',
abilities: ['Uo Uo no Mi Model: Seiryu (Mythical Zoan, Azure Dragon)', "Peak Conqueror's Haki", 'Kanabo (iron club)'],
bio: 'A former Emperor of the sea who ruled Wano as a tyrant for decades in an unholy alliance with the shogun Orochi, using his dragon form to level cities and shrug off attacks that would kill anyone else. Repeated failed suicide attempts fed his nihilism until his defeat by Luffy at the hands of a new generation finally broke his reign.'
},
{
id: 'king', name: 'King', epithet: 'The Wildfire',
affiliation: 'Beast Pirates', role: 'All-Star', origin: 'Lulusia Kingdom',
age: 43, height: '332 cm', birthday: 'September 10', bounty: 1390000000, status: 'Alive',
devilFruit: 'ryu-ryu-no-mi-model-pteranodon', firstAppearance: 'Chapter 803 (silhouette), Chapter 932 (full debut)',
abilities: ['Ryu Ryu no Mi Model: Pteranodon (Ancient Zoan)', 'Fire-infused flight combat', "Advanced Haki"],
bio: 'Kaido\'s most trusted subordinate and the last known survivor of the Lulusia Kingdom, destroyed by the World Government to erase evidence of its Devil Fruit experiments. King\'s pteranodon Zoan grants flight and fire-boosted aerial combat, making him one of the toughest fights the Straw Hat alliance faced in Wano.'
},
{
id: 'queen', name: 'Queen', epithet: 'The Plague',
affiliation: 'Beast Pirates', role: 'All-Star', origin: 'Unknown',
age: 54, height: '478 cm', birthday: 'July 4', bounty: 1320000000, status: 'Deceased',
devilFruit: 'ryu-ryu-no-mi-model-brachiosaurus', firstAppearance: 'Chapter 803 (silhouette), Chapter 933 (full debut)',
abilities: ['Ryu Ryu no Mi Model: Brachiosaurus (artificial SMILE-derived Zoan)', 'Cyborg body modifications', 'Bio-weapon design'],
bio: 'A cyborg All-Star and the scientist behind Kaido\'s SMILE Devil Fruit and Ice Oni bioweapon programs, whose brachiosaurus Zoan gave him devastating size and reach in battle. Queen\'s deranged sense of showmanship made his final "Death or Live" bioweapon plot against Wano the crew\'s last, most desperate gambit.'
},
{
id: 'jack', name: 'Jack', epithet: 'The Drought',
affiliation: 'Beast Pirates', role: 'All-Star', origin: 'Unknown',
age: 45, height: '705 cm', birthday: 'October 2', bounty: 1000000000, status: 'Alive',
devilFruit: 'zou-zou-no-mi-model-mammoth', firstAppearance: 'Chapter 795 (mentioned), Chapter 819 (full debut)',
abilities: ['Zou Zou no Mi Model: Mammoth (Ancient Zoan)', 'Massive physical destructive power'],
bio: 'The captain of Kaido\'s flagship Numancia and commander of the assault on Zunesha, the giant elephant that carries the island of Zou. Jack\'s mammoth transformation makes him a walking siege weapon, brutal and single-minded in service to Kaido\'s conquest.'
},
{
id: 'kozuki-oden', name: 'Kozuki Oden', epithet: null,
affiliation: 'Kozuki Family / formerly Whitebeard & Roger Pirates', role: 'Daimyo of Kuri', origin: 'Wano Country',
age: 41, height: '271 cm', birthday: 'November 21', bounty: null, status: 'Deceased',
devilFruit: null, firstAppearance: 'Chapter 909 (flashback)',
abilities: ['Oden Nitoryu (two-sword style)', "Advanced Haki"],
bio: 'The legendary daimyo of Kuri who sailed with both Whitebeard and Gol D. Roger, learning the truth of the Void Century before returning to reform Wano. Betrayed by Orochi and Kaido, Oden was executed by public boiling, a death he endured for an hour while singing to inspire his people — a sacrifice that fueled the entire Wano uprising twenty years later.'
},
{
id: 'kurozumi-orochi', name: 'Kurozumi Orochi', epithet: null,
affiliation: 'Beast Pirates / Shogunate of Wano', role: 'Former Shogun', origin: 'Wano Country',
age: 60, height: '210 cm', birthday: 'June 9', bounty: null, status: 'Deceased',
devilFruit: 'hebi-hebi-no-mi-model-yamata-no-orochi', firstAppearance: 'Chapter 909 (flashback), Chapter 931 (present)',
abilities: ['Hebi Hebi no Mi Model: Yamato no Orochi (Mythical Zoan, eight-headed serpent, multiple lives)'],
bio: 'The corrupt shogun who conspired with Kaido to seize Wano and betray the Kozuki clan, ruling through fear and starvation for two decades. His Mythical Zoan grants him eight serpent heads, each functioning as a separate life, though it was ultimately not enough to save him from the people he oppressed.'
},
{
id: 'yamato', name: 'Yamato', epithet: null,
affiliation: 'Kozuki Family (self-declared)', role: "Kaido's Child (in name)", origin: 'Wano Country',
age: 28, height: '241 cm', birthday: 'February 2', bounty: null, status: 'Alive',
devilFruit: 'inu-inu-no-mi-model-okuchi-no-makami', firstAppearance: 'Chapter 933, "O-Tama"',
abilities: ['Inu Inu no Mi Model: Okuchi no Makami (Mythical Zoan, wolf deity)', "Advanced Armament & Conqueror's Haki", 'Ice-based attacks'],
bio: "Kaido's child, who rejected that identity entirely to live as Kozuki Oden, the father figure Yamato idolized after reading his journal. Imprisoned for years for attempting to leave Wano, Yamato broke free during the raid and fought alongside the Akazaya Nine, eventually joining the Straw Hats' extended found-family as a wandering ally."
},
{
id: 'kinemon', name: "Kin'emon", epithet: 'Kin the Impermeable',
affiliation: 'Kozuki Family / Akazaya Nine', role: 'Retainer', origin: 'Wano Country',
age: 41, height: '183 cm', birthday: 'August 20', bounty: 1000000000, status: 'Alive',
devilFruit: null, firstAppearance: 'Chapter 655, "Kinemon of the Foxfire"',
abilities: ['Samurai swordsmanship', 'Clothes-based illusion technique (Impermeable)', "Advanced Haki"],
bio: 'One of the Akazaya Nine, Kozuki Oden\'s most loyal retainers, who traveled through time with his allies to reach the era of Wano\'s liberation. Kin\'emon\'s odd "Impermeable" illusion technique lets him disguise anyone\'s clothing convincingly, a quirky power that hides genuinely formidable swordsmanship.'
},
{
id: 'kanjuro', name: 'Kanjuro', epithet: 'Kan the Colorful',
affiliation: 'Beast Pirates (double agent) / formerly Akazaya Nine', role: 'Traitor', origin: 'Wano Country',
age: 45, height: '191 cm', birthday: 'October 10', bounty: null, status: 'Deceased',
devilFruit: null, firstAppearance: 'Chapter 655, "Kinemon of the Foxfire"',
abilities: ['Paint-based illusion & construct creation (calligraphy brush)'],
bio: 'A member of the Akazaya Nine who spent decades as a secret informant for Orochi and Kaido, ultimately betraying the Kozuki family at the raid\'s climax. Kanjuro\'s ink-and-paint techniques could conjure convincing illusions, which he used to devastating effect against his former allies before his death.'
},
{
id: 'monkey-d-dragon', name: 'Monkey D. Dragon', epithet: "World's Worst Criminal",
affiliation: 'Revolutionary Army', role: 'Commander-in-Chief', origin: 'East Blue',
age: 61, height: '202 cm', birthday: 'October 5', bounty: null, status: 'Alive',
devilFruit: null, firstAppearance: 'Chapter 96, "Governmental Agents"',
abilities: ['Suspected wind manipulation (unconfirmed)', 'Revolutionary leadership'],
bio: "Luffy's estranged father and leader of the Revolutionary Army, dedicated to tearing down the World Government's entire power structure. Dragon appears rarely and says even less, but his mere name is enough to unsettle Marine leadership, and mysterious wind phenomena seem to follow him wherever he goes."
},
{
id: 'emporio-ivankov', name: 'Emporio Ivankov', epithet: 'Okama Queen',
affiliation: 'Revolutionary Army', role: 'Commander (Kamabakka Kingdom)', origin: 'Unknown',
age: 42, height: '218 cm', birthday: 'August 12', bounty: null, status: 'Alive',
devilFruit: 'horu-horu-no-mi', firstAppearance: 'Chapter 543, "The Terrifying Warden"',
abilities: ['Horu Horu no Mi (hormone manipulation, gender/emotion shifts)', 'Death Wink'],
bio: 'The ruler of Kamabakka Kingdom and a top Revolutionary commander, whose hormone-based devil fruit can heal wounds, alter emotions, and change a person\'s sex at will. Ivankov broke Luffy out of Impel Down and used newkama medicine to save his life after the trauma of Ace\'s looming execution.'
},
{
id: 'inazuma', name: 'Inazuma', epithet: null,
affiliation: 'Revolutionary Army', role: 'Commander', origin: 'Unknown',
age: 44, height: '199 cm', birthday: 'December 25', bounty: null, status: 'Alive',
devilFruit: null, firstAppearance: 'Chapter 526, "The New Player Emporio Ivankov"',
abilities: ['Body-morphing weapon transformation (Devil Fruit power unconfirmed)'],
bio: 'A high-ranking Revolutionary Army commander who can reshape parts of their body into blades and tools. Inazuma served as an Impel Down officer under a false identity before revealing their true Revolutionary allegiance during the great prison break.'
},
{
id: 'rob-lucci', name: 'Rob Lucci', epithet: null,
affiliation: 'CP0 (formerly CP9)', role: 'Agent', origin: 'Unknown',
age: 41, height: '190 cm', birthday: 'October 2', bounty: 500000000, status: 'Alive',
devilFruit: 'neko-neko-no-mi-model-leopard', firstAppearance: 'Chapter 398, "Rob Lucci"',
abilities: ['Neko Neko no Mi Model: Leopard (Zoan)', 'Rokushiki (all six techniques)', "Conqueror's & Advanced Haki"],
bio: 'One of the World Government\'s deadliest assassins, a master of every Rokushiki technique whose leopard Zoan form nearly killed Luffy at Enies Lobby. Lucci\'s cold devotion to "justice" as defined by the government he serves has made him a recurring, near-unkillable threat, later resurfacing with CP0 at Egghead.'
},
{
id: 'kaku', name: 'Kaku', epithet: null,
affiliation: 'CP0 (formerly CP9)', role: 'Agent', origin: 'Unknown',
age: 41, height: '198 cm', birthday: 'August 26', bounty: null, status: 'Alive',
devilFruit: 'ushi-ushi-no-mi-model-giraffe', firstAppearance: 'Chapter 331, "Adventure in Water Seven"',
abilities: ['Ushi Ushi no Mi Model: Giraffe (Zoan)', 'Rokushiki', 'Shipwright expertise'],
bio: 'A former Galley-La shipwright secretly embedded as a CP9 spy, revealed to be a skilled Rokushiki user and giraffe Zoan fighter during the Water 7 and Enies Lobby arcs. Kaku\'s long neck and limbs in Zoan form give him an unusual but effective reach advantage in combat.'
},
{
id: 'spandam', name: 'Spandam', epithet: null,
affiliation: 'World Government (CP9 director)', role: 'Former Director', origin: 'Unknown',
age: 32, height: '178 cm', birthday: 'January 26', bounty: null, status: 'Alive',
devilFruit: null, firstAppearance: 'Chapter 343, "Iceburg\'s Past"',
abilities: ['Access to the Ancient Weapon Pluton blueprints', 'Funkfreed (living sword cane)'],
bio: 'The cowardly, cruel director of CP9 during the Water 7 and Enies Lobby arcs, who tortured Robin and burned the Merry\'s flag while claiming credit for his agents\' work. Spandam\'s humiliating defeat at Luffy\'s hands became one of the most satisfying comeuppances in the series.'
},
{
id: 'arlong', name: 'Arlong', epithet: 'Saw-Tooth',
affiliation: 'Arlong Pirates', role: 'Former Captain', origin: 'Fishman Island',
age: 39, height: '224 cm', birthday: 'January 7', bounty: 20000000, status: 'Unknown',
devilFruit: null, firstAppearance: 'Chapter 69, "Fishman Arlong"',
abilities: ['Fish-Man Karate', 'Superhuman aquatic strength', 'Saw-nose weapon'],
bio: 'A fishman supremacist who occupied Nami\'s village for years, forcing her to buy her people\'s freedom through theft, until Luffy tore his map room apart and ended his reign. Arlong\'s hatred of humans, rooted in generations of fishman discrimination, made him one of the earliest arcs to give the series real emotional stakes.'
},
{
id: 'enel', name: 'Enel', epithet: 'God',
affiliation: 'None (former ruler of Skypiea)', role: 'Self-proclaimed God', origin: 'Fairy Vearth (Birka)',
age: 39, height: '198 cm', birthday: 'July 10', bounty: 500000000, status: 'Alive (on the moon)',
devilFruit: 'goro-goro-no-mi', firstAppearance: 'Chapter 240, "Enel"',
abilities: ['Goro Goro no Mi (Logia, lightning generation)', 'Mantra (advanced Observation Haki)'],
bio: 'The self-declared "god" who ruled Skypiea through his lightning Logia and Mantra precognition before Luffy, immune to electricity as a rubber user, became the one opponent his powers couldn\'t touch. Exiled to the moon after his defeat, Enel now searches its ancient ruins for the means to build a new civilization among the stars.'
},
{
id: 'wapol', name: 'Wapol', epithet: null,
affiliation: 'Former King of Drum Kingdom', role: 'Deposed King', origin: 'Drum Island',
age: 44, height: '154 cm', birthday: 'February 27', bounty: null, status: 'Alive',
devilFruit: 'baku-baku-no-mi', firstAppearance: 'Chapter 141, "Doctor Kureha"',
abilities: ['Baku Baku no Mi (devouring & fusing objects/weapons into his body)'],
bio: 'The gluttonous, deposed king of Drum Island who can devour almost anything and fuse it into his own body, from castle gates to cannons. Wapol\'s cowardice and greed made him a lightweight villain compared to later arcs, but his defeat helped set Chopper on the path to becoming a Straw Hat.'
},
{
id: 'foxy', name: 'Foxy', epithet: 'The Silver Fox',
affiliation: 'Foxy Pirates', role: 'Captain', origin: 'Unknown',
age: 39, height: '270 cm', birthday: 'September 9', bounty: 24000000, status: 'Alive',
devilFruit: 'noro-noro-no-mi', firstAppearance: 'Chapter 302, "Davy Back Fight"',
abilities: ['Noro Noro no Mi (slow-beam projection)', 'Sleight-of-hand trickery'],
bio: 'A theatrical pirate captain who challenges rivals to the "Davy Back Fight" games rather than open combat, using his slowing beam to cheat opponents at range. Foxy\'s crew lost Robin to the Straw Hats in one such game before Luffy reclaimed her by winning fair and square.'
},
{
id: 'absalom', name: 'Absalom', epithet: null,
affiliation: 'Thriller Bark Pirates', role: 'Zombie Officer', origin: 'Unknown',
age: 42, height: '288 cm', birthday: 'April 20', bounty: null, status: 'Deceased',
devilFruit: 'suke-suke-no-mi', firstAppearance: 'Chapter 456, "Zombie"',
abilities: ['Suke Suke no Mi (invisibility)', 'Zombie physiology'],
bio: "A zombie officer of Thriller Bark who used his invisibility to spy on and harass Nico Robin, obsessed with making her his \"bride.\" Absalom was killed by his own ally Shiryu, who stole his devil fruit to join the Blackbeard Pirates during the chaos of Thriller Bark's collapse."
},
{
id: 'hogback', name: 'Hogback', epithet: null,
affiliation: 'Thriller Bark Pirates', role: 'Surgeon', origin: 'Unknown',
age: 40, height: '196 cm', birthday: 'November 10', bounty: null, status: 'Alive',
devilFruit: null, firstAppearance: 'Chapter 445, "Thriller Bark"',
abilities: ['Advanced surgical & reanimation science', 'Zombie creation (with Moria\'s shadows)'],
bio: 'A brilliant but morally bankrupt surgeon who partnered with Gecko Moria to reanimate corpses into zombies using stolen shadows. Hogback\'s guilt over the death of a young patient, Cindry, drove him to create a zombie body for her using giant animal parts, one of Thriller Bark\'s stranger tragedies.'
},
{
id: 'caesar-clown', name: 'Caesar Clown', epithet: 'Master Scientist',
affiliation: 'Formerly Doflamingo / Kaido allied', role: 'Scientist', origin: 'Unknown',
age: 39, height: '210 cm', birthday: 'June 20', bounty: 300000000, status: 'Alive',
devilFruit: 'gasu-gasu-no-mi', firstAppearance: 'Chapter 675, "Caesar Clown"',
abilities: ['Gasu Gasu no Mi (Logia, toxic gas generation)', 'Weapons & poison-gas research'],
bio: 'A former Marine scientist turned rogue weapons developer, responsible for the poison gas that devastated Punk Hazard and the children experimented on there. Caesar\'s gas Logia and total disregard for human life made him one of Law and Luffy\'s early joint targets, ending in his forced cooperation with Vegapunk.'
},
{
id: 'vergo', name: 'Vergo', epithet: null,
affiliation: 'Donquixote Pirates (double agent, formerly Marine)', role: 'Officer', origin: 'Unknown',
age: 42, height: '235 cm', birthday: 'March 20', bounty: null, status: 'Deceased',
devilFruit: null, firstAppearance: 'Chapter 677, "Monster"',
abilities: ['Extreme Armament Haki mastery', 'Bo staff combat'],
bio: 'A Marine G-5 officer secretly loyal to Doflamingo, whose mastery of Armament Haki let him harden his body to an almost impenetrable degree. Vergo\'s betrayal nearly cost Law his life on Punk Hazard before Smoker exposed and defeated him.'
},
{
id: 'diamante', name: 'Diamante', epithet: null,
affiliation: 'Donquixote Pirates', role: 'Officer (Corrida Colosseum host)', origin: 'Unknown',
age: 41, height: '361 cm', birthday: 'March 3', bounty: 340000000, status: 'Unknown',
devilFruit: 'hira-hira-no-mi', firstAppearance: 'Chapter 707, "The Man Called Diamante"',
abilities: ['Hira Hira no Mi (flattening objects/space into 2D)', 'Cloth-cloak combat'],
bio: 'A Donquixote Family officer who hosted the rigged Corrida Colosseum tournament for the Mera Mera no Mi as bait to lure and kill the winner. Diamante\'s ability to flatten anything, including doorways and people, made him a uniquely disorienting opponent for Luffy.'
},
{
id: 'trebol', name: 'Trebol', epithet: null,
affiliation: 'Donquixote Pirates', role: 'Officer', origin: 'Unknown',
age: 62, height: '201 cm', birthday: 'March 8', bounty: 200000000, status: 'Unknown',
devilFruit: 'beta-beta-no-mi', firstAppearance: 'Chapter 701, "The Fated Two"',
abilities: ['Beta Beta no Mi (sticky, corrosive mucus)'],
bio: 'One of Doflamingo\'s oldest and most trusted subordinates, coating his body in a corrosive slime that dissolves anything it touches. Trebol\'s grotesque appearance hides genuine tactical cunning, having served the Donquixote Family since Doflamingo\'s early days as a pirate.'
},
{
id: 'pica', name: 'Pica', epithet: null,
affiliation: 'Donquixote Pirates', role: 'Officer', origin: 'Unknown',
age: 38, height: '691 cm', birthday: 'August 1', bounty: 220000000, status: 'Unknown',
devilFruit: 'ishi-ishi-no-mi', firstAppearance: 'Chapter 706, "Rebellion"',
abilities: ['Ishi Ishi no Mi (merging with & controlling stone)', 'Giant statue combat form'],
bio: 'A Donquixote officer who can fuse with and animate any stone structure, turning entire mountainsides of Dressrosa into a giant fighting body. Pica\'s command over the island\'s very rock made him one of the hardest obstacles for the Straw Hat-led rebellion to overcome.'
},
{
id: 'sugar', name: 'Sugar', epithet: null,
affiliation: 'Donquixote Pirates', role: 'Officer', origin: 'Unknown',
age: 10, height: '106 cm', birthday: 'May 5', bounty: 60000000, status: 'Alive',
devilFruit: 'hoya-hoya-no-mi', firstAppearance: 'Chapter 707, "The Man Called Diamante"',
abilities: ['Hoya Hoya no Mi (turning people into obedient toys)'],
bio: 'A child prodigy in the Donquixote Family whose touch turns anyone into a living, memory-erased toy, the power behind Dressrosa\'s decade of silent suffering. Sugar\'s eventual collapse and amnesia during the rebellion reverted her victims back to human, ending the family\'s toy-slave trade.'
},
{
id: 'baby-5', name: 'Baby 5', epithet: null,
affiliation: 'Donquixote Pirates', role: 'Officer', origin: 'Unknown',
age: 27, height: '183 cm', birthday: 'May 5', bounty: null, status: 'Alive',
devilFruit: 'buki-buki-no-mi', firstAppearance: 'Chapter 700, "Corazon"',
abilities: ['Buki Buki no Mi (transforming body parts into weapons)'],
bio: 'A Donquixote Family officer able to turn any part of her body into a weapon, from guns to cannons, driven by a deep-seated need to feel "needed" by others. Baby 5\'s loyalty to the family that raised her often puts her at odds with her own better judgment.'
},
{
id: 'bartolomeo', name: 'Bartolomeo', epithet: 'Cannibal',
affiliation: 'Barto Club', role: 'Captain', origin: 'North Blue',
age: 24, height: '191 cm', birthday: 'March 24', bounty: 375000000, status: 'Alive',
devilFruit: 'bari-bari-no-mi', firstAppearance: 'Chapter 700, "Corazon"',
abilities: ['Bari Bari no Mi (unbreakable barrier generation)'],
bio: 'An obsessive Straw Hat fanboy whose Bari Bari no Mi lets him conjure barriers strong enough to block even the fiercest attacks unscathed. Bartolomeo\'s brash, foul-mouthed demeanor hides a genuinely useful ally, having fought for Luffy\'s side at both the Corrida Colosseum and beyond.'
},
{
id: 'cavendish', name: 'Cavendish', epithet: 'The White Horse Prince/Hakuba',
affiliation: 'Beautiful Pirates', role: 'Captain', origin: 'Unknown',
age: 25, height: '191 cm', birthday: 'August 24', bounty: 330000000, status: 'Alive',
devilFruit: null, firstAppearance: 'Chapter 701, "The Fated Two"',
abilities: ['Swordsmanship (Durandal)', 'Alternate murderous persona "Hakuba"'],
bio: 'A vain, self-obsessed swordsman captain who blacks out during real combat, letting a ruthless alternate persona named Hakuba take over and slaughter his enemies. Cavendish\'s vanity is matched only by his genuine skill with his talking sword Durandal.'
},
{
id: 'x-drake', name: 'X Drake', epithet: 'Red Flag',
affiliation: 'Marines (undercover, formerly pirate)', role: 'Rear Admiral', origin: 'North Blue',
age: 33, height: '292 cm', birthday: 'October 24', bounty: 222000000, status: 'Alive',
devilFruit: 'ryu-ryu-no-mi-model-allosaurus', firstAppearance: 'Chapter 498, "Trafalgar Law"',
abilities: ['Ryu Ryu no Mi Model: Allosaurus (Ancient Zoan)', 'Marine intelligence tactics'],
bio: 'A former Marine Vice Admiral who staged his own defection to become a Worst Generation pirate as an undercover intelligence operation, later revealed during the Wano campaign. Drake\'s dinosaur Zoan gives him primal strength that belies his careful, strategic mind.'
},
{
id: 'basil-hawkins', name: 'Basil Hawkins', epithet: 'Magician',
affiliation: 'Kid Pirates (formerly captain of Hawkins Pirates)', role: 'Officer', origin: 'North Blue',
age: 32, height: '210 cm', birthday: 'January 14', bounty: 320000000, status: 'Alive',
devilFruit: 'wara-wara-no-mi', firstAppearance: 'Chapter 498, "Trafalgar Law"',
abilities: ['Wara Wara no Mi (straw-doll damage transfer)', 'Tarot-card fortune telling'],
bio: 'A stoic fortune-teller whose devil fruit transfers damage from his body into straw effigies, making him extraordinarily difficult to kill outright. Hawkins reads the odds of every battle through tarot before committing, and later merged his crew into Eustass Kid\'s alliance during the war against Kaido.'
},
{
id: 'capone-bege', name: 'Capone "Gang" Bege', epithet: null,
affiliation: 'Fire Tank Pirates', role: 'Captain', origin: 'West Blue',
age: 42, height: '344 cm', birthday: 'October 10', bounty: 350000000, status: 'Alive',
devilFruit: 'shiro-shiro-no-mi', firstAppearance: 'Chapter 90, "Vivi" (cameo), Chapter 902 (full role)',
abilities: ['Shiro Shiro no Mi (transforming into a mobile fortress)', 'Mafia-style tactics & firearms'],
bio: 'A mafia-boss pirate captain who can turn his own body into a walking fortress capable of housing his entire crew inside it. Bege played a double game during the Whole Cake Island arc, secretly plotting to assassinate Big Mom alongside the Straw Hats.'
},
{
id: 'urouge', name: 'Urouge', epithet: 'Mad Monk',
affiliation: 'Fallen Monk Pirates', role: 'Captain', origin: 'North Blue',
age: 26, height: '230 cm', birthday: 'April 9', bounty: 108000000, status: 'Alive',
devilFruit: null, firstAppearance: 'Chapter 498, "Trafalgar Law"',
abilities: ['Self-destructive/regenerative "berserker" combat style'],
bio: 'A hulking monk-pirate whose fighting style channels self-inflicted damage into explosive bursts of strength. One of the "Worst Generation" captains who rose to prominence at Sabaody Archipelago alongside Luffy and Law.'
},
{
id: 'scratchmen-apoo', name: 'Scratchmen Apoo', epithet: null,
affiliation: 'On Air Pirates (later Blackbeard-aligned)', role: 'Captain', origin: 'South Blue',
age: 34, height: '298 cm', birthday: 'June 27', bounty: 350000000, status: 'Alive',
devilFruit: null, firstAppearance: 'Chapter 498, "Trafalgar Law"',
abilities: ['Sound-based long-range combat (body as instrument)'],
bio: 'A "Worst Generation" pirate whose body doubles as a musical weapon, launching sound-based attacks at range. Apoo betrayed his old ally Kid during the raid on Onigashima, aligning himself with Kaido and later Blackbeard\'s growing power base.'
},
{
id: 'eustass-kid', name: 'Eustass Kid', epithet: 'Captain',
affiliation: 'Kid Pirates', role: 'Captain / Yonko-rank', origin: 'South Blue',
age: 23, height: '205 cm', birthday: 'January 10', bounty: 3000000000, status: 'Alive',
devilFruit: 'jiki-jiki-no-mi', firstAppearance: 'Chapter 498, "Trafalgar Law"',
abilities: ['Jiki Jiki no Mi (magnetism manipulation)', "Conqueror's Haki", 'Armament Haki'],
bio: 'One of the "Worst Generation" and later a Yonko-rank captain, whose magnetic powers let him assemble massive scrap-metal weapons and giant armored fists. Kid\'s brutal, take-no-prisoners approach to piracy made him a natural rival to Luffy, culminating in their uneasy alliance against Kaido and Big Mom.'
},
{
id: 'killer', name: 'Killer', epithet: 'Massacre Soldier',
affiliation: 'Kid Pirates', role: 'First Mate', origin: 'South Blue',
age: 25, height: '204 cm', birthday: 'January 20', bounty: 1000000000, status: 'Alive',
devilFruit: null, firstAppearance: 'Chapter 498, "Trafalgar Law"',
abilities: ['Dual scythe-blade combat (Punk Gibson)', 'High-speed footwork', "Advanced Haki"],
bio: "Eustass Kid's loyal first mate, fighting with twin roller-bladed scythes at blinding speed. Killer's unwavering devotion to his captain has carried him through some of the bloodiest fights of the New World, including the war on Onigashima."
},
{
id: 'gol-d-roger', name: 'Gol D. Roger', epithet: 'Pirate King',
affiliation: 'Roger Pirates', role: 'Captain', origin: 'Loguetown, East Blue',
age: 53, height: '198 cm', birthday: 'December 31', bounty: 5564800000, status: 'Deceased',
devilFruit: null, firstAppearance: 'Chapter 1, "Romance Dawn" (mentioned)',
abilities: ["Peak Conqueror's Haki", 'Legendary swordsmanship', 'First to conquer the Grand Line'],
bio: 'The only pirate to ever reach Laugh Tale and claim the title of Pirate King, whose public execution and final words about the One Piece ignited the Great Age of Pirates. Roger died of an incurable illness rather than in battle, leaving behind a legacy — and a son, Ace — that still shapes the entire world decades later.'
},
{
id: 'bellamy', name: 'Bellamy', epithet: 'Hyena',
affiliation: 'Donquixote Pirates (formerly Bellamy Pirates)', role: 'Subordinate', origin: 'Unknown',
age: 26, height: '198 cm', birthday: 'April 1', bounty: 55000000, status: 'Alive',
devilFruit: 'nobu-nobu-no-mi', firstAppearance: 'Chapter 296, "The Man Called Bellamy the Hyena"',
abilities: ['Nobu Nobu no Mi (spring-loaded limbs)'],
bio: 'A brash pirate who once mocked Luffy\'s dream of finding the "make-believe" One Piece before being humiliated in a one-sided beatdown. Bellamy later resurfaced as one of Doflamingo\'s subordinates, given a second chance to prove his worth after his old crew\'s downfall.'
},
{
id: 'magellan', name: 'Magellan', epithet: null,
affiliation: 'Impel Down (Chief Warden)', role: 'Chief Warden', origin: 'Unknown',
age: 40, height: '666 cm', birthday: 'August 24', bounty: null, status: 'Alive',
devilFruit: 'doku-doku-no-mi', firstAppearance: 'Chapter 528, "The Great Jailbreak"',
abilities: ['Doku Doku no Mi (Logia, poison generation)'],
bio: 'The feared chief warden of Impel Down, whose poison Logia is potent enough to dissolve nearly anything it touches, including his own digestive system. Magellan\'s brutal efficiency made the great prison break one of the most dangerous operations any of its participants ever attempted.'
},
{
id: 'shirahoshi', name: 'Shirahoshi', epithet: 'Mermaid Princess',
affiliation: 'Ryugu Kingdom', role: 'Princess', origin: 'Fishman Island',
age: 17, height: '1000 cm', birthday: 'August 8', bounty: null, status: 'Alive',
devilFruit: null, firstAppearance: 'Chapter 609, "Sea Monster Street"',
abilities: ['Ability to summon and command Sea Kings'],
bio: 'The mermaid princess of Fishman Island, sole daughter of King Neptune, whose innate ability to call Sea Kings makes her one of the most strategically important people in the world. Long confined out of fear for her safety, Shirahoshi found genuine confidence through her friendship with the Straw Hats.'
},
{
id: 'carrot', name: 'Carrot', epithet: null,
affiliation: 'Mink Tribe / Straw Hat Grand Fleet', role: 'Guardian of Zou', origin: 'Zou',
age: 19, height: '150 cm', birthday: 'June 22', bounty: null, status: 'Alive',
devilFruit: null, firstAppearance: 'Chapter 803, "Mokomo Dukedom"',
abilities: ['Sulong transformation (full-moon Mink power boost)', 'Electro (learned from Nami)'],
bio: 'An energetic Mink rabbit-warrior from Zou who joined the Straw Hats\' journey through Wano, capable of the rare Sulong form that grants Minks moonlight-fueled power. Carrot\'s enthusiasm and combat skill made her a valuable, if temporary, addition to the crew\'s allies.'
},
{
id: 'pekoms', name: 'Pekoms', epithet: null,
affiliation: 'Big Mom Pirates / Mink Tribe', role: 'Officer', origin: 'Zou',
age: 33, height: '235 cm', birthday: 'February 25', bounty: 330000000, status: 'Alive',
devilFruit: null, firstAppearance: 'Chapter 651, "Sanji\'s Reply"',
abilities: ['Mink physical combat (lion-type)', 'Sulong transformation'],
bio: 'A lion Mink serving as one of Big Mom\'s enforcers, tasked with delivering Sanji\'s marriage summons to the Straw Hats. Pekoms\' loyalty to Big Mom is genuine, even as he quietly respects the crew he was sent to threaten.'
},
{
id: 'vander-decken-ix', name: 'Vander Decken IX', epithet: null,
affiliation: 'Flying Dutchman Pirates', role: 'Captain', origin: 'Unknown',
age: 41, height: '355 cm', birthday: 'March 9', bounty: 220000000, status: 'Alive',
devilFruit: 'mato-mato-no-mi', firstAppearance: 'Chapter 619, "The Ruler of Fishman Island"',
abilities: ['Mato Mato no Mi (curse-marked long-range projectile targeting)'],
bio: 'A pirate captain who has spent a decade obsessively "courting" Princess Shirahoshi from afar, hurling cursed objects that track any target he has ever marked, no matter the distance. Decken\'s single-minded obsession made him a recurring menace to Fishman Island\'s royal family.'
},
{
id: 'rosinante', name: 'Rosinante', epithet: 'Corazon',
affiliation: 'Donquixote Pirates (secretly Marine intelligence)', role: 'Undercover Agent', origin: 'Mariejois',
age: null, height: '398 cm', birthday: 'December 26', bounty: 5000000, status: 'Deceased',
devilFruit: 'nagi-nagi-no-mi', firstAppearance: 'Chapter 699, "Corazon"',
abilities: ['Nagi Nagi no Mi (silence field generation)', 'Marine intelligence tradecraft'],
bio: 'Doflamingo\'s younger brother, secretly a Marine intelligence agent who infiltrated the Donquixote Family to gather evidence against them. Corazon rescued the dying Trafalgar Law from the Amber Lead disease and gave his life protecting the boy and the Ope Ope no Mi from his own brother.'
},
{
id: 'vinsmoke-judge', name: 'Vinsmoke Judge', epithet: null,
affiliation: 'Germa Kingdom', role: 'King', origin: 'Germa Kingdom',
age: 61, height: '200 cm', birthday: 'February 10', bounty: null, status: 'Alive',
devilFruit: null, firstAppearance: 'Chapter 838, "Vinsmoke Judge"',
abilities: ['Genetic engineering (Germa 66 super-soldiers)', 'Military command'],
bio: 'The militaristic king of the Germa Kingdom and Sanji\'s father, who genetically modified his children into super-soldiers, cutting Sanji out of the process for showing too much heart. Judge\'s alliance-driven ambitions repeatedly put him at odds with the son who rejected everything he stood for.'
},
{
id: 'vinsmoke-reiju', name: 'Vinsmoke Reiju', epithet: 'Poison Pink',
affiliation: 'Germa Kingdom', role: 'Princess', origin: 'Germa Kingdom',
age: 23, height: '167 cm', birthday: 'July 27', bounty: null, status: 'Alive',
devilFruit: null, firstAppearance: 'Chapter 838, "Vinsmoke Judge"',
abilities: ['Poison generation & immunity (genetic modification)', 'Raid Suit combat'],
bio: 'Sanji\'s older sister, whose genetic modifications let her generate and resist poison at will. Reiju was the only Vinsmoke sibling to show Sanji kindness growing up, and she risked her father\'s wrath to help him escape his arranged marriage on Whole Cake Island.'
},
{
id: 'stussy', name: 'Stussy', epithet: null,
affiliation: 'CP0 / Vegapunk laboratory', role: 'Agent', origin: 'Unknown (clone)',
age: null, height: '178 cm', birthday: 'Unknown', bounty: null, status: 'Alive',
devilFruit: null, firstAppearance: 'Chapter 906 (cameo), Chapter 1057 (full role)',
abilities: ['CP0 combat & espionage training', 'Multiple identical bodies (clone network)'],
bio: 'A CP0 agent revealed during the Egghead Incident to be one of many identical clone bodies connected to Vegapunk\'s research, blurring the line between assassin and science experiment. Stussy\'s true loyalties, and the full scope of what she is, remain one of the arc\'s lingering mysteries.'
},
{
id: 'jewelry-bonney', name: 'Jewelry Bonney', epithet: null,
affiliation: 'Bonney Pirates', role: 'Captain', origin: 'South Blue',
age: 24, height: '141 cm (variable via her fruit)', birthday: 'August 1', bounty: 3125000000, status: 'Alive',
devilFruit: 'toshi-toshi-no-mi', firstAppearance: 'Chapter 498, "Trafalgar Law"',
abilities: ['Toshi Toshi no Mi (age alteration, self & others)'],
bio: "The daughter of the Revolutionary-aligned former Warlord Bartholomew Kuma, searching for the truth behind her father's mechanized fate. Bonney's devil fruit lets her transform her own age at will, from a toddler to an elder, a power she used to devastating effect during the assault on Egghead Island to protect her father."
},
{
id: 'kozuki-momonosuke', name: 'Kozuki Momonosuke', epithet: null,
affiliation: 'Kozuki Family', role: 'Shogun of Wano', origin: 'Wano Country',
age: 8, height: '105 cm', birthday: 'December 3', bounty: 100, status: 'Alive',
devilFruit: null, firstAppearance: 'Chapter 655, "Kinemon of the Foxfire"',
abilities: ['Occasional forced dragon transformation (via SMILE-derived drug)', 'Rightful claim to Wano\'s shogunate'],
bio: 'The son of Kozuki Oden, thrust into leadership as Wano\'s new shogun after twenty years frozen in time by Toki\'s Devil Fruit. Momonosuke\'s reluctant, often terrified heroism during the raid on Onigashima, including flying into battle as a dragon, marked his growth into the heir his father hoped he would become.'
},
{
id: 'uta', name: 'Uta', epithet: "World's Greatest Diva",
affiliation: 'Independent (raised by the Red Hair Pirates)', role: 'Singer', origin: "Raised aboard Shanks' ship, later Elbaf",
age: 18, height: '156 cm', birthday: 'March 8', bounty: null, status: 'Deceased',
devilFruit: 'uta-uta-no-mi', firstAppearance: 'One Piece Film: Red (2022)',
abilities: ['Uta Uta no Mi (trapping listeners inside Uta no Sekai)', 'World-renowned singing voice', 'Advanced physical combat (implied Haki)'],
bio: "The secret daughter of \"Red-Haired\" Shanks and Luffy's closest childhood friend, hidden away and raised on Elbaf after Shanks told her he had died, so she would never be tempted to follow him into a pirate's life. Uta grew up to become the most famous singer in the world, performing behind a hidden identity. At her debut concert on the Island of Elegia, grief and a desire to end all suffering drove her to use her Devil Fruit to try to trap humanity inside a permanent dream world, a plan called \"New Genesis\" that only Luffy — and her father — could stop. She died in Shanks' arms soon after, her heart unable to bear the strain the power had placed on it since childhood. (Appears in One Piece Film: Red, a movie storyline outside the main manga/anime continuity.)"
}
];

84
js/fruit.js Normal file
View File

@@ -0,0 +1,84 @@
/* Devil Fruit detail page: renders a full entry from ?id= against FRUITS/CHARACTERS. */
(function () {
const root = document.getElementById('fruit-content');
const id = qs('id');
const fruit = id ? findFruit(id) : null;
if (!fruit) {
root.innerHTML = `
<div class="empty-state">
Devil Fruit not found. <a href="fruits.html">Return to the Devil Fruit index</a>.
</div>
`;
return;
}
document.title = `${fruit.name} — One Piece Wiki`;
const metaDesc = document.querySelector('meta[name="description"]');
if (metaDesc) metaDesc.setAttribute('content', `${fruit.name} (${fruit.englishName}) — history, powers, and every known user on the One Piece Wiki.`);
const historyParagraphs = fruit.history.split('\n\n').map((p) => `<p>${escapeHtml(p)}</p>`).join('');
const usersHTML = fruit.users.map((u) => {
const c = findCharacter(u.id);
if (!c) return '';
return `
<a class="user-chip" href="${characterLink(c.id)}" style="--accent:${accentFor(c)}">
<div class="user-chip__avatar">${characterPortraitSVG(c)}</div>
<div>
<div class="user-chip__name">${escapeHtml(c.name)}</div>
<div class="user-chip__status">${escapeHtml(u.status)}</div>
</div>
</a>
`;
}).join('');
root.innerHTML = `
<section class="fruit-detail-header" data-cat="${escapeHtml(fruit.category)}">
<div class="fruit-detail-header__icon">${fruitPortraitSVG(fruit)}</div>
<div>
<p class="profile-eyebrow" style="color:var(--cat-color)">${escapeHtml(fruit.category)}${fruit.subtype ? ' · ' + escapeHtml(fruit.subtype) : ''}${fruit.awakened ? ' · Awakened' : ''}</p>
<h1>${escapeHtml(fruit.name)}</h1>
<p class="profile-epithet">${escapeHtml(fruit.englishName)}</p>
<p class="fruit-meaning">${escapeHtml(fruit.meaning)}</p>
</div>
</section>
<div class="profile-layout">
<div class="profile-main">
<div class="card">
<h2>Overview</h2>
<p>${escapeHtml(fruit.description)}</p>
</div>
<div class="card">
<h2>History</h2>
<div class="prose">${historyParagraphs}</div>
</div>
<div class="card">
<h2>Powers &amp; Techniques</h2>
<ul class="power-list">
${fruit.powers.map((p) => `<li>${escapeHtml(p)}</li>`).join('')}
</ul>
</div>
<div class="card">
<h2>Strengths &amp; Weaknesses</h2>
<p><strong style="color:var(--text)">Strengths:</strong> ${escapeHtml(fruit.strengths)}</p>
<p><strong style="color:var(--text)">Weaknesses:</strong> ${escapeHtml(fruit.weaknesses)}</p>
</div>
</div>
<aside class="card">
<h2>Users</h2>
<div class="user-list">
${usersHTML || '<p>No known users.</p>'}
</div>
</aside>
</div>
`;
hydrateProperImages(root);
})();

973
js/fruits-data.js Normal file
View File

@@ -0,0 +1,973 @@
/* One Piece Wiki — Devil Fruit dataset.
category is one of 'Paramecia' | 'Zoan' | 'Logia'. subtype adds Mythical/Ancient/Special detail.
users[].status describes the relationship (Current user, Former user, deceased, etc.) and id links to CHARACTERS. */
const FRUITS = [
{
id: 'gomu-gomu-no-mi', name: 'Gomu Gomu no Mi', englishName: 'Gum-Gum Fruit',
category: 'Paramecia', subtype: 'Mythical Zoan — Human-Human Model: Nika', awakened: true, icon: '🥊',
meaning: '"Gomu" (ゴム) — rubber',
tagline: 'Turns the user\'s body to rubber — and, once awakened, unleashes the mythical Sun God Nika.',
description: 'The Gomu Gomu no Mi grants a body of living rubber: immune to blunt force and electricity, capable of stretching to absurd lengths. For over twenty years it was misclassified as an ordinary Paramecia, its true nature hidden by the Celestial Dragons who feared it.',
history: 'The Gomu Gomu no Mi was stolen from the World Government by Shiki the Golden Lion before Monkey D. Garp intervened; the fruit was later left on a boat where a young Monkey D. Luffy accidentally ate it, believing it was ordinary food. For most of the series it was treated as a fairly ordinary, if unusually versatile, Paramecia power.\n\nDuring the battle against Kaido on Onigashima, Luffy pushed the fruit beyond its known limits and unlocked its true form: the Hito Hito no Mi Model: Nika, the Mythical Zoan fruit of the "Sun God" from ancient legend, said to grant the "most ridiculous power in the world" and to herald the liberation of an oppressed world. The World Government had renamed and hidden records of the fruit for eight hundred years specifically to keep this awakening from ever happening again.',
powers: [
'Full-body rubber elasticity — stretching, inflating, and rebounding attacks',
'Immunity to blunt-force trauma and electricity',
'Gear Second, Third, Fourth, and Fifth transformations',
'Nika Awakening: animates the surrounding environment like living rubber, wild size and color shifts, and effortless, gravity-defying combat'
],
strengths: 'Near-total immunity to blunt and electric attacks; post-awakening, Gear 5 grants freeform physics-breaking strength and speed limited mainly by stamina.',
weaknesses: 'Historically vulnerable to bladed and piercing weapons, and to fire; Gear 5\'s power drains enormous stamina and hunger extremely quickly.',
users: [{ id: 'monkey-d-luffy', status: 'Current user' }]
},
{
id: 'mera-mera-no-mi', name: 'Mera Mera no Mi', englishName: 'Flame-Flame Fruit',
category: 'Logia', subtype: null, awakened: false, icon: '🔥',
meaning: '"Mera Mera" — the sound of crackling flame',
tagline: 'Grants a body of living fire, letting the user become, create, and control flame at will.',
description: 'A Logia fruit that turns the user\'s body into fire itself, allowing them to generate massive flames, become intangible to physical attacks, and reform after being scattered.',
history: 'The Mera Mera no Mi was auctioned at the Sabaody Archipelago after being confiscated by the World Government, purchased by the Warlord Donquixote Doflamingo, who gave it to Portgas D. Ace as a gift after recruiting him — Ace refused the offer to join the Donquixote Family but kept the fruit, using it to become Whitebeard\'s Second Division Commander.\n\nAfter Ace\'s death at Marineford, the fruit reappeared years later at the Corrida Colosseum on Dressrosa, entered as the grand prize of a rigged tournament secretly designed to identify and eliminate whoever won it. Sabo, competing under a hidden identity, claimed the fruit and inherited his sworn brother\'s power, using it soon after to duel Admiral Fujitora to a standstill.',
powers: [
'Full transformation into fire, becoming immune to physical attacks',
'Fire generation and long-range projection (Fire Fist / Hiken)',
'Flame constructs for both offense and propulsion-assisted movement',
'Total incineration of anything not protected by Haki'
],
strengths: 'As a Logia, near-total physical intangibility while active; devastating offensive range and raw destructive output.',
weaknesses: 'Vulnerable to Haki-imbued attacks and other Logia users who can overpower or extinguish fire (e.g., magma, which burns hotter).',
users: [
{ id: 'portgas-d-ace', status: 'Former user (deceased; died at Marineford)' },
{ id: 'sabo', status: 'Current user (inherited after Ace\'s death)' }
]
},
{
id: 'ope-ope-no-mi', name: 'Ope Ope no Mi', englishName: 'Op-Op Fruit',
category: 'Paramecia', subtype: null, awakened: true, icon: '🩺',
meaning: '"Ope" — from the French/English "opérer/operate"',
tagline: 'Creates a spherical ROOM in which the user can manipulate anything — objects, wounds, even life itself.',
description: 'Widely called the "ultimate Devil Fruit," the Ope Ope no Mi grants total control within a spherical field called a ROOM, enabling teleportation, object-swapping, and surgery capable of curing nearly any ailment — at the cost of a technique that can grant eternal youth by taking the user\'s own life.',
history: 'The fruit\'s original owner is unrecorded; it passed through the Donquixote Family\'s criminal auctions before Rosinante (Corazon), working undercover as a Marine intelligence agent inside his brother Doflamingo\'s crew, stole it to save a dying child, Trafalgar Law, who was slowly succumbing to the deadly Amber Lead Syndrome. Corazon sacrificed his life protecting Law and the fruit from Doflamingo\'s forces at Minion Island.\n\nLaw ate the fruit and used its powers to cure himself, eventually becoming a Warlord and then a Yonko-rank captain of the Heart Pirates. Because the Ope Ope no Mi can perform the legendary Operation Ope Ope — granting eternal life at the cost of the user\'s own — it is hunted by the World Government and the Celestial Dragons alike, who see it as the one power capable of true immortality.',
powers: [
'ROOM: designates a spherical territory where the user can manipulate anything inside',
'Shambles: instant teleportation/swapping of objects and people within ROOM',
'Injection Shot, Counter Shock and other surgical combat techniques',
'Curing near-any disease or injury through "surgery"',
'Operation Ope Ope: grants eternal youth to another at the cost of the user\'s life (theorized/forbidden)'
],
strengths: 'Unmatched utility and battlefield control within ROOM\'s radius; can heal grievous wounds instantly.',
weaknesses: 'Powers are confined to the ROOM\'s boundary, which the user must maintain; overuse is physically exhausting.',
users: [
{ id: 'rosinante', status: 'Former user (briefly held it to protect it; deceased)' },
{ id: 'trafalgar-law', status: 'Current user' }
]
},
{
id: 'hito-hito-no-mi', name: 'Hito Hito no Mi', englishName: 'Human-Human Fruit',
category: 'Zoan', subtype: null, awakened: false, icon: '🦌',
meaning: '"Hito" — human',
tagline: 'Grants an animal human intelligence, speech, and a human hybrid form.',
description: 'A rare Zoan fruit that lets a non-human animal transform into, and gain the intelligence of, a human — the reverse of most Zoan fruits, which give humans animal traits.',
history: 'This particular Hito Hito no Mi was eaten by a wild reindeer on Drum Island who had been shot in the head by a hunter and left for dead. Waking with human intelligence and speech, the reindeer — soon to be named Tony Tony Chopper — was rejected by both his own herd and the humans of Drum Island for looking like neither, until the eccentric doctor Hiriluk took him in and taught him medicine.',
powers: [
'Human intelligence, speech, and reasoning in a reindeer body',
'Multiple hybrid forms between full reindeer and full human',
'Combined with the experimental Rumble Ball drug: forced access to all forms at once, including the monstrous Monster Point'
],
strengths: 'Unmatched versatility for a doctor-fighter — different forms suit healing, mobility, or brute combat.',
weaknesses: 'Rumble Ball use is chemically risky and time-limited; overuse or overlapping doses can cause loss of control.',
users: [{ id: 'tony-tony-chopper', status: 'Current user' }]
},
{
id: 'hana-hana-no-mi', name: 'Hana Hana no Mi', englishName: 'Flower-Flower Fruit',
category: 'Paramecia', subtype: null, awakened: true, icon: '🌸',
meaning: '"Hana" — flower (as in things "blooming")',
tagline: 'Lets the user sprout their own body parts anywhere they can see, in any number.',
description: 'The Hana Hana no Mi allows the user to sprout copies of their limbs, and eventually their whole body, on any surface within their field of perception, enabling reconnaissance, restraint, and combined-strength attacks.',
history: 'The fruit\'s prior history is unrecorded. Nico Robin ate it as a child on Ohara, and it became inseparable from her tragic circumstances: the government branded her "Devil Child" for surviving with a devil fruit power at age eight, and she spent twenty years as a fugitive before finding a place with the Straw Hats.\n\nDuring the timeskip, Robin trained with the revolutionary Mr. 2 Bon Clay\'s old contacts and developed advanced techniques that fuse dozens of sprouted limbs into single giant hands (Gigantesco Mano) and even a full giant clone body (Demonio Fleur), turning what was once a purely utility power into a genuine combat force.',
powers: [
'Sprouting duplicate limbs (Dos Fleur, Cien Fleur, etc.) on any surface in sight',
'Gigantesco Mano: fusing many sprouted hands into a single giant limb',
'Demonio Fleur: forming a full giant humanoid body from sprouted parts',
'Restraint, reconnaissance, and multi-directional simultaneous attacks'
],
strengths: 'Extreme versatility and range; can attack, defend, and scout simultaneously from many locations at once.',
weaknesses: 'Sprouted limbs share the user\'s pain sensation and can be individually broken or bound; requires line of sight to the surface.',
users: [{ id: 'nico-robin', status: 'Current user' }]
},
{
id: 'yomi-yomi-no-mi', name: 'Yomi Yomi no Mi', englishName: 'Revive-Revive Fruit',
category: 'Paramecia', subtype: null, awakened: false, icon: '💀',
meaning: '"Yomi" — the underworld/land of the dead in Japanese myth',
tagline: 'Returns the eater\'s soul to their body after death — once — and grants soul-based combat powers.',
description: 'One of the rarest known effects among Devil Fruits: rather than granting a living ability, the Yomi Yomi no Mi allows a soul to return to its body after death, so long as the body remains intact enough to inhabit.',
history: 'Brook ate the Yomi Yomi no Mi as a member of the Rumbar Pirates. When the entire crew was killed by an illness (and, indirectly, a fatal encounter with Gecko Moria\'s crew), Brook\'s soul returned to his body days later to find only his skeleton remained. He spent the next several decades sailing alone on the ghost ship Thousand Sunny\'s predecessor, slowly losing his memories and nearly his sanity, until the Straw Hats found him on Thriller Bark.',
powers: [
'One-time revival of the soul into the user\'s own corpse after death',
'Soul-based techniques (freezing enemies\' souls to numb or paralyze them)',
'Soul Solid: manipulating the "cold" of the soul into blade attacks',
'Immunity to cold as a side effect of having no living flesh'
],
strengths: 'Cheats death entirely once; soul-manipulation attacks bypass normal physical defenses.',
weaknesses: 'The revival only works once, and only if the body is still viable; as a skeleton, vulnerable to blunt strikes that could shatter bone.',
users: [{ id: 'brook', status: 'Current user' }]
},
{
id: 'nikyu-nikyu-no-mi', name: 'Nikyu Nikyu no Mi', englishName: 'Paw-Paw Fruit',
category: 'Paramecia', subtype: null, awakened: false, icon: '🐾',
meaning: '"Nikyu" — a play on "nikukyu," a paw pad',
tagline: 'Turns the user\'s palms into pads that can repel anything they touch — including pain and fatigue.',
description: 'The Nikyu Nikyu no Mi lets the user repel any physical object, projectile, or force with a touch of their paw-print palms, and — uniquely — repel abstract things like pain, exhaustion, and desires away from a person\'s body.',
history: 'Bartholomew Kuma, once a king and Revolutionary, ate the fruit before his transformation into a near-mindless Warlord-turned-government weapon. After secretly selling his body and free will to the World Government to pay for his daughter Bonney\'s life, Kuma\'s consciousness was suppressed, but his final free act was to use the fruit\'s paw-power to launch every Straw Hat pirate to safety after the Battle of Marineford, scattering the crew across the world but saving all of their lives.',
powers: [
'Repelling any physical object or attack on contact (Pad Ho, Ursus Shock)',
'Repelling intangible things from a person: pain, fatigue, and even the desire to fight',
'Launching people or objects vast distances through repelled force'
],
strengths: 'Can neutralize almost any incoming attack and can remove suffering from allies entirely, at will.',
weaknesses: 'In Kuma\'s case, the man himself lost autonomy after his mechanization, leaving the fruit\'s power in the World Government\'s hands.',
users: [{ id: 'bartholomew-kuma', status: 'Current user' }]
},
{
id: 'mero-mero-no-mi', name: 'Mero Mero no Mi', englishName: 'Love-Love Fruit',
category: 'Paramecia', subtype: null, awakened: false, icon: '💘',
meaning: '"Mero Mero" — smitten, love-struck',
tagline: 'Turns anyone who feels attraction toward the user, upon being struck, to stone.',
description: 'The Mero Mero no Mi weaponizes infatuation: anyone who finds the user attractive is turned to stone the instant they are struck by the fruit\'s power, whether by an arrow, a punch, or simply a glance held too long.',
history: 'Boa Hancock ate the fruit before rising to become the empress of Amazon Lily and captain of the Kuja Pirates. Her legendary beauty makes the fruit devastating in practice — a single Love-Love Arrow, Mero Mero Mellow, or even her Slave Arrow strike leaves nearly any admirer petrified, which contributed heavily to her seat among the Seven Warlords of the Sea.',
powers: [
'Petrification of anyone attracted to the user upon contact with the power',
'Love-Love Beam / Mellow: wide-area petrification blasts',
'Perfume Femur: summoning a giant living statue from petrified victims'
],
strengths: 'A single successful strike incapacitates almost any opponent instantly and (usually) reversibly.',
weaknesses: 'Completely ineffective against anyone who feels no attraction to the user — including women, children, or the emotionally guarded.',
users: [{ id: 'boa-hancock', status: 'Current user' }]
},
{
id: 'mane-mane-no-mi', name: 'Mane Mane no Mi', englishName: 'Clone-Clone Fruit',
category: 'Paramecia', subtype: null, awakened: false, icon: '🎭',
meaning: '"Mane" — to imitate/copy',
tagline: 'Lets the user copy the exact face and voice of anyone they touch.',
description: 'A transformation fruit that grants a perfect facial and vocal copy of any person the user has touched, useful for espionage, infiltration, and — as Bon Clay showed — genuine performance art.',
history: 'Bentham, known as Mr. 2 Bon Clay, used this fruit as a Baroque Works agent in Alabasta, copying Nefertari Vivi\'s face to sabotage the kingdom from within. After his defeat and friendship with Luffy, he later used the fruit\'s disguise ability to help engineer the Impel Down breakout, copying a warden\'s face to move the escaping prisoners through the prison undetected.',
powers: [
'Perfect facial and vocal mimicry of any previously touched person',
'Retains own combat skill and memory beneath the disguise',
'Can transform mid-fight to confuse opponents'
],
strengths: 'Excellent for infiltration, misdirection, and psychological warfare in a fight.',
weaknesses: 'Only changes appearance and voice, not the user\'s own strength, size, or fighting style.',
users: [{ id: 'bentham', status: 'Current user' }]
},
{
id: 'hie-hie-no-mi', name: 'Hie Hie no Mi', englishName: 'Ice-Ice Fruit',
category: 'Logia', subtype: null, awakened: false, icon: '🧊',
meaning: '"Hie" — to freeze/chill',
tagline: 'Grants a body of living ice, able to freeze entire landscapes and seas.',
description: 'A Logia fruit that lets the user become, generate, and control ice at will, freezing anything from a single limb to the surface of the open ocean.',
history: 'Kuzan, known as Aokiji, rose to Marine Admiral using this power, freezing half of the sea between islands during his legendary ten-day duel with Sakazuki over who would become the next Fleet Admiral — a fight so destructive it permanently reshaped the island of Punk Hazard, scarring it into a half-frozen, half-scorched wasteland. Kuzan lost the duel and left the Marines soon after, eventually aligning with Blackbeard\'s crew.',
powers: [
'Full transformation into ice, immune to most physical attacks',
'Freezing large bodies of water or terrain solid (Ice Age)',
'Ice Saber and Ice Block for close-quarters combat',
'Ice Ball projectiles for rapid ranged freezing'
],
strengths: 'Can freeze massive areas near-instantly, disabling entire fleets or islands at once.',
weaknesses: 'Vulnerable to intense heat and Haki-empowered strikes, like all Logia against Conqueror\'s or Armament Haki.',
users: [{ id: 'kuzan', status: 'Current user' }]
},
{
id: 'magu-magu-no-mi', name: 'Magu Magu no Mi', englishName: 'Magma-Magma Fruit',
category: 'Logia', subtype: null, awakened: false, icon: '🌋',
meaning: '"Magu" — magma',
tagline: 'Grants a body of living magma, hot enough to overpower even fire.',
description: 'A Logia fruit granting control over magma, considered a natural counter to fire-based Logia fruits since magma burns hotter and melts through nearly anything.',
history: 'Sakazuki, known as Akainu, used this fruit\'s overwhelming heat to end the Battle of Marineford, striking down Portgas D. Ace with a magma fist through the chest — a killing blow that also nearly claimed Luffy\'s life and triggered Whitebeard\'s final rampage. Sakazuki\'s subsequent duel with Kuzan for the Fleet Admiral position, fought over ten days on Punk Hazard, ended in his victory and elevation to the Marines\' highest rank.',
powers: [
'Full transformation into magma, immune to most physical attacks',
'Great Eruption: continent-scale magma bursts',
'Melting through Logia fire and most physical defenses',
'Magma fist strikes capable of piercing flesh instantly'
],
strengths: 'Overpowers fire-based attacks outright; combines Logia intangibility with extreme, near-unblockable heat damage.',
weaknesses: 'Like all Logia, vulnerable to Haki; slower and more telegraphed than lighter elemental Logias like light or smoke.',
users: [{ id: 'sakazuki', status: 'Current user' }]
},
{
id: 'pika-pika-no-mi', name: 'Pika Pika no Mi', englishName: 'Glint-Glint Fruit',
category: 'Logia', subtype: null, awakened: false, icon: '✨',
meaning: '"Pika" — a flash/glint of light',
tagline: 'Grants a body of living light, letting the user move and attack at light speed.',
description: 'A Logia fruit that turns the user into light itself, granting effectively instantaneous movement and attacks limited only by line of sight.',
history: 'Borsalino, known as Kizaru, wielded this fruit as a Marine Admiral for decades, using its light-speed properties to intervene in conflicts almost the instant they began, from Sabaody Archipelago to the war at Marineford. His famously lazy attitude belies one of the single most dangerous abilities in the entire Marine arsenal.',
powers: [
'Full transformation into light, immune to most physical attacks',
'Light-speed movement and travel across vast distances almost instantly',
'Yasakani no Magatama: rapid-fire laser bursts',
'Amaterasu: a massive beam capable of leveling large targets'
],
strengths: 'Effectively unblockable reaction speed and travel time; can strike from anywhere within eyeshot almost instantly.',
weaknesses: 'Still bound by line of sight and Haki-based countermeasures, despite the speed advantage.',
users: [{ id: 'borsalino', status: 'Current user' }]
},
{
id: 'moku-moku-no-mi', name: 'Moku Moku no Mi', englishName: 'Smoke-Smoke Fruit',
category: 'Logia', subtype: null, awakened: false, icon: '💨',
meaning: '"Moku" — the sound/image of billowing smoke',
tagline: 'Grants a body of living smoke, both a weapon and a means of near-total evasion.',
description: 'A Logia fruit letting the user become, produce, and manipulate smoke, useful for both offense (choking, blinding, cutting foes) and effectively unstoppable evasion.',
history: 'Smoker ate this fruit early in his Marine career and rose to become a Vice Admiral, using it to relentlessly pursue Luffy from Loguetown onward without ever quite managing to catch him. His smoke-based jutte combat, infused with Armament Haki, makes him one of the few Marines who can fight Devil Fruit Logia users and ordinary opponents with equal effectiveness.',
powers: [
'Full transformation into smoke, immune to most physical attacks',
'White Blow / White Snake: concentrated smoke strikes that can slice or choke',
'Large-scale smoke clouds for cover, blinding, or capture',
'Haki-infused jutte combat, bypassing his own Logia\'s usual weakness'
],
strengths: 'Excellent for both suffocating capture techniques and rapid, near-untouchable evasion or pursuit.',
weaknesses: 'Like all Logia, vulnerable to Haki-imbued attacks; heavy wind or extreme heat can disperse smoke form more easily.',
users: [{ id: 'smoker', status: 'Current user' }]
},
{
id: 'zushi-zushi-no-mi', name: 'Zushi Zushi no Mi', englishName: 'Gravity-Gravity Fruit',
category: 'Paramecia', subtype: null, awakened: false, icon: '🌀',
meaning: '"Zushi" — the weighty sensation of gravity',
tagline: 'Grants control over gravity itself, up to and including pulling meteors from orbit.',
description: 'One of the most powerful known Paramecia fruits, letting the user manipulate gravitational force across a wide area — crushing enemies, lifting objects, or even summoning meteors from space.',
history: 'Admiral Issho, known as Fujitora, wields this fruit despite being blind, guiding his sword and gravity techniques through Observation Haki and instinct alone. He famously called down meteors to devastate Dressrosa during Doflamingo\'s downfall, and his unusually principled sense of justice — openly criticizing the Celestial Dragons — sets him apart from most of his fellow Admirals.',
powers: [
'Localized or wide-area gravity manipulation, crushing or lifting targets',
'Meteor Volcano: pulling meteors from orbit onto a target area',
'Levitation of the user and allies',
'Gravity Blade: gravity-enhanced sword strikes'
],
strengths: 'Massive area-of-effect destructive potential; can immobilize entire fleets by crushing or lifting them at once.',
weaknesses: 'Large-scale techniques like meteor summoning take time to charge, leaving the user briefly vulnerable.',
users: [{ id: 'issho', status: 'Current user' }]
},
{
id: 'suna-suna-no-mi', name: 'Suna Suna no Mi', englishName: 'Sand-Sand Fruit',
category: 'Logia', subtype: null, awakened: false, icon: '⏳',
meaning: '"Suna" — sand',
tagline: 'Grants a body of living sand, able to dehydrate anything it touches.',
description: 'A Logia fruit that lets the user become, generate, and control sand — and, more dangerously, drain the moisture from anything or anyone it touches.',
history: 'Crocodile used this fruit as the secret mastermind of Baroque Works, engineering a civil war in Alabasta by supplying arms to rebels while pretending to aid the kingdom as a Warlord of the Sea. His Desert Spada and dehydration techniques nearly killed Princess Vivi\'s kingdom before Luffy — immune to Crocodile\'s intangibility as a fellow Devil Fruit user who could still land solid blows through sheer Haki-less brute force and later Haki — defeated him twice, once in Alabasta and again at Marineford.',
powers: [
'Full transformation into sand, immune to most physical attacks',
'Desert Spada: a wide, blade-like slicing sandstorm',
'Moisture drain on contact, dehydrating people and objects',
'Ground Death: a localized desert-summoning technique'
],
strengths: 'Combines Logia intangibility with a debilitating dehydration effect that saps enemies\' strength over time.',
weaknesses: 'Notably weak to water, which clumps and neutralizes sand form far more effectively than most Logia counters.',
users: [{ id: 'crocodile', status: 'Current user' }]
},
{
id: 'ito-ito-no-mi', name: 'Ito Ito no Mi', englishName: 'String-String Fruit',
category: 'Paramecia', subtype: null, awakened: false, icon: '🕸️',
meaning: '"Ito" — thread/string',
tagline: 'Grants control over razor-sharp strings, strong enough to slice steel or puppeteer entire people.',
description: 'A Paramecia fruit that lets the user generate and manipulate strings sharp enough to cut through steel and durable enough to control other people\'s bodies like marionettes.',
history: 'Donquixote Doflamingo, a disgraced former World Noble, used this fruit to build a criminal empire trafficking weapons and artificial SMILE Devil Fruits while secretly ruling Dressrosa as a puppet king for ten years, controlling the previous king\'s corpse with his strings to hide his coup. His "Parasite" ability to control living people directly through implanted strings made him one of the story\'s most oppressive villains until Luffy severed his control for good.',
powers: [
'String generation sharp enough to slice through steel and stone',
'Parasite: full puppeteer control over another person\'s body via strings',
'Overheat: superheated string attacks',
"String-based flight and city-scale aerial combat webs"
],
strengths: 'Extreme versatility — cutting, binding, puppeteering, and flight all from a single power; strings are nearly invisible in combat.',
weaknesses: "Puppeteered victims can theoretically be freed if the controlling strings are cut or the user is sufficiently overwhelmed.",
users: [{ id: 'donquixote-doflamingo', status: 'Current user' }]
},
{
id: 'kage-kage-no-mi', name: 'Kage Kage no Mi', englishName: 'Shadow-Shadow Fruit',
category: 'Paramecia', subtype: null, awakened: false, icon: '🌑',
meaning: '"Kage" — shadow',
tagline: "Lets the user steal, animate, and weaponize other people's and creatures' shadows.",
description: "A Paramecia fruit that lets the user tear a shadow from any living or dead body and stitch it into a corpse, animating it as an obedient zombie, or use their own shadow as a two-dimensional doorway.",
history: "Gecko Moria's entire original crew was slaughtered by Kaido, an act that broke him and sent him into decades of obsessive shadow-collecting to build an undead army instead of relying on living crewmates ever again. On Thriller Bark, Moria stole hundreds of shadows — including, briefly, Luffy's own — to animate an army of zombies led by the giant zombie general Oz, until Luffy forced the shadows back and shattered Moria's ambitions along with them.",
powers: [
"Stealing another person's shadow, weakening them severely in sunlight",
"Animating a shadow-stitched corpse into an obedient zombie soldier",
"Merging multiple shadows into one giant zombie for overwhelming size",
"Using the user's own shadow as a two-dimensional gateway to slip through gaps"
],
strengths: "Can build an entire army from stolen shadows in a single night; victims of stolen shadows become nearly powerless by day.",
weaknesses: "Stolen shadows return to their original owners at dawn unless bound; the zombies created are ultimately weaker than the humans whose shadows they used.",
users: [{ id: 'gecko-moria', status: 'Current user' }]
},
{
id: 'bara-bara-no-mi', name: 'Bara Bara no Mi', englishName: 'Chop-Chop Fruit',
category: 'Paramecia', subtype: null, awakened: false, icon: '🔪',
meaning: '"Bara Bara" — scattered, in pieces',
tagline: "Splits the user's body into floating, controllable pieces, immune to slashing.",
description: "A Paramecia fruit that lets the user separate their body into any number of independently floating parts, all remaining under conscious control and immune to being cut.",
history: "Buggy ate this fruit as a young cabin boy on Gol D. Roger's ship, long before becoming a bumbling but surprisingly resilient captain in his own right. His immunity to swords and blades has let him survive encounters that would kill nearly anyone else, contributing — almost by accident — to a reputation that eventually carried him to the rank of Warlord and, later, co-founder of the Cross Guild.",
powers: [
"Splitting the body into independently floating, controllable parts",
"Total immunity to slashing and piercing attacks while separated",
"Buggy Ball: launching detached hands as surprise projectile strikes",
"Reassembling instantly at will"
],
strengths: "Total immunity to bladed weapons, historically one of the hardest defenses to counter directly.",
weaknesses: "Still vulnerable to blunt-force trauma, and separated parts can be individually grabbed, restrained, or thrown off course.",
users: [{ id: 'buggy', status: 'Current user' }]
},
{
id: 'yami-yami-no-mi', name: 'Yami Yami no Mi', englishName: 'Dark-Dark Fruit',
category: 'Logia', subtype: null, awakened: false, icon: '⚫',
meaning: '"Yami" — darkness',
tagline: "The only known Devil Fruit power capable of nullifying other Devil Fruit abilities.",
description: "Considered the most sinister of all Logia fruits: it grants a body of living darkness with immense gravitational pull, and uniquely, nullifies any other Devil Fruit power on contact — including making other Logia users tangible and vulnerable to physical damage.",
history: "The fruit's original owner is unrecorded. Marshall D. Teach, then a low-ranking member of Whitebeard's crew, murdered his own crewmate Thatch to steal it after learning it had washed ashore, using it to defect to the Marines temporarily before openly declaring himself a pirate. Blackbeard's darkness later proved decisive at Marineford, nullifying Whitebeard's Devil Fruit power just long enough for his crew to finish him off and steal his fruit too.",
powers: [
"Full transformation into darkness with crushing gravitational pull (Black Hole)",
"Nullifying any other Devil Fruit's power on direct contact",
"Liberation: unleashing previously absorbed gravitational force in a massive shockwave",
"Rendering other Logia users' bodies solid and vulnerable to physical attack"
],
strengths: "Uniquely able to counter any other Devil Fruit ability, making it the single most feared power among Devil Fruit users.",
weaknesses: "Unlike other Logia, the user's body remains solid and vulnerable to physical damage even while using its power.",
users: [{ id: 'marshall-d-teach', status: 'Current user' }]
},
{
id: 'gura-gura-no-mi', name: 'Gura Gura no Mi', englishName: 'Tremor-Tremor Fruit',
category: 'Paramecia', subtype: 'Special Paramecia — capable of "destroying the world"', awakened: false, icon: '💥',
meaning: '"Gura Gura" — shaking, trembling',
tagline: "Grants the power to generate quakes powerful enough to shatter the sky and crack the ocean floor.",
description: "Regarded as the single most destructive Devil Fruit in the world, letting the user generate vibrations and shockwaves through any medium — air, sea, or solid ground — powerful enough, if unleashed fully, to sink the entire world beneath the waves.",
history: "Edward Newgate, known as Whitebeard, wielded this fruit for decades as the World's Strongest Man, his quake-fueled fist strikes alone capable of splitting the sky over Marineford during the war to save Ace. He died defending his crew's honor in that battle, still standing even after dozens of grievous wounds, until Blackbeard — who had infiltrated the battlefield specifically to steal it — delivered the final blow and pulled the fruit from his corpse.\n\nBlackbeard became the only known person able to wield two Devil Fruits simultaneously, combining the Gura Gura no Mi's quakes with his own Yami Yami no Mi's darkness to devastating effect, a combination that helped propel him to Yonko status.",
powers: [
"Generating shockwaves and vibrations through air, land, or sea at a touch or a punch",
"Seaquakes powerful enough to summon tsunamis",
"Fissuring solid ground and shattering the sky itself at full power",
"Theorized capability to sink the entire world if left unchecked"
],
strengths: "The single highest raw destructive ceiling of any known Devil Fruit, effective at any range through nearly any medium.",
weaknesses: "Requires immense physical and Haki conditioning to wield safely; extreme output risks catastrophic collateral damage even to the user's allies.",
users: [
{ id: 'edward-newgate', status: 'Former user (deceased; killed at Marineford)' },
{ id: 'marshall-d-teach', status: 'Current user (stole it after Whitebeard\'s death)' }
]
},
{
id: 'suke-suke-no-mi', name: 'Suke Suke no Mi', englishName: 'Clear-Clear Fruit',
category: 'Paramecia', subtype: null, awakened: false, icon: '👻',
meaning: '"Suke" — transparent, see-through',
tagline: "Turns the user, or anything they touch, invisible.",
description: "A Paramecia fruit that grants total invisibility to the user's body, and can extend the same effect to anything the user touches, at the cost of the user's own clothes needing to come off to stay unseen.",
history: "Absalom, a zombie officer of Thriller Bark, used this fruit's invisibility to stalk and harass Nico Robin, whom he had become fixated on marrying. During the chaos of Thriller Bark's collapse, his own ally Shiryu murdered him and took the fruit for himself before defecting to the Blackbeard Pirates, where he continues to use its invisibility for reconnaissance and ambush.",
powers: [
"Full invisibility of the user's body",
"Extending invisibility to touched objects or people",
"Silent, undetectable infiltration and ambush combat"
],
strengths: "Near-perfect stealth for infiltration, assassination, and escape.",
weaknesses: "Effects are broken by anything revealing position — footprints, scent-tracking, or Observation Haki users who can sense presence regardless of sight.",
users: [
{ id: 'absalom', status: 'Former user (deceased; killed by Shiryu)' },
{ id: 'shiryu', status: 'Current user (took it from Absalom)' }
]
},
{
id: 'neko-neko-no-mi-model-saber-tiger', name: 'Neko Neko no Mi, Model: Saber Tiger', englishName: 'Cat-Cat Fruit, Model: Saber Tiger',
category: 'Zoan', subtype: 'Saber Tiger hybrid', awakened: false, icon: '🐯',
meaning: '"Neko" — cat',
tagline: "Grants a hybrid and full transformation into a prehistoric saber-toothed tiger.",
description: "A Zoan fruit modeled after the extinct saber-toothed tiger, granting enhanced claws, speed, and predatory strength in hybrid or full-beast form.",
history: "Catarina Devon, one of the Blackbeard Pirates' newer recruits, joined the crew's assault on Egghead Island during their bid to seize Vegapunk's research. Her saber-tiger form gives her a fighting edge suited to the crew's increasingly aggressive expansion in the New World.",
powers: [
"Human, hybrid, and full saber-tiger transformations",
"Enhanced claws capable of shredding armor",
"Predatory speed and reflexes in hybrid form"
],
strengths: "Strong close-quarters slashing power and mobility across all three Zoan forms.",
weaknesses: "Like most Zoan users, most vulnerable in transitional states between forms.",
users: [{ id: 'catarina-devon', status: 'Current user' }]
},
{
id: 'tori-tori-no-mi-model-phoenix', name: 'Tori Tori no Mi, Model: Phoenix', englishName: 'Bird-Bird Fruit, Model: Phoenix',
category: 'Zoan', subtype: 'Mythical Zoan', awakened: false, icon: '🔥🦅',
meaning: '"Tori" — bird',
tagline: "A Mythical Zoan granting phoenix flames that heal the user's own wounds almost instantly.",
description: "One of the rarest Mythical Zoan fruits, granting transformation into a phoenix wreathed in blue regenerative flames, capable of healing injuries — including the user's own — in seconds.",
history: "Marco has wielded this fruit as long as he has served the Whitebeard Pirates, becoming their First Division Commander and Whitebeard's most trusted right hand. His near-unkillable regeneration let him survive direct hits from Admirals at Marineford, and after Whitebeard's death he used the fruit's healing to quietly tend his old crew's wounded in retirement — until the wars against Kaido and Big Mom pulled him back into the fight.",
powers: [
"Full and hybrid transformation into a blue-flamed phoenix",
"Near-instantaneous regeneration of wounds, including lost blood and burns",
"Flight and flame-based aerial combat",
"Healing flames can, to a limited degree, mend allies as well"
],
strengths: "Regeneration this fast makes Marco extraordinarily difficult to put down in a straight fight.",
weaknesses: "Regeneration does not restore stamina or prevent death from a single overwhelming blow; still bound by normal Haki-based countermeasures.",
users: [{ id: 'marco', status: 'Current user' }]
},
{
id: 'soru-soru-no-mi', name: 'Soru Soru no Mi', englishName: 'Soul-Soul Fruit',
category: 'Paramecia', subtype: 'Special Paramecia', awakened: false, icon: '👁️',
meaning: '"Soru" — soul',
tagline: "Lets the user rip out portions of a person's lifespan as tangible 'soul,' animating objects into living homies.",
description: "One of the most feared Paramecia fruits, letting the user tear a piece of anyone's soul — and lifespan — from their body, either to shorten their life or to breathe life into inanimate objects as loyal, sentient 'homies.'",
history: "Charlotte Linlin, known as Big Mom, ate this fruit as a child, and it fed directly into a lifelong, uncontrollable hunger: eating enough food (or people's souls) prevents the emotional \"tantrums\" that once made her a danger to her own hometown as a toddler. As ruler of Totto Land, she built her entire kingdom's infrastructure and army from homies animated from stolen souls, and used the fruit to extend her own life far past its natural span. Her two most powerful homies, Zeus and Napoleon, were later stolen away from her by Nami and Big Mom's own children respectively.",
powers: [
"Extracting a portion of a person's soul, shortening their remaining lifespan",
"Animating any object into a sentient, obedient 'homie' by implanting a soul",
"Storing extracted souls to extend the user's own life indefinitely",
"Homies can be extremely powerful in their own right (e.g., Zeus, Napoleon, Prometheus)"
],
strengths: "Can build an entire army and infrastructure from ordinary objects, and can grant the user unnaturally extended life.",
weaknesses: "A homie separated too long from its stolen soul source, or whose donor dies, can lose its power or return to being an inanimate object.",
users: [{ id: 'charlotte-linlin', status: 'Current user' }]
},
{
id: 'mochi-mochi-no-mi', name: 'Mochi Mochi no Mi', englishName: 'Mochi-Mochi Fruit',
category: 'Paramecia', subtype: 'Special Paramecia — functions like a Logia', awakened: false, icon: '🍡',
meaning: '"Mochi" — a sticky Japanese rice cake',
tagline: "Grants a body of living mochi, functioning with Logia-like intangibility despite being classified Paramecia.",
description: "A rare Special Paramecia that behaves almost exactly like a Logia: the user's body becomes mochi, letting them evade attacks, stretch, and engulf enemies in sticky, immobilizing dough.",
history: "Charlotte Katakuri, Big Mom's most powerful son, has kept this fruit's true nature secret for most of his life, going to extreme lengths — including always covering his mouth — to hide the mochi stains it leaves on his face when he eats. His mastery of both the fruit and advanced Observation Haki, letting him see moments into the future, made his duel with Luffy at Whole Cake Island one of the most tactically respected fights in the series.",
powers: [
"Logia-like intangibility via transformation into mochi",
"Engulfing enemies in sticky, restraining mochi",
"Stretching and reshaping mochi limbs for both offense and mobility",
"Zan Giri Mochi and other sharpened mochi-blade techniques"
],
strengths: "Combines Logia-tier evasion with Paramecia-style versatility and physical restraint options.",
weaknesses: "Still countered by Haki like any Logia-adjacent power; the user can still be struck if hit with sufficient force or precision.",
users: [{ id: 'charlotte-katakuri', status: 'Current user' }]
},
{
id: 'shibo-shibo-no-mi', name: 'Shibo Shibo no Mi', englishName: 'Wring-Wring Fruit',
category: 'Paramecia', subtype: null, awakened: false, icon: '🧴',
meaning: '"Shibo(ru)" — to wring out',
tagline: "Lets the user wring liquid — including blood and vitality — out of anything, or anyone, they touch.",
description: "A Paramecia fruit that lets the user squeeze liquid out of any object or living being on contact, from wringing water out of clothes to draining an opponent's blood and strength.",
history: "Charlotte Smoothie governs Fish-Man Island on Big Mom's behalf as one of her Sweet Commanders, using this fruit's draining touch as both a combat weapon and a quiet method of control. Her calm, composed demeanor makes her one of the more calculating members of the Charlotte family.",
powers: [
"Wringing liquid out of objects on contact",
"Draining blood and vitality from living targets, weakening them severely",
"Reconstituting drained liquid into offensive projectiles"
],
strengths: "Direct contact can incapacitate an opponent by draining their strength almost instantly.",
weaknesses: "Requires physical contact to activate, limiting it against fast or ranged opponents.",
users: [{ id: 'charlotte-smoothie', status: 'Current user' }]
},
{
id: 'bisu-bisu-no-mi', name: 'Bisu Bisu no Mi', englishName: 'Biscuit-Biscuit Fruit',
category: 'Paramecia', subtype: null, awakened: false, icon: '🍪',
meaning: '"Bisu(ketto)" — biscuit',
tagline: "Lets the user generate and command an army of biscuit soldiers, and wear biscuit armor.",
description: "A Paramecia fruit that produces biscuit-based matter which the user can shape into soldiers, walls, or personal armor, hardened enough to withstand serious punishment.",
history: "Charlotte Cracker fought Luffy in a grueling battle of attrition on Whole Cake Island, endlessly regenerating his biscuit soldier army no matter how many Luffy destroyed. Hidden beneath his cloak, his own body is armored in dense biscuit plating, requiring Luffy to escalate all the way to Gear Fourth to finally crack through.",
powers: [
"Generating biscuit-soldier constructs for an endlessly renewable army",
"Biscuit armor worn beneath the user's cloak for personal defense",
"Shaping biscuit matter into walls, weapons, or shields"
],
strengths: "The army can be regenerated almost indefinitely, making straightforward attrition an ineffective strategy against him.",
weaknesses: "Individual biscuit soldiers are much weaker than the user himself and can be destroyed relatively easily one at a time.",
users: [{ id: 'charlotte-cracker', status: 'Current user' }]
},
{
id: 'peto-peto-no-mi', name: 'Peto Peto no Mi', englishName: 'Candy-Candy Fruit',
category: 'Paramecia', subtype: null, awakened: false, icon: '🍬',
meaning: '"Peto" — from "candy"',
tagline: "Lets the user create and shape candy at will, from staircases to weapons.",
description: "A Paramecia fruit that grants full control over candy creation and manipulation, useful for construction, restraint, and offense alike.",
history: "Charlotte Perospero, Big Mom's eldest son, is one of Totto Land's chief political architects, using this fruit to build candy infrastructure — bridges, staircases, even entire structures — as easily as he uses it to bind enemies in hardened candy chains.",
powers: [
"Generating solid candy constructs of nearly any shape",
"Candy-based restraints and weapons",
"Rapid construction of large-scale structures"
],
strengths: "Extremely versatile for both battlefield construction and restraint of enemies.",
weaknesses: "Candy constructs, while hardened, can still be broken with sufficient force.",
users: [{ id: 'charlotte-perospero', status: 'Current user' }]
},
{
id: 'uo-uo-no-mi-model-seiryu', name: 'Uo Uo no Mi, Model: Seiryu', englishName: 'Fish-Fish Fruit, Model: Azure Dragon',
category: 'Zoan', subtype: 'Mythical Zoan', awakened: false, icon: '🐉',
meaning: '"Uo" — fish (broadly, aquatic creature); "Seiryu" — the Azure Dragon of Chinese myth',
tagline: "Transforms the user into a colossal Eastern dragon, one of the most powerful known Zoan fruits.",
description: "An extraordinarily rare Mythical Zoan granting transformation into an Azure Dragon, complete with flight, elemental breath, and near-unmatched raw destructive power.",
history: "Kaido has wielded this fruit for so long that his dragon form became legend even before most pirates ever saw it in person. As one of the Four Emperors ruling Wano in a decades-long alliance with the shogun Orochi, Kaido's dragon rampages leveled cities and shrugged off attacks from entire fleets; his own repeated, failed attempts to end his life through the fruit's near-invulnerability fed a deep nihilism that only broke after his defeat at Onigashima by an alliance led by Luffy and Kid.",
powers: [
"Full transformation into a massive Azure Dragon capable of flight",
"Elemental breath and weather-altering attacks (Boro Breath)",
"Near-total physical invulnerability in dragon form",
"Bolo Breath and other massive-scale area attacks"
],
strengths: "Among the most physically durable and destructive Devil Fruits known, able to fight entire armies single-handedly.",
weaknesses: "Sheer size can be a liability in confined spaces; still vulnerable to sufficiently powerful Conqueror's Haki and Advanced Armament Haki.",
users: [{ id: 'kaido', status: 'Current user' }]
},
{
id: 'ryu-ryu-no-mi-model-pteranodon', name: 'Ryu Ryu no Mi, Model: Pteranodon', englishName: 'Dragon-Dragon Fruit, Model: Pteranodon',
category: 'Zoan', subtype: 'Ancient Zoan', awakened: false, icon: '🦅',
meaning: '"Ryu" — dragon (used broadly for prehistoric reptiles)',
tagline: "An Ancient Zoan granting transformation into a prehistoric flying pteranodon.",
description: "An Ancient Zoan fruit, extinct in the modern world for eons, granting flight and aerial combat prowess through a pteranodon hybrid or full transformation.",
history: "King, the last known survivor of the Lulusia Kingdom — a nation the World Government wiped off the map to bury evidence of illegal Devil Fruit experimentation — became Kaido's most trusted All-Star. He fused his flight-capable Zoan with fire-based attacks learned separately, making him one of the few Beast Pirates able to keep pace with Kaido himself.",
powers: [
"Human, hybrid, and full pteranodon transformations",
"Sustained flight and aerial combat",
"Fire-augmented strikes in hybrid form (a separately trained skill, not innate to the fruit)"
],
strengths: "Flight grants King total control of the vertical battlefield, especially devastating combined with his fire techniques.",
weaknesses: "As with most Zoan hybrids, momentary vulnerability exists when shifting between forms mid-combat.",
users: [{ id: 'king', status: 'Current user' }]
},
{
id: 'ryu-ryu-no-mi-model-brachiosaurus', name: 'Ryu Ryu no Mi, Model: Brachiosaurus', englishName: 'Dragon-Dragon Fruit, Model: Brachiosaurus',
category: 'Zoan', subtype: 'Ancient Zoan (artificial, SMILE-derived)', awakened: false, icon: '🦕',
meaning: '"Ryu" — dragon (used broadly for prehistoric reptiles)',
tagline: "An artificially replicated Ancient Zoan granting a colossal brachiosaurus transformation.",
description: "Unlike most Devil Fruits, Queen's power was artificially reproduced by Vegapunk's stolen research and administered as a successful SMILE, granting full Zoan control (unlike the malfunctioning SMILEs given to ordinary soldiers) and a massive brachiosaurus form.",
history: "Queen, the scientist-cyborg behind Kaido's SMILE Devil Fruit factory, used his own successful creation to grant himself a brachiosaurus transformation, towering over most opponents in size and reach. His research also produced the mutated Ice Oni bioweapon he unleashed on Wano as a last resort during the raid on Onigashima.",
powers: [
"Full transformation into a massive brachiosaurus",
"Enormous size and reach advantage in combat",
"Combined with cyborg body modifications for further durability"
],
strengths: "Sheer scale gives overwhelming physical presence and reach few opponents can match directly.",
weaknesses: "Size and mass reduce agility compared to smaller, faster Zoan transformations.",
users: [{ id: 'queen', status: 'Former user (deceased)' }]
},
{
id: 'zou-zou-no-mi-model-mammoth', name: 'Zou Zou no Mi, Model: Mammoth', englishName: 'Elephant-Elephant Fruit, Model: Mammoth',
category: 'Zoan', subtype: 'Ancient Zoan', awakened: false, icon: '🦣',
meaning: '"Zou" — elephant',
tagline: "An Ancient Zoan granting transformation into a colossal woolly mammoth.",
description: "A prehistoric Ancient Zoan fruit granting a massive mammoth transformation, prized for its sheer size and destructive physical power.",
history: "Jack commands Kaido's flagship Numancia Mother and led the assault on Zunesha, the giant elephant that carries the island of Zou on its back, attempting to force the Mink tribe into Kaido's service. His mammoth form let him personally battle Zunesha and level parts of Wano in Kaido's name.",
powers: [
"Full transformation into a massive woolly mammoth",
"Devastating trampling and tusk-based physical attacks",
"Immense size advantage in siege-style combat"
],
strengths: "One of the largest and most physically destructive Zoan forms in the series, ideal for large-scale sieges.",
weaknesses: "Slower and less maneuverable than smaller Zoan or Paramecia opponents.",
users: [{ id: 'jack', status: 'Current user' }]
},
{
id: 'hebi-hebi-no-mi-model-yamata-no-orochi', name: 'Hebi Hebi no Mi, Model: Yamata no Orochi', englishName: 'Snake-Snake Fruit, Model: Eight-Headed Serpent',
category: 'Zoan', subtype: 'Mythical Zoan', awakened: false, icon: '🐍',
meaning: '"Hebi" — snake; Yamata no Orochi, the eight-headed serpent of Japanese legend',
tagline: "A Mythical Zoan transforming the user into the legendary eight-headed serpent Yamata no Orochi.",
description: "A Mythical Zoan modeled after the eight-headed, eight-tailed serpent of Japanese folklore, granting a many-headed dragon-snake form where each head effectively grants the user an extra life.",
history: "Kurozumi Orochi, the corrupt shogun who conspired with Kaido to seize control of Wano and betray the Kozuki clan, used this fruit's multiple 'lives' to survive assassination attempts for two decades. Each of his eight heads had to be destroyed in turn during his final battle against the people he oppressed, a fittingly drawn-out end for a tyrant who ruled through fear and starvation.",
powers: [
"Transformation into an eight-headed serpent-dragon hybrid",
"Each head functions as an independent 'life,' making the user very hard to kill outright",
"Venomous bite and constricting serpentine attacks"
],
strengths: "Effectively grants multiple lives in battle, requiring an opponent to defeat all heads to finish the fight.",
weaknesses: "Once all heads are destroyed, the user has no further recourse; each individual head is not dramatically tougher than an ordinary fighter.",
users: [{ id: 'kurozumi-orochi', status: 'Former user (deceased)' }]
},
{
id: 'inu-inu-no-mi-model-okuchi-no-makami', name: 'Inu Inu no Mi, Model: Okuchi no Makami', englishName: 'Dog-Dog Fruit, Model: Guardian Deity Wolf',
category: 'Zoan', subtype: 'Mythical Zoan', awakened: false, icon: '🐺',
meaning: '"Inu" — dog; Okuchi no Makami, a wolf deity of Japanese legend',
tagline: "A Mythical Zoan granting transformation into a legendary ice-wielding wolf deity.",
description: "A rare Mythical Zoan modeled after a guardian wolf deity of Japanese folklore, granting a massive wolf transformation with control over ice and snow.",
history: "Yamato, child of Kaido, ate this fruit and used its guardian-deity nature as inspiration to reject the identity Kaido tried to force on them, choosing instead to live as Kozuki Oden, the man Yamato idolized after reading his journal as a child. Imprisoned for years for repeated attempts to leave Wano and honor Oden's promise to open the borders, Yamato broke free during the raid on Onigashima and fought alongside the Akazaya Nine to help end Kaido's reign.",
powers: [
"Full transformation into a colossal guardian wolf",
"Ice-based breath and attacks",
"Enhanced strength and durability befitting a legendary guardian spirit"
],
strengths: "Combines Mythical Zoan raw power with elemental ice attacks, rare among Zoan fruits.",
weaknesses: "As with other large Zoan forms, size can be a liability in tight quarters.",
users: [{ id: 'yamato', status: 'Current user' }]
},
{
id: 'horu-horu-no-mi', name: 'Horu Horu no Mi', englishName: 'Hormone-Hormone Fruit',
category: 'Paramecia', subtype: null, awakened: false, icon: '💉',
meaning: '"Horu(mon)" — hormone',
tagline: "Lets the user inject hormones into themselves or others, altering emotions, healing, growth, and even sex.",
description: "A Paramecia fruit granting mastery over hormone injection, capable of rapid healing, radical body alteration, emotional manipulation, and changing a person's biological sex at will.",
history: "Emporio Ivankov rules Kamabakka Kingdom and serves as a top Revolutionary Army commander, using this fruit's medical applications to run an entire underground hospital for escaped Impel Down prisoners. Ivankov's Death Wink hormone injection saved Luffy's life after the trauma of witnessing Ace's death, restarting his stopped heart when all conventional options had failed.",
powers: [
"Rapid wound healing and stamina restoration via hormone injection",
"Changing a person's biological sex at will (Face Growth, Death Wink)",
"Emotional and hormonal manipulation of allies or enemies",
"Drastically altering body size and musculature temporarily"
],
strengths: "Extremely versatile medical and combat applications, capable of near-miraculous emergency healing.",
weaknesses: "The most extreme techniques carry real risk to the recipient if used incorrectly or excessively.",
users: [{ id: 'emporio-ivankov', status: 'Current user' }]
},
{
id: 'neko-neko-no-mi-model-leopard', name: 'Neko Neko no Mi, Model: Leopard', englishName: 'Cat-Cat Fruit, Model: Leopard',
category: 'Zoan', subtype: null, awakened: false, icon: '🐆',
meaning: '"Neko" — cat',
tagline: "Grants a hybrid and full transformation into a leopard, combined with elite martial arts.",
description: "A Zoan fruit granting leopard-based transformation, prized for speed and lethal claw-based strikes, especially devastating in the hands of a Rokushiki master.",
history: "Rob Lucci wielded this fruit as CP9's most dangerous agent during the Water 7 and Enies Lobby arcs, nearly killing Luffy in a battle that pushed the young captain to his physical limits. Lucci's continued service to the World Government's CP0 resurfaced years later during the Egghead Incident, proving his loyalty to 'justice,' however brutal, never wavered.",
powers: [
"Human, hybrid, and full leopard transformations",
"Combined with all six Rokushiki techniques (Soru, Shigan, Rankyaku, Geppo, Kami-e, Rokuogan)",
"Enhanced speed, claws, and reflexes in hybrid form"
],
strengths: "The combination of Zoan physicality with Rokushiki mastery makes Lucci one of the deadliest melee fighters in the series.",
weaknesses: "Relies heavily on close-range engagement, where Rokushiki and claws are most effective.",
users: [{ id: 'rob-lucci', status: 'Current user' }]
},
{
id: 'ushi-ushi-no-mi-model-giraffe', name: 'Ushi Ushi no Mi, Model: Giraffe', englishName: 'Ox-Ox Fruit, Model: Giraffe',
category: 'Zoan', subtype: null, awakened: false, icon: '🦒',
meaning: '"Ushi" — ox (used broadly for large hoofed animals)',
tagline: "Grants a hybrid and full transformation into a giraffe, useful for reach and momentum-based strikes.",
description: "A Zoan fruit granting giraffe-based transformation, providing significant reach advantages in hybrid form.",
history: "Kaku spent years undercover as a Galley-La shipwright on Water 7 before revealing himself as a CP9 agent alongside Rob Lucci during the Enies Lobby arc. His giraffe hybrid form, combined with Rokushiki mastery, gives him unusual reach for a close-combat specialist.",
powers: [
"Human, hybrid, and full giraffe transformations",
"Extended reach and momentum-based strikes in hybrid form",
"Combined with Rokushiki techniques"
],
strengths: "Reach advantage in hybrid form pairs unusually well with Rokushiki's speed-based techniques.",
weaknesses: "Full giraffe form trades combat utility for size, rarely used in serious fights.",
users: [{ id: 'kaku', status: 'Current user' }]
},
{
id: 'goro-goro-no-mi', name: 'Goro Goro no Mi', englishName: 'Rumble-Rumble Fruit',
category: 'Logia', subtype: null, awakened: false, icon: '⚡',
meaning: '"Goro Goro" — the rumble of thunder',
tagline: "Grants a body of living lightning, one of the fastest and most destructive known Logia powers.",
description: "A Logia fruit letting the user become, generate, and control electricity, capable of near-instant travel along conductive material and devastating lightning-based attacks.",
history: "Enel used this fruit to declare himself 'god' of the sky island Skypiea, ruling through a combination of raw lightning power and Mantra, an advanced form of Observation Haki that let him predict attacks before they happened. His reign ended the moment he faced Luffy, whose rubber body is naturally immune to electricity — the one common weakness his power could never account for. Exiled from Skypiea, Enel now explores the ruins of the moon in search of humanity's next frontier.",
powers: [
"Full transformation into lightning, immune to most physical attacks",
"El Thor and other massive lightning-strike attacks",
"Near-instant travel through conductive material",
"Mantra: advanced precognitive Observation Haki"
],
strengths: "Extreme speed and raw destructive power, further enhanced by near-perfect precognition through Mantra.",
weaknesses: "Immunity to rubber-bodied opponents like Luffy, whose lack of conductivity nullifies the fruit's electric attacks entirely.",
users: [{ id: 'enel', status: 'Current user' }]
},
{
id: 'baku-baku-no-mi', name: 'Baku Baku no Mi', englishName: 'Munch-Munch Fruit',
category: 'Paramecia', subtype: null, awakened: false, icon: '🍽️',
meaning: '"Baku Baku" — the sound of chomping/munching',
tagline: "Lets the user devour almost anything and fuse it into their own body.",
description: "A Paramecia fruit granting the ability to eat and absorb virtually any object — weapons, walls, even other people — fusing them into the user's own body to gain their properties.",
history: "Wapol, the deposed and gluttonous king of Drum Island, used this fruit to fuse cannons, castle gates, and weapons directly into his body, turning himself into a walking arsenal. His cowardice and greed made him a relatively minor threat compared to later villains, but his tyranny over Drum Island set the stage for Chopper's introduction to the Straw Hats.",
powers: [
"Devouring and absorbing objects, weapons, or materials into the user's body",
"Combining absorbed items to create new fused forms",
"Temporarily gaining the properties of whatever is absorbed (sharpness, hardness, etc.)"
],
strengths: "Extremely adaptable — can theoretically gain almost any physical property by eating the right object.",
weaknesses: "Absorbed forms are often unwieldy and can be defeated by targeting the user's underlying vulnerabilities, particularly cowardice-driven poor tactics in Wapol's case.",
users: [{ id: 'wapol', status: 'Current user' }]
},
{
id: 'noro-noro-no-mi', name: 'Noro Noro no Mi', englishName: 'Slow-Slow Fruit',
category: 'Paramecia', subtype: null, awakened: false, icon: '🐌',
meaning: '"Noro Noro" — sluggishly, slowly',
tagline: "Emits a beam that slows anything it touches to a crawl for thirty seconds.",
description: "A Paramecia fruit that fires a 'Noro Noro Beam,' slowing anything it hits — people, objects, even projectiles — to a fraction of their normal speed for a fixed thirty-second window.",
history: "Foxy used this fruit as the core trick behind his 'Davy Back Fight' ship-and-crew wagering games, slowing opponents just enough to cheat his way to victory without ever needing to fight fair. He briefly won Nico Robin away from the Straw Hats in one such game before Luffy reversed the beam back onto him and reclaimed her, humiliating Foxy in the process.",
powers: [
"Firing a beam that slows any struck target to a crawl for thirty seconds",
"Can be reflected off mirrored or reflective surfaces back onto the user",
"Effective on objects, projectiles, and living beings alike"
],
strengths: "Extremely disruptive in a fight, opening large windows for follow-up attacks against a slowed target.",
weaknesses: "The beam can be reflected back at the user with a mirror, and its effect is strictly time-limited.",
users: [{ id: 'foxy', status: 'Current user' }]
},
{
id: 'gasu-gasu-no-mi', name: 'Gasu Gasu no Mi', englishName: 'Gas-Gas Fruit',
category: 'Logia', subtype: null, awakened: false, icon: '☁️',
meaning: '"Gasu" — gas',
tagline: "Grants a body of living gas, capable of generating explosive or toxic clouds at will.",
description: "A Logia fruit letting the user become, generate, and control gas, useful for both toxic area-denial and, when ignited, explosive attacks.",
history: "Caesar Clown, a former Marine scientist turned rogue weapons developer, used this fruit's toxic gas to devastate Punk Hazard, experimenting on kidnapped children in the process. His partnership with Doflamingo to mass-produce chemical weapons made him a target for both Law and the Straw Hats, ending in his forced, resentful cooperation with Vegapunk's research team.",
powers: [
"Full transformation into gas, immune to most physical attacks",
"Generating large-scale toxic gas clouds",
"Igniting gas clouds for explosive area attacks",
"Compressing gas into concentrated blasts"
],
strengths: "Excellent area-denial and crowd-incapacitation potential through toxicity alone.",
weaknesses: "Vulnerable to strong winds dispersing the gas, and to Haki-based attacks like all Logia.",
users: [{ id: 'caesar-clown', status: 'Current user' }]
},
{
id: 'hira-hira-no-mi', name: 'Hira Hira no Mi', englishName: 'Flap-Flap Fruit',
category: 'Paramecia', subtype: null, awakened: false, icon: '🎴',
meaning: '"Hira Hira" — the fluttering of flat, thin objects',
tagline: "Lets the user flatten objects and people into two-dimensional, malleable sheets.",
description: "A Paramecia fruit that turns anything the user's cloak touches into a flat, two-dimensional object, which can then be folded, hidden, or repositioned before being restored to three dimensions.",
history: "Diamante hosted the rigged Corrida Colosseum tournament on Dressrosa, using his fruit both as a showman's gimmick and a genuinely disorienting combat tool, flattening doorways, terrain, and opponents alike to control the battlefield. His scheme to lure and kill the eventual winner of the tournament, secretly the bounty on the Mera Mera no Mi, was foiled when Sabo won and turned the tables.",
powers: [
"Flattening any object or person touched by the user's cloak into two dimensions",
"Folding, hiding, or repositioning flattened targets",
"Restoring flattened objects to normal at will",
"Traveling through gaps by flattening the user's own body"
],
strengths: "Extremely disorienting in combat, capable of erasing normal spatial reference points for opponents.",
weaknesses: "Requires direct contact with the user's cloak to activate the flattening effect.",
users: [{ id: 'diamante', status: 'Current user' }]
},
{
id: 'beta-beta-no-mi', name: 'Beta Beta no Mi', englishName: 'Sticky-Sticky Fruit',
category: 'Paramecia', subtype: null, awakened: false, icon: '🧪',
meaning: '"Beta Beta" — sticky, gooey',
tagline: "Coats the user's body in a corrosive, adhesive mucus that dissolves anything it traps.",
description: "A Paramecia fruit that generates a viscous, corrosive slime from the user's body, capable of trapping enemies and slowly dissolving whatever it engulfs.",
history: "Trebol has served the Donquixote Family since Doflamingo's earliest days as a pirate, making him one of the group's most trusted and longest-standing officers. His mucus can trap and corrode anything caught in it, a grotesque but highly effective tool against enemies unable to escape in time.",
powers: [
"Generating corrosive, adhesive mucus from the body",
"Trapping and slowly dissolving anything caught in the slime",
"Reshaping the mucus into weapons or restraints"
],
strengths: "Highly effective at both restraining and gradually destroying trapped opponents or objects.",
weaknesses: "The mucus itself moves relatively slowly and can potentially be avoided with speed or cut away before it fully corrodes a target.",
users: [{ id: 'trebol', status: 'Current user' }]
},
{
id: 'ishi-ishi-no-mi', name: 'Ishi Ishi no Mi', englishName: 'Stone-Stone Fruit',
category: 'Paramecia', subtype: null, awakened: false, icon: '🗿',
meaning: '"Ishi" — stone',
tagline: "Lets the user merge with and control stone, up to and including entire mountains.",
description: "A Paramecia fruit granting the ability to fuse with any stone structure and control it as an extension of the user's own body, on a scale limited mainly by how much stone is available.",
history: "Pica commanded entire mountainsides of Dressrosa during the rebellion against Doflamingo, fusing with the island's rock formations to create a giant stone battle form nearly as large as the city itself. His command over the terrain made him one of the hardest single obstacles for Luffy and the rebel forces to overcome, requiring Zoro's precision swordsmanship to finally bring him down.",
powers: [
"Merging with any stone structure to control it directly",
"Forming a giant humanoid battle body from surrounding rock",
"Traveling through solid stone at will"
],
strengths: "Scale is limited only by the amount of stone available, making it devastating on rocky or urban terrain.",
weaknesses: "Precision strikes that target the user's actual body hidden within the stone form can bypass the power's defenses entirely.",
users: [{ id: 'pica', status: 'Current user' }]
},
{
id: 'hoya-hoya-no-mi', name: 'Hoya Hoya no Mi', englishName: 'Genie-Genie Fruit... (Toy-Toy Fruit)', englishNameAlt: 'Toy-Toy Fruit',
category: 'Paramecia', subtype: null, awakened: false, icon: '🧸',
meaning: '"Hoya" — associated with toys/playthings in the fruit\'s effect',
tagline: "Turns anyone touched into an obedient, memory-erased living toy.",
description: "A Paramecia fruit that transforms any person touched by the user into a living toy — a soldier, a doll, an animal — stripping their memory of ever being human in the process.",
history: "Sugar, a child prodigy within the Donquixote Family, used this power to turn hundreds of Dressrosa's citizens into toys over a decade, erasing their memories and identities to keep the kingdom's true state secret from the outside world. Her eventual collapse and resulting amnesia during the rebellion accidentally reverted every one of her victims back to human, undoing years of suffering in a single moment.",
powers: [
"Transforming any touched person into a living toy of the user's choosing",
"Erasing the victim's memory of their former human life",
"Toy transformations are undone only if the user loses consciousness or dies"
],
strengths: "An extraordinarily quiet, insidious form of control — victims are rarely even aware anything has been taken from them.",
weaknesses: "All transformations reverse simultaneously the moment the user is knocked unconscious or killed.",
users: [{ id: 'sugar', status: 'Current user' }]
},
{
id: 'buki-buki-no-mi', name: 'Buki Buki no Mi', englishName: 'Weapon-Weapon Fruit',
category: 'Paramecia', subtype: null, awakened: false, icon: '🔫',
meaning: '"Buki" — weapon',
tagline: "Lets the user transform any part of their own body into a weapon.",
description: "A Paramecia fruit that turns parts of the user's own body — arms, legs, hair — into functional weapons, from swords to firearms to cannons.",
history: "Baby 5, raised within the Donquixote Family after being abandoned as a child, uses this fruit in combat with a deep, almost desperate need to prove her usefulness to those she serves. Her weaponized limbs make her a genuinely dangerous combatant despite her conflicted loyalties.",
powers: [
"Transforming body parts into bladed or firearm-based weapons",
"Combining multiple weaponized limbs for combo attacks",
"Firing projectiles directly from transformed limbs"
],
strengths: "Extremely adaptable in combat, able to switch between weapon types instantly without needing to carry gear.",
weaknesses: "Transformed limbs remain vulnerable to the same damage an ordinary weapon would take.",
users: [{ id: 'baby-5', status: 'Current user' }]
},
{
id: 'bari-bari-no-mi', name: 'Bari Bari no Mi', englishName: 'Barrier-Barrier Fruit',
category: 'Paramecia', subtype: null, awakened: false, icon: '🛡️',
meaning: '"Bari Bari" — a crackling, barrier-like sound',
tagline: "Lets the user generate unbreakable barriers anywhere around them at will.",
description: "A Paramecia fruit granting the ability to conjure barriers strong enough to block virtually any attack, from bullets to Haki-imbued strikes, at a range limited only by the user's control.",
history: "Bartolomeo, an obsessive fan of the Straw Hats since long before meeting them, used this fruit's near-impenetrable barriers to survive and thrive at the brutal Corrida Colosseum tournament on Dressrosa. His barriers later helped protect the Straw Hat Grand Fleet and allies during several large-scale conflicts in the New World.",
powers: [
"Generating barriers strong enough to block most physical and Haki-based attacks",
"Shaping barriers into offensive projectiles (Barrier Cannon)",
"Barriers can be formed around allies as well as the user"
],
strengths: "Near-total defensive coverage against a huge range of attack types, both physical and supernatural.",
weaknesses: "Sufficiently powerful, focused attacks (such as from top-tier Haki users) can still eventually break through.",
users: [{ id: 'bartolomeo', status: 'Current user' }]
},
{
id: 'ryu-ryu-no-mi-model-allosaurus', name: 'Ryu Ryu no Mi, Model: Allosaurus', englishName: 'Dragon-Dragon Fruit, Model: Allosaurus',
category: 'Zoan', subtype: 'Ancient Zoan', awakened: false, icon: '🦖',
meaning: '"Ryu" — dragon (used broadly for prehistoric reptiles)',
tagline: "An Ancient Zoan granting a ferocious allosaurus transformation.",
description: "A prehistoric Ancient Zoan fruit granting transformation into an allosaurus, prized for raw predatory strength and bite force.",
history: "X Drake, a former Marine Vice Admiral, staged an elaborate years-long undercover operation as a Worst Generation pirate captain, using his allosaurus form to maintain his cover among the New World's most dangerous rookies. His true Marine loyalties resurfaced during the Wano campaign against Kaido.",
powers: [
"Human, hybrid, and full allosaurus transformations",
"Powerful bite and claw-based attacks",
"Enhanced predatory speed and strength in hybrid form"
],
strengths: "Raw physical power and bite force make it a strong straightforward brawling transformation.",
weaknesses: "Less specialized than fruits with elemental or ranged capabilities, relying mainly on physical strength.",
users: [{ id: 'x-drake', status: 'Current user' }]
},
{
id: 'wara-wara-no-mi', name: 'Wara Wara no Mi', englishName: 'Straw-Straw Fruit',
category: 'Paramecia', subtype: null, awakened: false, icon: '🎎',
meaning: '"Wara" — straw',
tagline: "Lets the user transfer damage from their own body into straw effigies bound to them.",
description: "A Paramecia fruit that creates straw voodoo dolls linked to the user's own body, transferring any damage the dolls take away from the user, and vice versa when used offensively on marked targets.",
history: "Basil Hawkins, a stoic tarot-reading captain of the 'Worst Generation,' uses this fruit to make himself extraordinarily difficult to kill outright, since damage can be diverted into straw effigies rather than his real body. Hawkins later merged his crew into Eustass Kid's alliance during the assault on Onigashima, betting his own survival on the odds he reads before every fight.",
powers: [
"Transferring damage from the user's body into linked straw dolls",
"Creating effigies of other people to transfer damage onto them instead",
"Straw-based defensive and offensive constructs"
],
strengths: "Extremely difficult to kill outright, since fatal damage can often be redirected away from the user's real body.",
weaknesses: "Requires maintaining and protecting the straw dolls themselves; destroying all linked effigies removes the protection.",
users: [{ id: 'basil-hawkins', status: 'Current user' }]
},
{
id: 'shiro-shiro-no-mi', name: 'Shiro Shiro no Mi', englishName: 'Castle-Castle Fruit',
category: 'Paramecia', subtype: null, awakened: false, icon: '🏰',
meaning: '"Shiro" — castle',
tagline: "Turns the user's body into a mobile fortress capable of housing an entire crew.",
description: "A Paramecia fruit that transforms the user into a walking fortress, complete with interior space large enough to shelter dozens of people and cannons mounted along the exterior.",
history: "Capone 'Gang' Bege, a mafia-style pirate captain, used this fruit to smuggle his entire Fire Tank Pirates crew inside his own body during a secret assassination plot against Big Mom at Whole Cake Island, working alongside the Straw Hats and Vinsmoke family without ever fully revealing his own agenda.",
powers: [
"Transforming the body into a mobile, armed fortress",
"Housing an entire crew safely within the fortress interior",
"Mounted cannon attacks fired from the fortress exterior"
],
strengths: "Extremely useful for covert transport and as a mobile base of operations mid-battle.",
weaknesses: "The fortress form is a large, relatively slow-moving target compared to the user's normal body.",
users: [{ id: 'capone-bege', status: 'Current user' }]
},
{
id: 'jiki-jiki-no-mi', name: 'Jiki Jiki no Mi', englishName: 'Magnet-Magnet Fruit',
category: 'Paramecia', subtype: null, awakened: false, icon: '🧲',
meaning: '"Jiki" — magnetism',
tagline: "Grants control over magnetic force, able to assemble giant weapons from scrap metal.",
description: "A Paramecia fruit granting control over magnetism, letting the user attract, repel, and assemble metal objects into massive improvised weapons.",
history: "Eustass Kid, one of the most violent captains of the 'Worst Generation,' built his reputation on tearing apart enemy ships and assembling their metal wreckage into giant fists and cannons. His brutal, take-no-prisoners approach eventually carried him to Yonko-adjacent status, forging an uneasy alliance with Luffy and Law against Kaido and Big Mom.",
powers: [
"Attracting and repelling metal objects at will",
"Assembling scrap metal into giant weaponized limbs (Punk Rock, Damned Punk)",
"Magnetic manipulation of enemies' metal weapons and armor"
],
strengths: "Can generate overwhelming firepower on the fly from any metal debris in the environment.",
weaknesses: "Effectiveness is heavily reduced in areas without significant metal to manipulate.",
users: [{ id: 'eustass-kid', status: 'Current user' }]
},
{
id: 'nobu-nobu-no-mi', name: 'Nobu Nobu no Mi', englishName: 'Spring-Spring Fruit',
category: 'Paramecia', subtype: null, awakened: false, icon: '🌀',
meaning: '"Nobu(iru)" — to stretch/extend',
tagline: "Turns the user's limbs into springs, launching devastating rebound attacks.",
description: "A Paramecia fruit that turns the user's body into springs, allowing powerful compressed-and-released strikes and enhanced jumping mobility.",
history: "Bellamy mocked Luffy's dream of finding the One Piece before being humiliated in a one-sided fight that shattered his own arrogance. He later resurfaced as a subordinate of Donquixote Doflamingo, given a second chance to prove himself loyal after his old crew's collapse.",
powers: [
"Transforming limbs into springs for powerful rebound strikes",
"Enhanced jumping and mobility via spring-loaded legs",
"Storing kinetic energy for a single explosive release"
],
strengths: "Compressed spring attacks can deliver surprising one-hit knockout power for a relatively minor fruit.",
weaknesses: "Requires a wind-up to fully charge the spring effect, telegraphing the attack.",
users: [{ id: 'bellamy', status: 'Current user' }]
},
{
id: 'doku-doku-no-mi', name: 'Doku Doku no Mi', englishName: 'Poison-Poison Fruit',
category: 'Logia', subtype: null, awakened: false, icon: '☠️',
meaning: '"Doku" — poison',
tagline: "Grants a body of living poison, potent enough to dissolve nearly anything.",
description: "A Logia fruit letting the user become, generate, and control poison of varying potency, from mild toxins to a hyper-concentrated acid capable of dissolving almost any material.",
history: "Magellan has served as Impel Down's chief warden for years, his poison powerful enough to be genuinely dangerous even to his own body, requiring frequent, humiliating bouts of self-poisoning digestive trouble as an ironic side effect. His overwhelming toxicity made the great prison break one of the most dangerous operations any of its participants, including Luffy, ever survived.",
powers: [
"Full transformation into poison, immune to most physical attacks",
"Hydra: a massive multi-headed poison serpent attack",
"Venom Demon: a maximum-potency full-body poison state",
"Corroding and dissolving nearly any material on contact"
],
strengths: "Among the most lethal Logia fruits purely in terms of the toxicity of what the user's body becomes.",
weaknesses: "The poison's potency ironically affects the user's own digestive system, a recurring vulnerability for Magellan specifically.",
users: [{ id: 'magellan', status: 'Current user' }]
},
{
id: 'mato-mato-no-mi', name: 'Mato Mato no Mi', englishName: 'Mark-Mark Fruit',
category: 'Paramecia', subtype: null, awakened: false, icon: '🎯',
meaning: '"Mato" — target',
tagline: "Lets the user hurl any object at a marked target, no matter the distance, guaranteeing a hit.",
description: "A Paramecia fruit that lets the user place an invisible mark on any target they have seen; any object subsequently thrown by the user will unerringly track and strike that marked target, regardless of distance or obstacles.",
history: "Vander Decken IX has spent a decade obsessively 'courting' Princess Shirahoshi of Fishman Island from a distance, using this fruit to hurl massive objects — ships, buildings, icebergs — across vast stretches of ocean directly at her, undeterred by her repeated refusals or the risk to bystanders.",
powers: [
"Marking any previously seen target for guaranteed tracking hits",
"Thrown objects of any size will curve and travel to strike a marked target",
"Effective across extreme distances, limited mainly by the size of available objects"
],
strengths: "Guarantees a hit on any marked target regardless of distance, cover, or evasive movement.",
weaknesses: "Marks can potentially be transferred or the projectile intercepted before reaching the intended target.",
users: [{ id: 'vander-decken-ix', status: 'Current user' }]
},
{
id: 'nagi-nagi-no-mi', name: 'Nagi Nagi no Mi', englishName: 'Calm-Calm Fruit',
category: 'Paramecia', subtype: null, awakened: false, icon: '🔇',
meaning: '"Nagi" — calm, still (as in still water/silence)',
tagline: "Lets the user create a soundproof field of total silence around any area.",
description: "A Paramecia fruit that generates a bubble of absolute silence, blocking all sound from entering or escaping a chosen area — useful for stealth, ambush, or, as Corazon showed, saving lives under the cover of total quiet.",
history: "Rosinante, working undercover inside his own brother Doflamingo's crew as a Marine intelligence agent, used this fruit's silence to secretly cure Trafalgar Law of the Amber Lead Syndrome and to signal Sengoku with critical intelligence, all without his cover being blown. His final act — using the silence field to protect Law and the stolen Ope Ope no Mi during a desperate escape — cost him his life but saved the boy who would carry his legacy forward.",
powers: [
"Generating a soundproof field of total silence around a targeted area",
"Blocking all sound from entering or escaping the silenced zone",
"Useful for covert operations, ambushes, and hiding critical information exchanges"
],
strengths: "Perfect stealth utility, letting the user act, speak, or move without any risk of being overheard.",
weaknesses: "Provides no direct offensive or defensive combat power on its own, relying entirely on tactical application.",
users: [{ id: 'rosinante', status: 'Former user (deceased; used it to protect Law and the Ope Ope no Mi)' }]
},
{
id: 'toshi-toshi-no-mi', name: 'Toshi Toshi no Mi', englishName: 'Age-Age Fruit',
category: 'Paramecia', subtype: null, awakened: false, icon: '⏱️',
meaning: '"Toshi" — age/years',
tagline: "Lets the user alter their own age at will, from infancy to elderly, instantly shifting their physical capabilities.",
description: "A Paramecia fruit that grants control over the user's own biological age, shifting instantly between a toddler's small frame, an adult's peak strength, or an elder's frailty — each state carrying different physical trade-offs.",
history: "Jewelry Bonney, daughter of the mechanized former Warlord Bartholomew Kuma, has used this fruit both to survive and to protect her father, most dramatically during the assault on Egghead Island where she pushed the fruit's age-shifting to its most desperate extremes to save him from the World Government's forces.",
powers: [
"Shifting the user's own age between infant, child, adult, and elderly states at will",
"Adult forms grant significant boosts to physical strength and size",
"Elderly or infant states carry their own situational advantages and drawbacks"
],
strengths: "Extreme physical flexibility — the user can adapt their own body to whatever a situation demands, from raw strength to small-target evasion.",
weaknesses: "Age states carry real physical trade-offs; prolonged use at extremes can be exhausting or risky to sustain.",
users: [{ id: 'jewelry-bonney', status: 'Current user' }]
},
{
id: 'hito-hito-no-mi-model-daibutsu', name: 'Hito Hito no Mi, Model: Daibutsu', englishName: 'Human-Human Fruit, Model: Great Buddha',
category: 'Zoan', subtype: 'Mythical Zoan', awakened: false, icon: '🗿',
meaning: '"Hito" — human; Daibutsu, a Great Buddha statue',
tagline: "A Mythical Zoan granting transformation into a colossal golden Buddha.",
description: "A rare Mythical Zoan fruit granting transformation into a giant golden Buddha-like being, capable of devastating shockwave attacks and immense physical scale.",
history: "Sengoku wielded this fruit throughout his tenure as the Marines' Fleet Admiral, using its imposing golden form during the war at Marineford to help contain Whitebeard's assault. He carries the weight of that war's outcome — including Ace and Whitebeard's deaths — long after stepping down from active duty.",
powers: [
"Full transformation into a massive golden Buddha figure",
"Shockwave palm strikes capable of leveling large areas",
"Significant size and durability boost in transformed state"
],
strengths: "Combines huge physical scale with air-splitting shockwave attacks, ideal for large-scale battlefield control.",
weaknesses: "The form's size can be unwieldy in enclosed spaces or against fast, evasive opponents.",
users: [{ id: 'sengoku', status: 'Current user' }]
},
{
id: 'uta-uta-no-mi', name: 'Uta Uta no Mi', englishName: 'Song-Song Fruit',
category: 'Paramecia', subtype: null, awakened: false, icon: '🎤',
meaning: '"Uta" — song',
tagline: "Lets the user pull anyone who hears them sing into a shared dream world of their own making.",
description: "A Paramecia fruit that turns the user's singing voice into a gateway: anyone who hears the song can be drawn, body and mind, into an internal dream world the user controls — called Uta no Sekai — with the line between dream and reality blurring the longer a victim stays trapped inside.",
history: "The fruit's history before Uta is unrecorded. She ate it as a child growing up in secret aboard the Red Hair Pirates' ship, and an early, uncontrolled use of its power left her with a heart weakened for the rest of her life, a risk Shanks chose to shield her from rather than explain.\n\nYears later, performing as the world's most famous singer under a hidden identity, Uta used the fruit at her debut concert on the Island of Elegia to try to pull all of humanity permanently into Uta no Sekai as part of a plan she called \"New Genesis,\" believing a shared dream was kinder than a world full of pain. Monkey D. Luffy fought his way through the dream world to reach her and broke the technique, freeing everyone trapped inside — though the toll on Uta's own heart proved fatal soon after. (Introduced in One Piece Film: Red, a movie storyline outside the main manga/anime continuity.)",
powers: [
"Pulling anyone who hears the user sing into a shared dream world (Uta no Sekai)",
"Full sensory and bodily control over victims while they remain inside the dream",
"The dream world gradually merges with reality the longer victims stay trapped",
"Sufficiently powerful real-world attacks reaching a victim can forcibly eject them from the dream"
],
strengths: "Can incapacitate enormous crowds simultaneously with nothing but a song, requiring no direct contact.",
weaknesses: "Physically taxing on the user's own body and heart; victims can potentially be shocked back to reality by a strong enough attack.",
users: [{ id: 'uta', status: 'Current user (deceased)' }]
}
];

50
js/fruits.js Normal file
View File

@@ -0,0 +1,50 @@
/* Devil Fruit index page: search + category filter over FRUITS. */
(function () {
const grid = document.getElementById('fruit-grid');
const searchInput = document.getElementById('search-input');
const resultCount = document.getElementById('result-count');
const chipRow = document.getElementById('category-chips');
document.getElementById('stat-fruits').textContent = FRUITS.length;
document.getElementById('stat-paramecia').textContent = FRUITS.filter((f) => f.category === 'Paramecia').length;
document.getElementById('stat-zoan').textContent = FRUITS.filter((f) => f.category === 'Zoan').length;
document.getElementById('stat-logia').textContent = FRUITS.filter((f) => f.category === 'Logia').length;
const categories = ['All', 'Paramecia', 'Zoan', 'Logia'];
let activeCategory = 'All';
chipRow.innerHTML = categories.map((cat) =>
`<button type="button" class="chip${cat === activeCategory ? ' is-active' : ''}" data-cat="${cat}">${cat}</button>`
).join('');
function applyFilters() {
const term = searchInput.value.trim().toLowerCase();
const results = FRUITS.filter((f) => {
if (activeCategory !== 'All' && f.category !== activeCategory) return false;
if (term) {
const userNames = f.users.map((u) => (findCharacter(u.id) || {}).name || '').join(' ');
const haystack = `${f.name} ${f.englishName} ${f.tagline} ${userNames}`.toLowerCase();
if (!haystack.includes(term)) return false;
}
return true;
});
renderCardGrid(grid, results, fruitCardHTML, 'No Devil Fruits match your search.');
resultCount.textContent = `${results.length} of ${FRUITS.length} Devil Fruits`;
hydrateProperImages(grid);
}
chipRow.addEventListener('click', (e) => {
const btn = e.target.closest('.chip');
if (!btn) return;
activeCategory = btn.dataset.cat;
chipRow.querySelectorAll('.chip').forEach((c) => c.classList.toggle('is-active', c === btn));
applyFilters();
});
searchInput.addEventListener('input', applyFilters);
applyFilters();
})();

54
js/main.js Normal file
View File

@@ -0,0 +1,54 @@
/* Home page: character grid with search + affiliation + devil-fruit + deceased filters. */
(function () {
const grid = document.getElementById('character-grid');
const searchInput = document.getElementById('search-input');
const affiliationSelect = document.getElementById('affiliation-select');
const fruitOnlyCheckbox = document.getElementById('fruit-only-checkbox');
const deceasedOnlyCheckbox = document.getElementById('deceased-only-checkbox');
const resultCount = document.getElementById('result-count');
// Browsers may restore checkbox state across reloads; start with the full roster visible.
fruitOnlyCheckbox.checked = false;
deceasedOnlyCheckbox.checked = false;
document.getElementById('stat-characters').textContent = CHARACTERS.length;
document.getElementById('stat-fruits').textContent = FRUITS.length;
const affiliations = [...new Set(CHARACTERS.map((c) => c.affiliation))].sort((a, b) => a.localeCompare(b));
affiliations.forEach((aff) => {
const opt = document.createElement('option');
opt.value = aff;
opt.textContent = aff;
affiliationSelect.appendChild(opt);
});
function applyFilters() {
const term = searchInput.value.trim().toLowerCase();
const affiliation = affiliationSelect.value;
const fruitOnly = fruitOnlyCheckbox.checked;
const deceasedOnly = deceasedOnlyCheckbox.checked;
const results = CHARACTERS.filter((c) => {
if (fruitOnly && !c.devilFruit) return false;
if (deceasedOnly && !/deceased/i.test(c.status || '')) return false;
if (affiliation && c.affiliation !== affiliation) return false;
if (term) {
const haystack = `${c.name} ${c.epithet || ''} ${c.affiliation} ${c.role}`.toLowerCase();
if (!haystack.includes(term)) return false;
}
return true;
});
renderCardGrid(grid, results, characterCardHTML, 'No characters match your search. Try a different name or affiliation.');
resultCount.textContent = `${results.length} of ${CHARACTERS.length} characters`;
hydrateProperImages(grid);
}
searchInput.addEventListener('input', applyFilters);
affiliationSelect.addEventListener('change', applyFilters);
fruitOnlyCheckbox.addEventListener('change', applyFilters);
deceasedOnlyCheckbox.addEventListener('change', applyFilters);
applyFilters();
})();

228
js/portraits.js Normal file
View File

@@ -0,0 +1,228 @@
/* One Piece Wiki — original, procedurally generated portrait/icon artwork.
Every character gets a role-themed line-art medallion; every Devil Fruit gets a
stylized fruit-shape icon colored by type. All shapes are drawn from scratch here —
no external art or copyrighted imagery is used anywhere in this file. */
function radialLines(cx, cy, rInner, rOuter, count, strokeWidth) {
let out = '';
for (let i = 0; i < count; i++) {
const a = (Math.PI * 2 * i) / count;
const x1 = cx + rInner * Math.cos(a), y1 = cy + rInner * Math.sin(a);
const x2 = cx + rOuter * Math.cos(a), y2 = cy + rOuter * Math.sin(a);
out += `<line x1="${x1.toFixed(1)}" y1="${y1.toFixed(1)}" x2="${x2.toFixed(1)}" y2="${y2.toFixed(1)}" stroke-width="${strokeWidth}"/>`;
}
return out;
}
function starPoints(cx, cy, rOuter, rInner, count) {
const pts = [];
for (let i = 0; i < count * 2; i++) {
const r = i % 2 === 0 ? rOuter : rInner;
const a = (Math.PI * i) / count - Math.PI / 2;
pts.push(`${(cx + r * Math.cos(a)).toFixed(1)},${(cy + r * Math.sin(a)).toFixed(1)}`);
}
return pts.join(' ');
}
/* Simple original line-art built from primitive shapes (circles/lines/polygons) — one per archetype. */
const ROLE_ICONS = {
sword: '<g transform="rotate(45 32 32)"><line x1="32" y1="10" x2="32" y2="42"/><line x1="24" y1="18" x2="40" y2="18"/><line x1="32" y1="42" x2="32" y2="50"/></g><g transform="rotate(-45 32 32)"><line x1="32" y1="10" x2="32" y2="42"/><line x1="24" y1="18" x2="40" y2="18"/><line x1="32" y1="42" x2="32" y2="50"/></g>',
compass: `<circle cx="32" cy="32" r="18"/>${radialLines(32, 32, 15, 18, 12, 2)}<polygon points="32,21 37,32 32,43 27,32" fill="currentColor" stroke="none"/>`,
target: '<circle cx="32" cy="32" r="18"/><circle cx="32" cy="32" r="11"/><circle cx="32" cy="32" r="4" fill="currentColor" stroke="none"/>',
cross: '<line x1="32" y1="14" x2="32" y2="50"/><line x1="14" y1="32" x2="50" y2="32"/>',
scroll: '<rect x="16" y="20" width="32" height="24" rx="2"/><circle cx="16" cy="20" r="4"/><circle cx="16" cy="44" r="4"/><circle cx="48" cy="20" r="4"/><circle cx="48" cy="44" r="4"/><line x1="22" y1="28" x2="42" y2="28"/><line x1="22" y1="36" x2="42" y2="36"/>',
gear: `<circle cx="32" cy="32" r="9"/>${radialLines(32, 32, 12, 18, 8, 3)}`,
note: '<circle cx="23" cy="46" r="6"/><circle cx="43" cy="42" r="6"/><line x1="29" y1="46" x2="29" y2="16"/><line x1="49" y1="42" x2="49" y2="14"/><line x1="29" y1="16" x2="49" y2="14"/><line x1="29" y1="24" x2="49" y2="22"/>',
chefhat: '<path d="M20 44 h24 v6 h-24 z"/><path d="M22 44 C18 30 22 18 32 18 C34 12 44 12 46 18 C54 20 54 32 46 36 C46 40 46 42 44 44 h-22 C20 42 20 44 22 44 Z"/>',
flask: '<line x1="26" y1="12" x2="26" y2="26"/><line x1="38" y1="12" x2="38" y2="26"/><line x1="24" y1="12" x2="40" y2="12"/><path d="M26 26 L16 48 a4 4 0 0 0 4 6 h24 a4 4 0 0 0 4 -6 L38 26 Z"/><line x1="20" y1="40" x2="44" y2="40"/>',
anchor: '<circle cx="32" cy="16" r="5"/><line x1="32" y1="21" x2="32" y2="50"/><line x1="18" y1="30" x2="46" y2="30"/><path d="M18 38 a14 14 0 0 0 14 12"/><path d="M46 38 a14 14 0 0 1 -14 12"/>',
crown: '<polygon points="16,44 16,26 24,34 32,20 40,34 48,26 48,44"/><line x1="16" y1="44" x2="48" y2="44"/>',
tiara: '<path d="M16 40 Q32 16 48 40"/><circle cx="32" cy="22" r="4" fill="currentColor" stroke="none"/><line x1="16" y1="40" x2="48" y2="40"/>',
flag: '<line x1="20" y1="12" x2="20" y2="52"/><path d="M20 14 h26 l-8 9 8 9 h-26 z"/>',
dagger: '<line x1="32" y1="12" x2="32" y2="38"/><line x1="24" y1="20" x2="40" y2="20"/><polygon points="32,38 26,46 38,46"/>',
skull: '<circle cx="32" cy="28" r="16"/><circle cx="25" cy="26" r="3" fill="currentColor" stroke="none"/><circle cx="39" cy="26" r="3" fill="currentColor" stroke="none"/><path d="M24 38 h16 M26 44 h4 M34 44 h4"/>',
paw: '<circle cx="32" cy="38" r="10"/><circle cx="20" cy="24" r="5"/><circle cx="32" cy="18" r="5"/><circle cx="44" cy="24" r="5"/>',
wing: '<path d="M14 40 C22 24 30 18 34 30 C38 18 46 24 50 40 C40 34 40 40 34 34 C28 40 24 34 14 40 Z"/>',
star: `<polygon points="${starPoints(32, 32, 18, 8, 5)}"/>`,
};
const ROLE_ICON_RULES = [
[/navigat/, 'compass'],
[/sniper|marksman|sharpshoot/, 'target'],
[/doctor|medic|surgeon/, 'cross'],
[/archaeolog|scholar/, 'scroll'],
[/shipwright|engineer|mechanic/, 'gear'],
[/musician|singer/, 'note'],
[/cook|chef/, 'chefhat'],
[/scientist/, 'flask'],
[/helmsman|admiral|marine|navy|warden/, 'anchor'],
[/king|emperor|empress|yonko|shogun/, 'crown'],
[/princess|prince/, 'tiara'],
[/revolutionary/, 'flag'],
[/agent|spy|officer|assassin|cp0|cp9/, 'dagger'],
[/mink|beast|tiger|lion|leopard|wolf|dragon/, 'paw'],
[/phoenix|bird|wing|flight/, 'wing'],
[/swordsm|santoryu|blade|commander|combatant/, 'sword'],
[/captain|warlord|pirate/, 'skull'],
];
function iconKeyForCharacter(c) {
const haystack = `${c.role} ${c.epithet || ''} ${c.affiliation}`.toLowerCase();
for (const [re, key] of ROLE_ICON_RULES) {
if (re.test(haystack)) return key;
}
return 'star';
}
function characterImageTitle(c) {
return c.imageTitle || c.name;
}
function fruitImageTitle(f) {
if (f.imageTitle) return f.imageTitle;
if (f.id === 'gomu-gomu-no-mi') return 'Hito Hito no Mi, Model: Nika';
return f.name;
}
function properImageHTML(kind, title, label, fallback) {
return `
<span class="proper-image proper-image--${kind}" data-image-title="${escapeHtml(title)}" data-image-kind="${kind}">
<span class="proper-image__fallback">${fallback}</span>
<img class="proper-image__img" alt="${escapeHtml(label)}" loading="lazy" referrerpolicy="no-referrer" hidden>
</span>
`;
}
function characterPortraitFallbackSVG(c) {
const accent = accentFor(c);
const hue2 = (hashHue(c.id + 'x') + 45) % 360;
const icon = ROLE_ICONS[iconKeyForCharacter(c)] || ROLE_ICONS.star;
const uid = c.id.replace(/[^a-z0-9]/g, '');
const rotation = hashHue(c.name) % 90;
const fruit = c.devilFruit ? findFruit(c.devilFruit) : null;
return `
<svg viewBox="0 0 64 64" role="img" aria-label="${escapeHtml(c.name)} portrait" class="portrait-svg">
<defs>
<linearGradient id="g-${uid}" x1="0%" y1="0%" x2="100%" y2="100%">
<stop offset="0%" stop-color="${accent}"/>
<stop offset="100%" stop-color="hsl(${hue2}, 55%, 26%)"/>
</linearGradient>
<pattern id="p-${uid}" width="9" height="9" patternTransform="rotate(${rotation})" patternUnits="userSpaceOnUse">
<line x1="0" y1="0" x2="0" y2="9" stroke="rgba(255,255,255,0.09)" stroke-width="2"/>
</pattern>
</defs>
<circle cx="32" cy="32" r="32" fill="url(#g-${uid})"/>
<circle cx="32" cy="32" r="32" fill="url(#p-${uid})"/>
<circle cx="32" cy="32" r="30.5" fill="none" stroke="rgba(255,255,255,0.18)" stroke-width="1"/>
<g fill="none" stroke="#fdf6e3" stroke-width="3.1" stroke-linecap="round" stroke-linejoin="round" opacity="0.95">${icon}</g>
${fruit ? `<circle cx="49" cy="49" r="11.5" fill="#0b1220" stroke="#fdf6e3" stroke-width="1.5"/><text x="49" y="53.5" font-size="12" text-anchor="middle">${fruit.icon}</text>` : ''}
</svg>
`;
}
const CATEGORY_HEX = { Paramecia: '#a06cd5', Zoan: '#4c9a5a', Logia: '#3f9bd0' };
function fruitPortraitFallbackSVG(f) {
const color = CATEGORY_HEX[f.category] || '#e3b04b';
const glow = f.subtype && /mythical|special/i.test(f.subtype);
const uid = f.id.replace(/[^a-z0-9]/g, '');
return `
<svg viewBox="0 0 64 64" role="img" aria-label="${escapeHtml(f.name)} icon" class="portrait-svg">
<defs>
<radialGradient id="fg-${uid}" cx="35%" cy="28%" r="80%">
<stop offset="0%" stop-color="${color}" stop-opacity="0.9"/>
<stop offset="100%" stop-color="${color}" stop-opacity="0.28"/>
</radialGradient>
</defs>
<circle cx="32" cy="34" r="32" fill="#0b1220"/>
<path d="M32 14 C21 14 13 23 13 34 C13 47 21 54 32 54 C43 54 51 47 51 34 C51 23 43 14 32 14 Z"
fill="url(#fg-${uid})" stroke="${glow ? '#e3b04b' : color}" stroke-width="2.2"/>
<path d="M32 14 C30 9 31 5 36 3" fill="none" stroke="#7a9b57" stroke-width="3" stroke-linecap="round"/>
<path d="M20 27 C25 23 39 23 44 27" fill="none" stroke="rgba(255,255,255,0.32)" stroke-width="2" stroke-linecap="round"/>
<path d="M22 40 C27 44 37 44 42 40" fill="none" stroke="rgba(0,0,0,0.18)" stroke-width="2" stroke-linecap="round"/>
<text x="32" y="41" font-size="19" text-anchor="middle">${f.icon}</text>
</svg>
`;
}
function characterPortraitSVG(c) {
return properImageHTML('character', characterImageTitle(c), `${c.name} portrait`, characterPortraitFallbackSVG(c));
}
function fruitPortraitSVG(f) {
return properImageHTML('fruit', fruitImageTitle(f), `${f.name} fruit`, fruitPortraitFallbackSVG(f));
}
const IMAGE_CACHE_KEY = 'opwikiProperImages:v1';
const IMAGE_API_ENDPOINT = 'https://onepiece.fandom.com/api.php';
let properImageCache = null;
function getProperImageCache() {
if (properImageCache) return properImageCache;
try {
properImageCache = JSON.parse(localStorage.getItem(IMAGE_CACHE_KEY) || '{}');
} catch (_) {
properImageCache = {};
}
return properImageCache;
}
function saveProperImageCache() {
try {
localStorage.setItem(IMAGE_CACHE_KEY, JSON.stringify(getProperImageCache()));
} catch (_) {
// Non-critical: images still load for the current page if storage is unavailable.
}
}
function wikiThumbnailUrl(title, size = 700) {
const params = new URLSearchParams({
action: 'query',
prop: 'pageimages',
format: 'json',
piprop: 'thumbnail',
pithumbsize: String(size),
redirects: '1',
origin: '*',
titles: title,
});
return `${IMAGE_API_ENDPOINT}?${params.toString()}`;
}
async function resolveProperImage(title) {
const cache = getProperImageCache();
if (Object.prototype.hasOwnProperty.call(cache, title)) return cache[title];
const response = await fetch(wikiThumbnailUrl(title));
if (!response.ok) throw new Error(`Image lookup failed for ${title}`);
const data = await response.json();
const page = Object.values(data.query?.pages || {})[0];
const source = page?.thumbnail?.source || '';
cache[title] = source;
saveProperImageCache();
return source;
}
function hydrateProperImages(root = document) {
const holders = [...root.querySelectorAll('.proper-image[data-image-title]')];
holders.forEach(async (holder) => {
const img = holder.querySelector('.proper-image__img');
if (!img || holder.dataset.loaded) return;
holder.dataset.loaded = 'pending';
try {
const source = await resolveProperImage(holder.dataset.imageTitle);
if (!source) throw new Error('No thumbnail returned');
img.addEventListener('load', () => {
holder.classList.add('is-loaded');
img.hidden = false;
}, { once: true });
img.src = source;
holder.dataset.loaded = 'true';
} catch (_) {
holder.dataset.loaded = 'fallback';
}
});
}

View File

@@ -1,118 +0,0 @@
:root {
color-scheme: dark;
}
* {
box-sizing: border-box;
}
body {
margin: 0;
font-family: Arial, Helvetica, sans-serif;
background: #0f1320;
color: #f0f4ff;
line-height: 1.5;
}
.page-header {
text-align: center;
padding: 2.5rem 1rem 2rem;
background: #171d2d;
border-bottom: 1px solid #2f3953;
}
.page-header h1 {
margin: 0;
}
.page-header p {
margin: 0.5rem 0 0;
color: #c6d3ef;
}
.content {
width: min(1080px, 94%);
margin: 1.5rem auto 2rem;
display: grid;
gap: 1rem;
}
.card {
background: #161d2d;
border: 1px solid #2f3953;
border-radius: 12px;
padding: 1rem 1.25rem;
}
.toolbar h2 {
margin: 0 0 0.25rem;
}
.toolbar p {
margin: 0 0 0.75rem;
color: #c6d3ef;
}
.toolbar-actions {
display: flex;
flex-wrap: wrap;
gap: 0.5rem;
}
button {
border: 1px solid #4b5c85;
background: #263453;
color: #f0f4ff;
padding: 0.5rem 0.8rem;
border-radius: 8px;
font: inherit;
cursor: pointer;
}
button:hover {
background: #32456d;
}
button.danger {
background: #593040;
border-color: #80465d;
}
button.danger:hover {
background: #6c394d;
}
.fruit-grid {
display: grid;
grid-template-columns: repeat(auto-fit, minmax(220px, 1fr));
gap: 1rem;
}
.fruit-card {
background: #161d2d;
border: 1px solid #2f3953;
border-radius: 12px;
overflow: hidden;
}
.fruit-card img {
width: 100%;
height: 160px;
object-fit: cover;
display: block;
}
.fruit-info {
padding: 0.8rem 0.9rem 1rem;
}
.fruit-info h3 {
margin: 0 0 0.45rem;
font-size: 1.05rem;
}
.fruit-info p {
margin: 0.2rem 0;
color: #dbe4fa;
font-size: 0.95rem;
}