Navigation

Modules

루프 블록은 모듈로 한 벌만, 루프마다 레시피로 조립. 폴더, 레시피와 모듈 형식, 조립 규칙, base와 블록 사이 이름, 작업 순서, 옮긴 기록. 스크립트 모양과 이름 규칙은 Conventions, Razor 함정은 Razor.

00 한눈에

절내용
01모듈로 나누는 이유, 게임 안에서 스크립트를 이어 달리지 않는 이유
02폴더별 내용
03레시피 모양, 일회성 레시피, 블록 상자 내용, 블록 여러 개를 한 조건으로 묶는 그룹
04모듈 파일 하나의 모양
05조립기가 만드는 것과 막는 것
06base 내용, 블록 사이에 주고받는 것
07값 변경, 블록 추가와 제거, 새 동작 추가 순서
082026-10-10 옮기고 다시 짜며 바뀐 것
09아직 옮기지 않은 것

루프별 인게임 확인 항목: Open items. 09절 lumberjack-enhanced, 10절 pvp, 11절 skinning-enhanced, 12절 tamer-mage-enhanced, 14절 bard-necro-enhanced, 15절 loadout과 regear, 16절 bard-archer-enhanced, 18절 tamer-archer-enhanced.

설계

01 왜 모듈인가

같은 블록이 루프마다 복사돼 있었음.

조립은 저장소에서. Razor는 한 번에 스크립트 하나, 다른 스크립트를 켜면 지금 것이 멈춤. 함수 호출, include 없음. 게임 안에서 모듈 스크립트를 차례로 켜는 방식은 쓰지 않음. 이유:

조립 결과물은 예전과 같은 .razor 파일 하나. 게임과 핫키는 그대로.

네 가지 원칙.

  1. 모듈 파일 하나 = 블록 하나. 모든 모듈이 같은 칸을 같은 순서로(04절)
  2. 블록이 아닌 공용 바탕은 module/base.razor 한 파일. 모든 레시피의 첫 블록(06절)
  3. 레시피는 블록마다 상자 하나. 상자 안은 조립기가 씀(블록이 하는 일, 바꾸는 설정의 설명, 기본값, 함께 읽는 블록). 값은 상자 밑. 사람은 바꿀 값과 이유만(03절)
  4. 모듈과 레시피는 같은 모양. 설명은 - 상자 안, 설명을 받는 줄은 상자 밑에 이어 붙임(03절, 04절)

02 폴더

