Drag in multiple individual sprite images, auto-arrange into a Sprite Sheet and generate JSON Atlas.
拖入多張個別動作圖片,自動排成 Sprite Sheet 大圖並產生 JSON Atlas。
Import a pre-built sprite sheet, auto-slice into cells. Empty cells(transparent) can be filled with new sprites.
匯入一張已拼好的大圖,自動切割成格子。空格子(透明)可以補上新動作。 ?
Every character in LF2 Remastered is controlled by a .txt data file. Think of it like a blueprint — it tells the game how the character looks, moves, attacks, and uses skills.
每個角色都由一個 .txt 資料檔 控制。你可以把它想成角色的「設計圖」— 決定角色的外觀、動作、攻擊方式和招式。
<bmp> block = The "address book" — tells the game which image files to use.
<bmp> 區塊 = 「地址簿」— 告訴遊戲要用哪些圖片檔案。
<f> blocks = The "animation frames" — each one is a snapshot of the character at one moment. Standing, punching, jumping, casting a skill... every action is made of frames.
<f> 區塊 = 「動畫幀」— 每一個都是角色在某個瞬間的樣子。站著、出拳、跳躍、放招… 每個動作都由幀組成。
Imagine a flipbook — each page has a slightly different picture. Flip through them fast, and you get animation! That's exactly how LF2 works.
想像一本翻頁書 — 每一頁的圖片都稍微不同。快速翻過去,就變成動畫!LF2 的角色動作原理完全一樣。
| Property | 中文 | Meaning(意思) |
|---|---|---|
| pic | 圖片 | Which picture to show — like the page number in a flipbook 顯示哪張圖片 — 就像翻頁書的頁碼 |
| wait | 等待 | How long to stay on this frame (higher = slower animation) 停留多久(數字越大,動作越慢) |
| next | 下一幀 | Which frame comes after this one. 999 = go back to standing 接下來跳到哪一幀。999 = 回到站立 |
| state | 狀態 | What is the character doing? (0=idle, 3=attacking, 7=defending...) 角色正在做什麼?(0=待機, 3=攻擊中, 7=防禦中…) |
| State | Meaning(意思) |
|---|---|
| 0 | Standing / Idle(站立) |
| 1 | Walking(走路) |
| 2 | Running(跑步) |
| 3 | Attacking(攻擊中) — most skills use this(大部分招式用這個) |
| 7 | Defending(防禦中) |
| 9 | Grabbing someone(抓人中) |
| 15 | General action(一般動作) — versatile(萬用) |
| 18 | On fire(著火) — character is burning(角色燒起來) |
| 4 | Jumping(跳躍) |
| 5 | Dashing(衝刺) |
| 6 | Rowing / dodge roll(翻滾迴避) |
| 8 | Broken defend(破防) |
| 10 | Picked / caught(被抓) |
| 11 | Injured(受傷) |
| 12 | Only hittable when fall>60(僅 fall>60 時可命中) |
| 14 | Lying down(躺地) — COM won't chase(COM不追擊) |
| 16 | Tired / dizzy(疲倦/暈眩) — enemy can grab(可被敵人抓) |
| 100 | Landing without crouch(落地不蹲) |
| 301 | Deep dash sword(Deep衝劍) — can move up/down(可上下移動) |
| 400 | Teleport to nearest enemy(傳送到最近敵人) |
| 401 | Teleport to nearest ally(傳送到最近隊友) |
| 500 | Transform(Rudolf變身) |
| 1700 | Heal self(自我回血) |
wait to a bigger number, then press Play to see the animation slow down!wait 改大一點,然後按播放看看動畫是不是變慢了!
When you play LF2, you press key combos like D→A or DJA to use skills. But how does the game know what to do?
玩 LF2 的時候,你按 D→A 或 DJA 來發招。但遊戲怎麼知道要做什麼呢?
The answer is in the standing frames (frame 0~4). These frames have hit_* properties that say: "When this key combo is pressed, jump to frame X."
答案在站立幀(frame 0~4)裡。這些幀有 hit_* 屬性:「按下這個按鍵組合時,跳到第 X 幀。」
| Property | Key Combo(按鍵) | Input(輸入法) |
|---|---|---|
| hit_Fa | → + A | D → A (Forward Attack / 前+攻擊) |
| hit_Da | ↓ + A | D ↓ A (Down Attack / 下+攻擊) |
| hit_Ua | ↑ + A | D ↑ A (Up Attack / 上+攻擊) |
| hit_Fj | → + J | D → J (Forward Jump / 前+跳) |
| hit_Dj | ↓ + J | D ↓ J (Down Jump / 下+跳) |
| hit_Uj | ↑ + J | D ↑ J (Up Jump / 上+跳) |
| hit_ja | J + A | D J A (Jump+Attack / 跳+攻擊) |
The value of hit_* is the frame number the character jumps to. For example:
hit_* 的值就是角色要跳到的幀編號。例如:
Skills cost MP! Set it on the first frame of the skill using the mp property:
招式會消耗魔力!在招式的第一幀用 mp 屬性設定:
mp 4300 = 40 HP + 300 MP). Negative mp = recover HP or MP (mp -50 = gain 50 MP). In a skill chain, only the first hit_*-linked frame's positive mp is consumed — subsequent frames need negative values to take effect.mp 4300 = 扣 40 HP + 300 MP)。負值 mp = 加血或加 MP(mp -50 = 回復 50 MP)。招式連鎖中,僅第一個 hit_* 連結的 frame 寫正值 mp 才消耗,第二個以後須寫負值才有效。
hit_* values on the right panel. Change hit_Fa to a different frame number and see what happens in-game!hit_* 值。把 hit_Fa 改成其他幀編號,進遊戲看看會怎樣!
A skill isn't just one frame — it's a chain of frames linked by next. Each frame shows a picture, waits a bit, then moves to the next one.
一個招式不只是一幀 — 而是用 next 串起來的一連串幀。每幀顯示一張圖,停一下,再跳到下一幀。
wait controls how long each frame lasts. Lower = faster animation, higher = slower.
wait 控制每幀持續多久。數字越小 = 動作越快,數字越大 = 動作越慢。
| wait value | Speed(速度) |
|---|---|
| 1 | Very fast(非常快) — blink and you'll miss it |
| 2~3 | Normal attack speed(一般攻擊速度) |
| 4~5 | Standing/walking speed(站立/走路速度) |
| 8~10 | Slow, dramatic(慢,有戲劇感) |
Use dvx and dvy to make the character move during a frame:
用 dvx 和 dvy 讓角色在幀中移動:
| Property | Effect(效果) |
|---|---|
| dvx 5 | Move forward(向前移動) |
| dvx -5 | Move backward(向後移動) |
| dvy -10 | Jump up(向上跳)— negative = up! |
| dvx 550 | Freeze in place(原地不動) — special value! |
next Values(特殊 next 值)| Value | Meaning(意思) |
|---|---|
| 999 | Return to standing(回到站立) |
| 1280 | Rudolf stealth(隱身) — 1200~1299 are all stealth; last 2 digits = duration ticks(末兩位數=持續時間) |
| Negative(負值) | Reverse direction then jump to |next|(反轉方向後跳到絕對值幀). E.g. next -250 = flip & go to f250 |
A frame with just pic/wait/next looks like animation but doesn't actually hit anyone! You need an <i> block (itr) to create an attack hitbox.
只有 pic/wait/next 的幀看起來有動畫,但打不到人!你需要 <i> 區塊 (itr) 來建立攻擊判定框。
| Property | 中文 | Effect(效果) |
|---|---|---|
| kind | 種類 | Attack type — see Kind table below(攻擊類型,見下方 Kind 表) |
| x, y | 位置 | Attack box top-left corner(攻擊框左上角座標) |
| w, h | 寬高 | Attack box width & height(攻擊框的寬度和高度) |
| dvx | 擊退X | How far enemy is pushed back(敵人被推多遠) |
| dvy | 擊退Y | Upward knockback — use negative!(向上擊飛 — 用負數!) |
| dvz | 擊退Z | Depth knockback(Z軸擊退,場地縱深方向) |
| injury | 傷害 | Damage dealt (negative value = healing) — 造成的傷害值(負值為治療) |
| fall | 倒地值 | Accumulates! 25=hit 2x dizzy, 40=hit 1x stagger, 60=hit 1x dizzy, 70=guaranteed knockdown(必倒) |
| arest | 攻方冷卻 | After hitting someone, how long before you can hit the next person(打到人後多久能再打下一個) |
| vrest | 受方冷卻 | Same-frame hit interval — lower = more hits per frame. Min 4 or character freezes!(同幀打人間隔,越小同幀打越多下,最低4否則會卡住) |
| bdefend | 破防值 | Accumulates >60 = break defense. 100 = unblockable + destroy weapon!(累計>60破防,如16打4下破,100=完全擋不住+摧毀武器) |
| effect | 特效 | Visual/damage effect — see Effect table below(視覺/傷害特效,見下方 Effect 表) |
| catchingact | 抓人動作 | For kind 1,3: your frame after grabbing(kind 1,3 用:抓住後自己跳到的幀,需寫兩次) |
| caughtact | 被抓動作 | For kind 1,3: enemy's frame after being grabbed(kind 1,3 用:被抓者跳到的幀) |
| zwidth | Z軸寬度 | Z-axis attack range for large AoE attacks(大範圍攻擊的Z軸攻擊範圍) |
| Effect | Meaning(意思) |
|---|---|
| 0 | Punch(拳擊) — default(預設) |
| 1 | Blade(利器攻擊) — enemy bleeds(敵人會流血) |
| 2 | Fire(著火) — enemy catches fire(敵人著火) |
| 3 | Ice(結冰) — enemy freezes(敵人結冰) |
| 4 | Through enemy(穿過敵人) — only hits type 1~6 objects(僅能打中物件,不打人) |
| 20 | Fixed fire(定身火) — can't combo(無法連打) |
| 21 | Fire + safe(著火) — state 18 won't hit your allies(著火狀態不打同盟) |
| 22 | Fixed fire + dual(定身火+雙向) — state 18 safe, negative dvx = enemies fly both sides(dvx 負值時敵人向前後兩邊飛,如大轟炸) |
| 23 | Punch + dual(拳擊+雙向) — negative dvx = enemies fly both sides(dvx 負值時敵人向前後兩邊飛,如極級破壞波爆炸) |
| 30 | Fixed ice(定身冰) — can't combo(無法連打) |
Tip: effect can be negative = effect without sound(effect 可加負號 = 有效果但無音效). E.g. effect -2 = fire with no sound. Only works with kind 0.(僅 kind 0 時有作用)
fall values accumulate(累積)! If you hit someone 3 times with fall 25, that's 75 total — they'll fall down!fall 值會累計!打 3 次 fall 25 = 75,敵人就會倒地!
| Kind | Meaning(意思) |
|---|---|
| 0 | Normal attack(特殊攻擊) — effect decides punch/blade/fire/ice(配合 effect 決定拳/利器/火/冰) |
| 1 | Grab dizzy(抓暈眩者) — enemy must be state 16, needs catchingact/caughtact(對方需 state 16) |
| 2 | Pick up weapon(拾起武器) — like frame 60 punch(如出拳 frame 60) |
| 3 | Forced grab(強制抓人) — ignores enemy state(無視對方狀態) |
| 4 | Thrown hit(摔出才生效) — damage only when thrown by cpoint(被 cpoint 丟出時才有傷害) |
| 5 | Weapon decides(視情況而定) — weapon's wpoint attacking value decides(由持有者 wpoint 的 attacking 決定) |
| 6 | Heavy punch zone(重擊區) — press A near enemy triggers super_punch act 70(敵人靠近按A觸發重拳) |
| 7 | Pick + no interrupt(撿武器不中斷) — pick up without stopping action(撿武器且不影響動作,如迴避 f102~107) |
| 8 | Heal(治療) — damage = heal amount, jump to dvx frame(補血量=damage值,動作跳至 dvx 指定幀) |
| 9 | Self-destruct(自爆) — your HP goes to 0 when hitting enemy(打中敵人自己 HP 歸零,如 John 防護罩) |
| 10 | Henry's sonata(Henry 魔王之樂章) |
| 11 | Henry's sonata B(Henry 魔王之樂章 B) |
| 14 | Blocking wall(阻擋) — blocks passage in range(範圍內無法通過,如被冰封的人) |
| 15 | Whirlwind launch(飛起) — like white tornado(如白色龍捲風效果) |
| 16 | Whirlwind freeze(結冰) — like white tornado(如白色龍捲風效果) |
injury to see the damage change!injury 看傷害變化!
Want your character to shoot fireballs? Summon helpers? Drop healing items? That's what <o> (opoint) does — it spawns an object at a specific position.
想讓角色發射火球?召喚幫手?掉落補品?這就是 <o> (opoint) 的功能 — 在指定位置生成一個物件。
| Property | 中文 | Effect(效果) |
|---|---|---|
| oid | 物件ID | Which object to spawn — its ID in _data.txt(生成哪個物件) |
| x, y | 位置 | Where to spawn it, relative to character(相對角色的生成位置) |
| action | 動作 | Which frame the spawned object starts at(讓物件的圖檔從哪幀開始) |
| facing | 朝向 | 0=same direction, 1=opposite(0=同向, 1=反向) |
| oid | Object(物件) |
|---|---|
| 122 | Milk(牛奶) — heals HP! |
| 123 | Beer(啤酒) — heals but makes drunk |
| 200 | John's ball(John 的氣功波) |
| 203 | Deep's ball(Deep 的氣功波) |
| 207 | Davis's ball(Davis 的氣功波) |
Lilith's DJA (hit_ja 365) spawns milk + blessing angel + forward shield + backward shield and heals herself:
Lilith 的 DJA(hit_ja 365)會生成牛奶 + 祝福天使 + 正向防護壁 + 反向防護壁,並且治療自己:
_data.txt and search for the id number. E.g. id: 122 → file: weapon6-r = milk(牛奶). id: 248 → file: lilith_jball-r = shield(防護壁). id: 251 → file: lilith_jchaseh-r = blessing angel(祝福天使)._data.txt 搜尋 id 編號。例如 id: 122 → file: weapon6-r = 牛奶。id: 248 → file: lilith_jball-r = 祝福天使。
oid must match an ID registered in _data.txt! If the ID doesn't exist, nothing will appear.oid 必須對應 _data.txt 裡註冊的 ID!如果 ID 不存在,什麼都不會出現。
oid it uses!oid!
Defines where the character can be hit. No bdy = invincible during that frame!
定義角色可以被打到的範圍。沒有 bdy = 那一幀是無敵的!
Defines where a held weapon appears on the character.
定義角色手持武器時,武器出現的位置。
Defines the mouth/lip position for the bleeding effect. When HP drops below 1/3, the character bleeds at this point.
定義角色嘴角位置,用於流血效果。當 HP 低於 1/3 時,角色會在這個位置流血。
Controls grabbing enemies and throwing them. Used in catching frames (f120+).
控制抓取敵人和丟人。用在抓取幀(f120 以後)。
Each character has Sprite Sheets — big images with many small frames arranged in a grid, like a contact sheet of photos.
每個角色有Sprite Sheets — 大圖裡面排了很多小格子,就像照片底片一樣。
| Part | Meaning(意思) |
|---|---|
| 0-69 | This sheet contains pic numbers 0 through 69(這張圖包含 pic 0~69) |
| sys/deep-r_0 | Image file path(圖檔路徑,在 _res_pngs/ 下) |
| w 90 h 90 | Each cell is 90x90 logical pixels. The actual PNG is 3x larger (270x270) because of resized 3 in <bmp>. The game divides the PNG by 3 to get the real cell size.(每格邏輯上是 90x90,但實際 PNG 是 3 倍大(270x270),因為 <bmp> 裡寫了 resized 3,遊戲會自動除以 3) |
| row 10 | 10 cells per row (horizontal)(每行 10 格) |
| col 7 | 7 rows total (vertical)(共 7 行) |
When a frame says pic 15, the game looks at row 1, column 5 in this grid (counting from 0).
當一幀設定 pic 15,遊戲就去這個格子表的第 1 行第 5 個找圖(從 0 開始數)。
When you need new frames for a new skill, you can:
當你需要新招式的圖片時,你可以:
1. Use empty cells — some cells in existing sheets might be unused
1. 使用空格 — 現有大圖裡可能有沒用到的格子
2. Add a new sheet — use the IDE's Sprite Sheet Builder(🧩 Tools)
2. 新增一張大圖 — 用 IDE 的拼圖工具(🧩 Tools)
Let's see how a complete skill works — from input trigger, to character animation, to projectile behavior!
來看一個完整的招式是怎麼運作的 — 從按鍵觸發、角色動畫、到氣功波行為!
In Julian's standing frames (f0~f4), there is hit_Fj 280. This means: when the player presses D→J, the character jumps to frame 280.
在 Julian 的站立幀(f0~f4)裡,有 hit_Fj 280。意思是:當玩家按 D→J 時,角色會跳到 第 280 幀。
hit_* values, so the skill triggers from any idle pose!hit_*,這樣不管站在哪個姿勢都能發招!Here's Julian's D→J skill (f280~291). Charge energy → fire a big ball → return to standing:
以下是 Julian 的 D→J 招式(f280~291)。蓄力 → 發射大氣功波 → 回到站立:
The big ball (oid 229) is defined in its own file
julian_ball2-r.txt. The character only "spawns" it — the object's behavior is in the object's file:
大氣功波(oid 229)在自己的檔案
julian_ball2-r.txt 裡定義。角色只負責「生出來」,物件的行為在物件自己的檔案裡:
julian_ball2-r.txt,不是改角色檔。state 3006 (piercing) then changes to state 3000 (normal) via hit_d. This two-stage design makes it pierce through at first, then explode on hit later!state 3006(穿透),再透過 hit_d 切換到 state 3000(一般)。兩階段設計:先穿透一切,時間到後打到人才爆炸!hit_a = time decay rate, hit_d = act when time expires, hit_Fa = tracking mode.hit_a=時間消耗速率, hit_d=時間到跳到的act, hit_Fa=追蹤模式。不要跟角色的 hit_ 搞混!
Open Julian's file in the IDE, go to frame 280, and try changing these values:
在 IDE 裡打開 Julian 的檔案,跳到 frame 280,試著改這些值:
1. Change mp 125 in f280 to mp 0 — free skill, no MP cost!
1. 把 f280 的 mp 125 改成 mp 0 — 免費放招,不消耗魔力!
2. Change the opoint's oid in f289 to a different object (e.g. oid 122 = milk!)
2. 把 f289 的 opoint oid 改成別的物件(例如 oid 122 = 牛奶!)
3. Click Apply(套用修改) → Save(💾) → test in game with D→J!
3. 按 Apply → Save → 進遊戲按 D→J 測試!
<o kind 1 x 80 y 40 oid 203 action 0 facing 0 o>sound mp3/020effect 2 in itr to add fire damage!<o kind 1 x 80 y 40 oid 203 ...o>sound mp3/020 加音效effect 2 加火焰傷害!