자리맡는 것모듈
module/base.razor모든 루프와 루틴의 뼈대공용 설정, 표준 대기, 경고 간격, 블록 사이 신호, 구조적 PvP 정지, 시작 4줄, 패스 끝 대기(06절)
module/recovery/살아남기cure(마비면 파우치, 독이면 포션이나 에이전트), heal, bandage, light-heal, refresh, heal-first(루틴 시작에 먼저 힐)
module/magery/공격 주문과 시약reagents(모든 마법 블록이 읽는 시약 표시와 서클별 마나), rotation(Mana Drain과 Curse, Grimoire 프록 넷, 그 사이 Energy Bolt), flamestrike(aspect 발동용)
module/buff/버프 아이콘 유지spells(Reactive Armor, Magic Reflection, 설정에 따라 Protection, Bless, Arch Protection, Spell Siphon용 자기 Magic Arrow), potions(Strength, Agility, Magic Resist), food(Food Satisfaction), mushroom(Magic Mushroom 먹기와 Create Food)
module/bard/바드 스킬instrument(악기 찾기와 점검), disco(대상마다 한 번, 설정에 따라 Virtuoso가 빠지면 다시), peace, provo-picks(별도 후보 입력), provo(등록 후보 가운데 풀린 둘씩 서로에게 프로보), song(적이 기억돼 있지 않은 이동 중 노래 셋을 차례로)
module/necro/네크로 핫바와 소환수symbols(핫바 열어 두기, Unholy Symbol 수 읽기), summon-names(소환수 이름 바꾸기), resummon(Vengeful Spirit 뒤 빠진 소환수 재소환, 마나가 낮으면 Wither, 오래된 소환수 교체), burst(Blood Oath, Corpse Skin, Evil Omen), poison-strike, vampiric-embrace
module/tamer/펫 스킬herding(목동 지팡이), vet-kit(나와 펫에게 수의사 키트)
module/fight/무기 전투 보조target(기억한 적), weapon-swap(pvp 무기 슬롯), rearm(들고 있던 무기를 레이어마다 기억, 손이 비면 다시 들기), sword-codex, parry-codex, archery-codex(자세와 피니셔, 고른 적 수로 전환), weapon-ability(Swords나 Archery 코덱스의 능력, 사거리 설정)
module/gather/채집lumberjacking(Smart Harvest), skinning(칼질)
module/pack/무게, 보급 파우치와 루팅 백gold-drop, leather(가죽 → 루팅 백), lumber(Logs → Boards → 루팅 백), scavenger(스캐빈저 캐시 비우기), pouches(보급 파우치와 루팅 백 지정), sorting(백팩 아래쪽 더미와 트랩 파우치, 파우치 안 정리)
module/escape/PK 피하기tracking(헌트 필터 설정과 Hunting 점검), recall(자동 리콜 한 번)
module/restock/집에서 하는 준비house(집 컨테이너, 금고, 비축함, 수리대, 재활용기, 선반), tools(바느질 키트와 감정 지팡이, 지팡이가 40회 이하면 예비 하나 더), instrument(마법 악기 하나), runebook(룬북 채우기)
module/gear/입은 장비dress(부위 기록, 사망 뒤 다시 입기), cosmetic(Razor cosmetic 목록 입히기), aspect([aspect gump의 Activate를 매번 누름)
recipe/<루프>-recipe.razor루프나 루틴 하나헤더, 도는 순서의 블록과 그 밑의 설정 변경, 이 루프만의 준비(03절)
util/build-scripts.mjs조립기결과물 생성, 레시피 블록 칸 정리. --settings, --new-module, --check(05절)
script/combat/*.razor, script/gather/*.razor, script/restock/loadout.razor, script/hotkey/regear.razor결과물. 머리에 Generated from 줄직접 수정 금지
형식

03 레시피

레시피와 모듈 모두 상자로 구성.

부분내용
맨 위의 # 주석레시피를 고치는 사람용 메모. 결과물 제외
# @ output script/<폴더>/<루프>.razor결과물 경로. 첫 상자 앞
# @ once생략 가능. # @ output 바로 밑. 루프가 아닌 일회성 스크립트(loadout 같은 루틴). 아래 03.A절
# @ header 상자밑에 결과물 맨 위 주석(Conventions 02.C절). 핫키 줄은 조립기가 추가
# @ blocks 상자안에 쓰는 법 네 줄(조립기가 씀). 밑에 블록마다 상자 하나, 도는 순서대로. 이 순서가 setup 순서. 첫 블록은 늘 # @ use base
# @ state, # @ setup 상자밑에 그 루프만의 상태와 루프 전 준비. 모듈 상태의 다른 시작값도. 생략 가능

03.A 일회성 레시피, # @ once

집에서 준비하는 loadout, 사망 뒤 장비를 다시 갖추는 regear처럼 한 번 돌고 끝나는 스크립트도 같은 모듈 형식으로 조립.

블록 하나 = 상자 하나. 상자 안에 # @ use 줄과 설명, 상자 밑에 그 블록에서 바꾸는 설정의 @setvar! 줄. 바꾸는 설정이 없는 블록도 상자로 → 모든 블록이 같은 자리에 같은 것을 보여 줌.

# ========================================================================================
# @ blocks
#
#   One box per block, in the order the blocks run, base first. The builder writes the box.
#   Yours are the "> " lines in it (a note on the block, or under a setting the reason for
#   its value) and the @setvar! lines under it. Write a new @setvar! line under any box, its
#   reason as a "#" line right above it: the builder moves both to the box it belongs to.
# ========================================================================================

# ----------------------------------------------------------------------------------------
# @ use base
#
#   The frame of every loop and routine. Every recipe lists it first.
#
#   warmode_is_manual (default 0)
#      Whose warmode it is.
#        0  ours: our casts ignore it
#        1  the player's manual control window: our casts and the food stand down while it
#           is on. Potions and bandages still go out
#      Read by recovery/cure, recovery/heal, recovery/light-heal, buff/spells, buff/food.
#      > Warmode is the player's: recovery casts and buffs stand down, potions still go out.
# ----------------------------------------------------------------------------------------
@setvar! config__warmode_is_manual 1

# ----------------------------------------------------------------------------------------
# @ use escape/tracking
#
#   Before the loop: reuses a confirmed Tracking hunt colour, or sets the filter once.
#   Runs once, before the loop.
# ----------------------------------------------------------------------------------------

# ----------------------------------------------------------------------------------------
# @ use recovery/cure
#
#   The trapped pouch while paralyzed, else a cure potion or the Smart Heal/Cure agent.
# ----------------------------------------------------------------------------------------

...

# ----------------------------------------------------------------------------------------
# @ use recovery/heal
#
#   Heal potion at heal_hits, else Greater Heal at emergency_hits.
#
#   emergency_hits (default 35)
#      Missing hit points that cast Greater Heal when no heal potion went out on this
#      pass. Not below heal_hits.
#      > Bandages handle ordinary damage, so Greater Heal waits for 45.
# ----------------------------------------------------------------------------------------
@setvar! config__emergency_hits 45

그룹: 블록 여러 개를 한 조건 밑에. 블록마다 같은 조건을 따로 물으면 거짓인 패스에도 블록 수만큼 문장 비용(Razor 06절). 묶으면 한 번만 물음. 그룹 줄은 블록 상자 사이에, 조립기가 = 상자로 정리.

줄결과물
# @ when 조건if 조건. 조건은 Razor 문법 그대로. 괄호가 없으니 and와 or 혼용 금지(Razor 03절)
# @ otherwiseelse. when 안에서 한 번
# @ every interval__이름if timer "timer__이름" >= interval__이름과 settimer "timer__이름" 0. 시계 timer__이름은 조립기가 TIMER에 생성, 첫 패스에 준비됨
# @ endendif. 가장 안쪽의 열린 그룹을 닫음
# ========================================================================================
# @ when var__fighting = 1
# ========================================================================================

# ----------------------------------------------------------------------------------------
# @ use bard/disco
#
#   Discordance once per target, read off its label, then left alone for 30 seconds.
# ----------------------------------------------------------------------------------------

...

# ========================================================================================
# @ otherwise
# ========================================================================================

...

# ========================================================================================
# @ end
# ========================================================================================

04 모듈

칸상자 안상자 밑결과물 자리
맨 위블록이 하는 일. 첫 줄은 86자 이내 한 줄 요약, 레시피와 --settings에 표시. # @ hotkeys A, B헤더의 Hotkeys: 줄
# @ config설정마다 # 이름과 그 밑 # 하는 일config__ 기본값CONFIG
# @ wait같은 모양wait__, interval__, cooldown__. 모든 루프가 같은 값을 쓰는 내부 값WAIT AND COOLDOWN
# @ timer같은 모양. 설명 생략 가능한 줄에 timer__이름 시작값. 시작값이 interval__ 이름이면 첫 패스에 준비, 0이면 한 주기 대기TIMER. createtimer와 첫 settimer는 조립기가 씀(Conventions 04절)
# @ state같은 모양var__ 선언. Play를 넘어 남길 것은 if not varexist로 감쌈STATE
# @ setup, # @ loop, # @ end# @ 줄만코드. loop, end는 블록 배너로 시작(Conventions 02.B절). 단계가 있는 블록은 단계마다 같은 모양의 배너 추가. end는 base만setup, MAIN LOOP, MAIN LOOP 끝
# ----------------------------------------------------------------------------------------
# Reactive Armor, then Magic Reflection, whenever one is missing.
#
# @ hotkeys > Interrupt
# ----------------------------------------------------------------------------------------


# ----------------------------------------------------------------------------------------
# @ config
#
#   config__use_reactive_armor
#      1 keeps Reactive Armor up.
#
#   config__use_magic_reflect
#      1 keeps Magic Reflection up.
#
#   config__mana_reactive_armor
#      Minimum current mana to start Reactive Armor.
#
#   config__mana_magic_reflect
#      Minimum current mana to start Magic Reflection.
#
#   config__buff_max_loss
#      Missing hit points at which buffs are not started, and cut mid cast.
#
#   config__buff_when_poisoned
#      Buffs while poisoned.
#        0  no: hold them back and cut one that is casting, so the cure goes first
#        1  yes
# ----------------------------------------------------------------------------------------
@setvar! config__use_reactive_armor 1
@setvar! config__use_magic_reflect 1
@setvar! config__mana_reactive_armor 4
@setvar! config__mana_magic_reflect 14
@setvar! config__buff_max_loss 35
@setvar! config__buff_when_poisoned 1


# ----------------------------------------------------------------------------------------
# @ loop
# ----------------------------------------------------------------------------------------
    # ------------------------------------------------------------------------------------
    # SELF BUFFS
    #
    # Reactive Armor, then Magic Reflection, whenever one is missing and the window is
    # free. Not started at config__buff_max_loss, and cut there mid cast so the next pass
    # can heal. With config__buff_when_poisoned 0 poison holds them back and cuts them
    # too, so the cure goes first. var__hold_casts lets another block keep the cast window
    # (a latched Recall). config__walk_guard and config__warmode_is_manual apply as for
    # the heal agents. The reflect bar is the server's recast lock after Reflect is used
    # up.
    # ------------------------------------------------------------------------------------
    ...

이름 하나 = 모듈 하나 소유. 저장소 전체에서 한 이름을 두 모듈이 선언하면 조립 정지 → “이 이름은 어디 것인가”의 답은 늘 파일 하나.

05 조립 규칙

  1. 헤더: 레시피 헤더 → 블록들이 선언한 핫키를 모은 Hotkeys: 줄 → “Generated from recipe/… by util/build-scripts.mjs” 줄
  2. 순서: CONFIG, WAIT AND COOLDOWN, TIMER, STATE, setup, MAIN LOOP. MAIN LOOP는 while not dead, 블록별 loop, base의 end, endwhile. 일회성 레시피는 setup에서 끝(03.A절)
    • 자리마다 base 먼저, 블록은 레시피 순서, 레시피가 마지막
    • 그룹은 loop 안에서 if, else, endif. # @ every의 시계는 TIMER 끝에 레시피 몫으로
    • 레시피 STATE가 뒤 → 모듈 상태에 다른 시작값 가능(pvp의 var__fighting 1)
  3. 결과물에 설명 없음: 큰 칸(CONFIG 등)은 Conventions의 배너 모양(Conventions 02.B절)
    • 조각마다 출처 파일만 적은 상자(# module/recovery/heal.razor) 밑에 값과 코드
    • loop 안 블록은 배너의 줄과 제목만, 제목 오른쪽에 모듈 경로
    • 설정과 블록이 하는 일, 레시피의 변경 이유는 그 경로의 파일에서
    • 코드 사이 주석도 뺌. setup, loop, end, 레시피의 state와 setup 모두. 빈 줄도 정리: 두 줄 연속, 분기 첫 줄, 분기 끝 바로 앞은 뺌
    • 예외: 분기에 든 줄이 주석뿐이면 남김. 빈 분기를 만들지 않으려는 것(if insysmsg로 줄만 읽어 없애는 곳 등)
    • TIMER에는 timer마다 createtimer와 첫 settimer
  4. 레시피 정리: 조립마다 정리된 모양으로 다시 씀. 큰 칸마다 = 상자, 블록마다 - 상자, 설정은 주인 블록 상자 밑
  5. 정지 조건: 조립기가 멈추고 고칠 곳을 알려 줌
    • 블록이 쓰는 이름의 주인 모듈이 레시피에 없음. 예: “module/gather/skinning.razor uses timer__combat_target_grace from module/fight/target.razor. Add ”# @ use fight/target""
    • 첫 블록이 # @ use base가 아님
    • 레시피의 설정이 어느 모듈에도 없거나, 레시피가 쓰지 않는 모듈의 것
    • 상자 밖 주석이 @setvar! 줄 바로 위에 있지 않음. 어느 설정의 이유인지 모른 채 지우지 않으려는 정지
    • 모듈 칸 상자가 선언한 이름을 빠뜨렸거나 선언하지 않은 이름을 설명. 또는 설명 줄이 # 이름, # 설명 모양이 아님
    • 두 모듈이 같은 이름 선언. 칸에 다른 접두의 이름. 블록이 config__에 값을 넣음
    • 결과물 주석에 ;(Razor 03절)
    • 모듈 첫 줄 요약이 86자 초과. 레시피 상자에 한 줄로 보여야 함
    • 그룹 줄의 짝 불일치: when 밖의 otherwise, 열린 그룹 없는 end, 닫지 않은 그룹, # @ use base 앞의 그룹, 조건이나 이름이 빠진 when이나 every
  6. 파일 쓰기: 줄 끝 CRLF(.gitattributes). 바뀐 결과물과 레시피만 다시 씀
  7. 검사: util/check.sh를 인자 없이 돌리면 끝에 node util/build-scripts.mjs --check도 실행. 결과물 직접 수정, 모듈 설명 변경 후 미조립을 잡음
base

06 base와 블록끼리 주고받는 것

module/base.razor: 모든 레시피의 첫 블록. 정본은 그 파일, 아래는 무엇을 왜 거기 두었는지.

칸내용바꾸는 루프
# @ configchatty, sysmsg: 출력 스위치
clear_at_start: Play 시 시작 4줄 실행 여부(Conventions 02.D절)pvp가 0. 플레이어가 든 커서와 시전 보존
use_magery, use_potions: 회복 블록과 버프 블록 여럿이 함께 보는 스위치dexxer-basic은 마법 0
walk_guard: 1이면 우리 시전이 walk 바 동안 대기. 긴급선 Greater Heal은 예외pvp가 0. 싸움 중에는 기다릴 더 나은 때가 없음
warmode_is_manual: 1이면 워모드가 플레이어의 조작 창. 우리 시전과 음식은 쉬고, 포션과 붕대는 나감. recover_in_warmode: 그때 회복 시전도 쉴지lumberjack-enhanced가 1. bard-necro-enhanced도 1, 회복은 계속(1)
use_bandages, heal_skill_min: 붕대 사용 여부. 못 쓰면 recovery/light-heal이 대신dexxer-basic, skinning-enhanced는 Healing 10 초과일 때만 붕대. bard-necro-enhanced는 붕대 안 씀
settle_first: 1이면 패스 첫머리에서 아이템 큐와 시전 종료 대기bard-necro-enhanced가 1
# @ wait, # @ timerwait__poll, wait__short, 경고 간격 interval__message와 timer__message, 레시피 그룹 # @ every의 interval__housekeeping
# @ state블록 사이 신호 넷(아래 표)pvp는 var__fighting 1
# @ setup, # @ loop, # @ end구조적 PvP 정지(루프 앞, 패스 첫머리), 시작 4줄, settle_first, 패스 끝 wait wait__poll

신호 = 쓰는 블록이 없어도 읽는 블록은 돌아야 하는 값. base가 중립값으로 선언, 쓰는 블록이 있는 루프에서만 값이 바뀜. 새 신호는 base의 # @ state와 이 표에 추가.

신호쓰는 곳읽는 곳
var__fightingfight/target(기억한 적이 target_range 안이면 1), pvp 레시피(늘 1)buff/potions, buff/spells의 Bless와 Arch Protection, buff/mushroom의 Create Food, magery/flamestrike, fight/archery-codex의 고른 적 세기, bard-necro-enhanced와 bard-archer-enhanced의 교전 그룹
var__hold_castsescape/recall(리콜 결정 시 1)buff/spells, necro/resummon
var__hold_gatheringescape/recall(리콜 결정, 필요한 책 없음, 감지 리콜인데 Tracking이 사냥 중이 아니면 1)gather/lumberjacking, pack/lumber
var__hold_symbolsnecro/resummon(소환수가 빠지고 마나 20~64면 1, 은행이 차면 0)necro/burst, necro/poison-strike, necro/vampiric-embrace

신호가 아닌 이름은 주인 모듈이 레시피에 있어야 사용 가능 → 아래 블록은 주인 모듈과 함께. 조립기가 코드에서 확인하는 관계.

쓰는 법

07 작업 순서

07.A 값을 바꿀 때

  1. node util/build-scripts.mjs --settings recipe/<루프>-recipe.razor로 루프의 설정 전체 확인
    • 설정마다 현재 값, 하는 일, 읽는 블록, module/…razor:줄. 터미널에서 경로를 누르면 파일로 이동
  2. 레시피에서 그 설정을 가진 블록 상자 밑에 @setvar! config__이름 값 한 줄, 바로 위 # 줄에 이유
    • 다른 상자 밑에 적어도 조립기가 주인 블록으로 옮김
  3. pnpm build(node util/build-scripts.mjs): 설정이 주인 블록 밑으로, 설명 재작성, 결과물 재생성
    • util/check.sh 실행, 게임에서는 Reload all scripts 후 Play(Workflow 04절)

07.B 블록을 넣거나 빼고, 새 동작을 더할 때

기록

08 2026-10-10 기록

08.A 처음 옮길 때

pvp(v9): 동작 동일.

skinning-enhanced(v11), lumberjack-enhanced(v17): 회복, 포션, 버프, 시약이 pvp와 같은 블록으로.

항목전지금
회복 주문 선택위에서 var__heal_spell 선택, 아래 SELF AGENT가 시전큐어, 힐, 가벼운 Heal 블록이 각자 현재 상태를 읽고 바로 시전
재시도 타이머큐어 포션, 힐 포션, Refresh 1초, 붕대 1.2초, 회복 주문 2.5초, 버프 3초(lumberjack은 10초)없음. 행동 큐, bandaging, findbuff, 포션 라벨과 바가 반복 방지
Greater Heal손실 45부터 포션과 같은 패스에도 가능그 패스에 힐 포션이 안 나갔을 때만
붕대우리 시전 중 대기시전 중에도 나감(pvp와 같은 입력 규칙)
포션 사용 방법skinning은 findtype 후 dclickDrink Cure 같은 Razor 핫키
경고두 루프 모두 [ refresh, out ], skinning은 힐 포션 쿨 라벨과 [ str, out ], [ agi, out ], [ resist, out ]도pvp처럼 안 띄움. 큐어 포션, 힐 포션, 붕대 없음 경고는 유지
블록 순서큐어 → 붕대 → 힐 포션 → 회복 주문 → Refresh큐어 → 힐(포션, Greater Heal) → 붕대 → 가벼운 Heal → Refresh
Refresh(skinning)스태미나 60 미만60 이하
버프를 끊는 선(lumberjack)15 미만에서 시작, 35에서 끊음15에서 시작 안 함, 15에서 끊음
Journal 문구(skinning)Heal agent: …, Buff cast: …Agent: …, Buff: …. lumberjack은 이 줄이 새로 생김

08.B 다시 짠 것

다시 짠 이유

항목전지금
폴더core/, combat/, gather/(쓰는 루프로)recovery/, buff/, fight/, gather/, pack/, escape/(맡는 일로), 그리고 base.razor
공용 모듈core/output, switches, wait, message, start, pvp-stop, pass-waitbase.razor 하나. 시작 4줄은 config__clear_at_start가 결정
모듈 사이 관계# @ needs, # @ after를 손으로조립기가 코드의 이름으로 탐색
타이머# @ timer에 createtimer 묶음, # @ ready에 settimer# @ timer에 timer__이름 시작값 한 줄
모듈의 설정 칸# @ settings# @ config. 설정마다 설명 필수
레시피 설정# @ config 칸에 값과 이유만블록마다 상자 하나. 조립기가 상자 안에 설명, 기본값, 함께 읽는 블록, 값은 상자 밑. # @ use base가 첫 블록
모양칸과 항목이 붙어 있고, 이름마다 바로 위에 주석블록과 칸마다 - 상자(레시피 큰 칸은 =). 설명은 상자 안, 이름은 상자 밑. 선택지는 한 줄에 하나, 글은 90자 안. 레시피 블록에 모듈 요약. 결과물도 같은 모양
블록 켜고 끄기 설정use_weapon, use_sword_codex, use_parry_codex, use_weapon_ability, use_skinning, use_gold_drop, pack_leather, pack_lumber, use_tracking, auto_recall, use_stat_potions삭제. 레시피에 넣으면 켜짐, 빼면 꺼짐
codex와 무기 능력의 슬롯 번호sword_stance_warrior 4처럼 바꿀 일 없는 설정 18개위키 순서의 숫자를 코드에, 고르는 설정(sword_stance_main 등)의 설명에 번호표
이름config__weapon_graphic(도끼), wait__long, wait__target, 두 codex가 같이 쓰던 cooldown__stance_*config__axe_graphic, wait__gold_drop, wait__tracking_gump, interval__sword_*와 interval__parry_*

pvp(v9), skinning-enhanced(v11): 동작 동일. 루프 문장 차이는 셋: 늘 1이던 켜고 끄기 조건 삭제, 슬롯 상수가 숫자로, 이름 변경. pvp 결과물에서는 시작 4줄이 if config__clear_at_start = 1 안, pvp의 값은 0.

lumberjack-enhanced: v18. 5초 housekeeping 시계(var__housekeeping_pass) 삭제로 동작 변경.

항목v17v18
책, Tracking, 무게 점검housekeeping 시계(5초)escape/recall의 자기 시계 interval__recall_check(5초)
음식housekeeping 패스에서, 손실이 light_hits 미만이고 독, 워모드, 리콜 결정이 없을 때skinning과 같은 buff/food. 패스마다 60초 타이머와 Food Satisfaction 확인, 워모드에서는 쉼(warmode_is_manual 1). 손실, 독, 리콜 결정은 안 봄
목재 정리housekeeping 패스에서, 리콜 결정이 없을 때패스마다 120초 타이머 확인. var__hold_gathering 1이면 쉼
채집이 기다리는 것리콜 결정은 장착과 채집 모두 차단, 책 없음과 Hunting 아님은 채집만 차단셋 다 var__hold_gathering 하나로 장착과 채집 함께 차단
시작 메시지v17 loaded: auto recall=…, tracking color=…v18 loaded: tracking color=…

인게임 확인 항목: Open items 09절에 추가.

08.C dexxer-basic

항목전지금
힐 포션HP 65 이하잃은 HP 35 이상(heal_hits). 최대 HP 100이면 같음
음식패스마다 Food Satisfaction 확인 후 먹음60초마다 확인(buff/food)
포션 쓰기findtype 후 dclickDrink Cure 같은 Razor 핫키
경고Refresh나 스탯 포션이 없을 때도큐어 포션, 힐 포션, 붕대, 주머니가 없을 때만
스탯 포션코드는 있었지만 꺼짐(var_use_potion 0)넣지 않음. 쓰려면 buff/potions와 fight/target 추가
패스 첫머리queued와 시전 종료까지 대기블록마다 queued와 시전을 보고 비켜 감

08.D bard-necro-enhanced

항목전지금
힐 간격두 힐 사이 1.2초, Greater Heal 재시도 2.5초 타이머삭제. 힐 포션은 heal pot 바와 라벨로 차단, Greater Heal은 그 패스에 포션이 안 나갔을 때(recovery/heal)
독에 걸린 채 다쳤을 때Smart Heal/Cure가 독과 HP 모두 담당큐어 먼저. 힐 포션과 Greater Heal은 독이 풀릴 때까지 대기
가벼운 Heal잃은 HP 15 초과 35 미만15 이상, 위 한계 없음(recovery/light-heal)
셀프 버프잃은 HP와 무관하게 시전잃은 HP 35 이상이면 시작 안 함, 시전 중이면 끊음(buff_max_loss)
Spell SiphonRA, Reflect와 같은 elseif 사슬의 셋째 갈래. 자기를 찍기 전 lasttarget 재확인buff/spells 사슬의 마지막 갈래(use_spell_siphon). 순서 동일. 한 시간에 한 번이라 lasttarget 재확인 없음
스탯 포션10초마다 셋 확인, 없으면 경고. 민첩 기준선 120하우스키핑 5초 안에서 포션마다 5초 재시도. 없어도 경고 없음. 민첩 기준선은 이 템플릿의 DEX 25 + 20인 45인게임 확인됨
Refresh없으면 경고경고 없음
골드하우스키핑마다 무게 밑으로 내려갈 때까지 반복하우스키핑마다 한 번(pack/gold-drop)
음식워모드와 무관워모드에서는 쉼(warmode_is_manual 1)
버섯 먹기이동 중에만, 걷기 바와 시전 대기교전 중에도 마나 55 이하면 먹음. 포션처럼 커서만 대기. Create Food는 그대로 이동 중에만
시약 읽기30초마다10초마다(interval__reagents)
경고 간격2초3초(base의 interval__message)
전투 대상lasttarget이 무엇이든 받음모바일 serial만(fight/target)
Disco가 기억한 대상하우스키핑에서 30초 뒤 잊음교전 패스마다 bard/disco 첫머리에서 확인. 교전 패스에 문장 하나 증가
패스시작에 queued와 시전 대기같음(settle_first 1). 끝에 wait wait__poll 0.1초, 구조적 PvP에서 정지(base)
Journal안 씀다른 루프처럼 config__sysmsg 1로 진단 줄

인게임 확인 항목: Open items 14절에 추가.

08.E tamer-mage-enhanced

항목전지금
Bless와 Arch Protection기억한 적이 없을 때교전 중이 아닐 때(var__fighting 0). 적이 10칸 밖이면 시전
버프 끊기잃은 HP 35(emergency_hits)같은 35, buff_max_loss 기준
Flamestrike 끊기늘 끊음interrupt_to_heal 기준(기본 1). 끊으면 [ flamestrike, cut ]. 대상에 쏜 뒤 대기 0.3초(wait__cast)
시약 읽기30초마다, 패스 맨 앞10초마다, 수의사 키트 뒤. 키트의 Journal 줄을 먼저 읽게 함
힐 포션마신 뒤 바 안 켬heal pot 바 켬(recovery/heal)
음식시전 중에도 먹음시전 종료 후 먹음
골드떨군 뒤 0.2초1초(wait__gold_drop), [ gold, dropped ]
전투 대상lasttarget이 무엇이든 받음모바일 serial만(fight/target)

인게임 확인 항목: Open items 12절.

08.F 마무리 점검에서 합친 모듈

합친 것결과이유
necro/hotbarnecro/symbols같은 gump를 열고 읽는 한 가지 일. 핫바 확인을 심볼 사슬의 마지막 갈래(수를 못 읽었을 때) 안에 → 수를 읽는 패스는 문장 추가 없음. 전에는 하우스키핑 5초마다 한 줄
magery/spell-siphonbuff/spells의 마지막 갈래(use_spell_siphon)RA와 Reflect 뒤에 서려고 var__buff_cast 플래그를 주고받았는데, elseif 사슬 하나면 순서가 저절로 지켜짐. 플래그와 패스마다의 한 줄 삭제. 한 시간에 한 번인 화살이라 자기를 찍기 전 lasttarget 재확인 없음
recovery/pouchrecovery/cure코드 9줄, 모든 레시피에서 cure 바로 앞. 마비면 파우치, 아니면 독 확인(if와 elseif)
magery/opener, proc-core, fillermagery/rotation프록은 Curse를(var__opener_done), Energy Bolt는 프록을(var__procs_done) 기다림 → 하나만 따로 쓸 수 없음. 단계별 배너는 유지

합치지 않은 것:

09 아직 옮기지 않은 것