diff --git a/app/game-api/src/context.ts b/app/game-api/src/context.ts index 89a4e4f..4dba225 100644 --- a/app/game-api/src/context.ts +++ b/app/game-api/src/context.ts @@ -1,4 +1,5 @@ import type { GameSessionTokenPayload } from '@sammo-ts/common'; +import type { Prisma } from '@prisma/client'; import type { TurnDaemonTransport } from './daemon/transport.js'; @@ -100,6 +101,7 @@ export interface NationRow { } export interface DatabaseClient { + $queryRaw(query: Prisma.Sql): Promise; worldState: { findFirst(args?: unknown): Promise; }; diff --git a/app/game-api/src/messages/store.ts b/app/game-api/src/messages/store.ts new file mode 100644 index 0000000..bdd0385 --- /dev/null +++ b/app/game-api/src/messages/store.ts @@ -0,0 +1,118 @@ +import type { MessagePayload, MessageRecordDraft, MessageType } from '@sammo-ts/logic'; + +import type { DatabaseClient } from '../context.js'; + +export interface MessageView { + id: number; + msgType: MessageType; + src: MessagePayload['src']; + dest: MessagePayload['dest'] | null; + text: string; + option?: MessagePayload['option'] | null; + time: string; +} + +interface MessageRow { + id: number; + mailbox: number; + type: MessageType; + src: number; + dest: number; + time: Date; + valid_until: Date; + message: unknown; +} + +const parsePayload = (value: unknown): MessagePayload => { + if (typeof value === 'string') { + return JSON.parse(value) as MessagePayload; + } + return value as MessagePayload; +}; + +const formatMessageTime = (value: Date): string => { + const pad = (input: number) => input.toString().padStart(2, '0'); + return `${value.getFullYear()}-${pad(value.getMonth() + 1)}-${pad( + value.getDate() + )} ${pad(value.getHours())}:${pad(value.getMinutes())}:${pad(value.getSeconds())}`; +}; + +const toMessageView = (row: MessageRow): MessageView => { + const payload = parsePayload(row.message); + return { + id: row.id, + msgType: row.type, + src: payload.src, + dest: row.type === 'public' ? null : payload.dest, + text: payload.text, + option: payload.option ?? null, + time: formatMessageTime(new Date(row.time)), + }; +}; + +export const insertMessage = async ( + db: DatabaseClient, + draft: MessageRecordDraft +): Promise => { + const rows = await db.$queryRaw>` + INSERT INTO message (mailbox, type, src, dest, time, valid_until, message) + VALUES ( + ${draft.mailbox}, + ${draft.msgType}, + ${draft.srcId}, + ${draft.destId}, + ${draft.time}, + ${draft.validUntil}, + CAST(${JSON.stringify(draft.payload)} AS jsonb) + ) + RETURNING id + `; + const id = rows[0]?.id; + if (!id) { + throw new Error('Failed to insert message row.'); + } + return id; +}; + +export const fetchMessagesFromMailbox = async (params: { + db: DatabaseClient; + mailbox: number; + msgType: MessageType; + limit: number; + fromSeq: number; +}): Promise => { + const fromSeq = Math.max(params.fromSeq, 0); + const rows = await params.db.$queryRaw` + SELECT id, mailbox, type, src, dest, time, valid_until, message + FROM message + WHERE mailbox = ${params.mailbox} + AND type = ${params.msgType} + AND valid_until > NOW() + AND id >= ${fromSeq} + ORDER BY id DESC + LIMIT ${params.limit} + `; + + return rows.map(toMessageView); +}; + +export const fetchOldMessagesFromMailbox = async (params: { + db: DatabaseClient; + mailbox: number; + msgType: MessageType; + toSeq: number; + limit: number; +}): Promise => { + const rows = await params.db.$queryRaw` + SELECT id, mailbox, type, src, dest, time, valid_until, message + FROM message + WHERE mailbox = ${params.mailbox} + AND type = ${params.msgType} + AND valid_until > NOW() + AND id < ${params.toSeq} + ORDER BY id DESC + LIMIT ${params.limit} + `; + + return rows.map(toMessageView); +}; diff --git a/app/game-api/src/messages/targets.ts b/app/game-api/src/messages/targets.ts new file mode 100644 index 0000000..23d4e4f --- /dev/null +++ b/app/game-api/src/messages/targets.ts @@ -0,0 +1,50 @@ +import type { MessageTarget } from '@sammo-ts/logic'; + +import type { DatabaseClient, GeneralRow } from '../context.js'; + +const DEFAULT_NATION = { + name: '재야', + color: '#000000', +}; + +export const resolveNationInfo = async ( + db: DatabaseClient, + nationId: number +): Promise<{ name: string; color: string }> => { + if (nationId <= 0) { + return DEFAULT_NATION; + } + const nation = await db.nation.findUnique({ where: { id: nationId } }); + if (!nation) { + return DEFAULT_NATION; + } + return { name: nation.name, color: nation.color }; +}; + +export const buildTargetFromGeneral = async ( + db: DatabaseClient, + general: GeneralRow +): Promise => { + const nation = await resolveNationInfo(db, general.nationId); + return { + generalId: general.id, + generalName: general.name, + nationId: general.nationId, + nationName: nation.name, + color: nation.color, + icon: '', + }; +}; + +export const buildNationTarget = ( + nationId: number, + nationName: string, + color: string +): MessageTarget => ({ + generalId: 0, + generalName: '', + nationId, + nationName, + color, + icon: '', +}); diff --git a/app/game-api/src/router.ts b/app/game-api/src/router.ts index 091579d..0bc9bb4 100644 --- a/app/game-api/src/router.ts +++ b/app/game-api/src/router.ts @@ -12,8 +12,24 @@ import { shiftGeneralTurns, shiftNationTurns, } from './turns/reservedTurns.js'; +import { + MESSAGE_MAILBOX_NATIONAL_BASE, + MESSAGE_MAILBOX_PUBLIC, + sendMessage, + type MessageDraft, + type MessageRecordDraft, + type MessageType, +} from '@sammo-ts/logic'; +import { buildNationTarget, buildTargetFromGeneral, resolveNationInfo } from './messages/targets.js'; +import { + fetchMessagesFromMailbox, + fetchOldMessagesFromMailbox, + insertMessage, + type MessageView, +} from './messages/store.js'; const zRunReason = z.enum(['schedule', 'manual', 'poke']); +const zMessageType = z.enum(['private', 'public', 'national', 'diplomacy']); const zTurnRunBudget = z.object({ budgetMs: z.number().int().positive(), @@ -244,6 +260,266 @@ export const appRouter = router({ }), }), }), + messages: router({ + getRecent: authedProcedure + .input( + z.object({ + generalId: z.number().int().positive(), + sequence: z.number().int().optional(), + }) + ) + .query(async ({ ctx, input }) => { + const general = await ctx.db.general.findUnique({ + where: { id: input.generalId }, + }); + if (!general) { + throw new TRPCError({ + code: 'NOT_FOUND', + message: 'General not found.', + }); + } + + const sequence = input.sequence ?? -1; + const nationId = general.nationId; + const mailboxes = { + private: general.id, + public: MESSAGE_MAILBOX_PUBLIC, + national: MESSAGE_MAILBOX_NATIONAL_BASE + nationId, + diplomacy: MESSAGE_MAILBOX_NATIONAL_BASE + nationId, + } satisfies Record; + + const [privateMessages, publicMessages, nationalMessages, diplomacyMessages] = + await Promise.all([ + fetchMessagesFromMailbox({ + db: ctx.db, + mailbox: mailboxes.private, + msgType: 'private', + limit: 15, + fromSeq: sequence, + }), + fetchMessagesFromMailbox({ + db: ctx.db, + mailbox: mailboxes.public, + msgType: 'public', + limit: 15, + fromSeq: sequence, + }), + fetchMessagesFromMailbox({ + db: ctx.db, + mailbox: mailboxes.national, + msgType: 'national', + limit: 15, + fromSeq: sequence, + }), + fetchMessagesFromMailbox({ + db: ctx.db, + mailbox: mailboxes.diplomacy, + msgType: 'diplomacy', + limit: 15, + fromSeq: sequence, + }), + ]); + + const messageBuckets: Record = { + private: privateMessages, + public: publicMessages, + national: nationalMessages, + diplomacy: diplomacyMessages, + }; + + let nextSequence = sequence; + let minSequence = sequence; + let lastType: MessageType | null = null; + const updateSequence = (type: MessageType, messages: Array<{ id: number }>) => { + for (const message of messages) { + if (message.id > nextSequence) { + nextSequence = message.id; + } + if (message.id <= minSequence) { + minSequence = message.id; + lastType = type; + } + } + }; + + updateSequence('private', privateMessages); + updateSequence('public', publicMessages); + updateSequence('national', nationalMessages); + updateSequence('diplomacy', diplomacyMessages); + + if (lastType === 'private' && messageBuckets.private.length > 0) { + messageBuckets.private.pop(); + } else if ( + lastType === 'public' && + messageBuckets.public.length > 0 + ) { + messageBuckets.public.pop(); + } else if ( + lastType === 'national' && + messageBuckets.national.length > 0 + ) { + messageBuckets.national.pop(); + } else if ( + lastType === 'diplomacy' && + messageBuckets.diplomacy.length > 0 + ) { + messageBuckets.diplomacy.pop(); + } + + return { + result: true, + ...messageBuckets, + sequence: nextSequence, + nationId: nationId, + generalName: general.name, + latestRead: { + diplomacy: 0, + private: 0, + }, + }; + }), + getOld: authedProcedure + .input( + z.object({ + generalId: z.number().int().positive(), + to: z.number().int().positive(), + type: zMessageType, + }) + ) + .query(async ({ ctx, input }) => { + const general = await ctx.db.general.findUnique({ + where: { id: input.generalId }, + }); + if (!general) { + throw new TRPCError({ + code: 'NOT_FOUND', + message: 'General not found.', + }); + } + + const nationId = general.nationId; + const mailboxes = { + private: general.id, + public: MESSAGE_MAILBOX_PUBLIC, + national: MESSAGE_MAILBOX_NATIONAL_BASE + nationId, + diplomacy: MESSAGE_MAILBOX_NATIONAL_BASE + nationId, + } satisfies Record; + + const messageBuckets: Record = { + private: [], + public: [], + national: [], + diplomacy: [], + }; + + const messages = await fetchOldMessagesFromMailbox({ + db: ctx.db, + mailbox: mailboxes[input.type], + msgType: input.type, + toSeq: input.to, + limit: 15, + }); + messageBuckets[input.type] = messages; + + return { + result: true, + keepRecent: true, + sequence: 0, + nationId, + generalName: general.name, + ...messageBuckets, + }; + }), + send: authedProcedure + .input( + z.object({ + generalId: z.number().int().positive(), + mailbox: z.number().int(), + text: z.string().min(1), + }) + ) + .mutation(async ({ ctx, input }) => { + const general = await ctx.db.general.findUnique({ + where: { id: input.generalId }, + }); + if (!general) { + throw new TRPCError({ + code: 'NOT_FOUND', + message: 'General not found.', + }); + } + + const src = await buildTargetFromGeneral(ctx.db, general); + const now = new Date(); + const validUntil = new Date('9999-12-31T00:00:00Z'); + + let msgType: MessageType; + let dest = src; + + if (input.mailbox === MESSAGE_MAILBOX_PUBLIC) { + msgType = 'public'; + } else if (input.mailbox >= MESSAGE_MAILBOX_NATIONAL_BASE) { + const destNationId = + input.mailbox - MESSAGE_MAILBOX_NATIONAL_BASE; + if (destNationId <= 0) { + throw new TRPCError({ + code: 'BAD_REQUEST', + message: 'Invalid nation mailbox.', + }); + } + const nationInfo = await resolveNationInfo( + ctx.db, + destNationId + ); + dest = buildNationTarget( + destNationId, + nationInfo.name, + nationInfo.color + ); + msgType = + destNationId === general.nationId + ? 'national' + : 'diplomacy'; + } else if (input.mailbox > 0) { + const destGeneral = await ctx.db.general.findUnique({ + where: { id: input.mailbox }, + }); + if (!destGeneral) { + throw new TRPCError({ + code: 'NOT_FOUND', + message: 'Destination general not found.', + }); + } + dest = await buildTargetFromGeneral(ctx.db, destGeneral); + msgType = 'private'; + } else { + throw new TRPCError({ + code: 'BAD_REQUEST', + message: 'Invalid mailbox.', + }); + } + + const draft: MessageDraft = { + msgType, + src, + dest, + text: input.text, + time: now, + validUntil, + option: {}, + }; + + const result = await sendMessage( + { + insertMessage: (draft: MessageRecordDraft) => + insertMessage(ctx.db, draft), + }, + draft + ); + + return { msgType, msgId: result.receiverId }; + }), + }), turnDaemon: router({ run: procedure .input( diff --git a/app/game-engine/resources/map/region_map.json b/app/game-engine/resources/map/region_map.json new file mode 100644 index 0000000..474c4a7 --- /dev/null +++ b/app/game-engine/resources/map/region_map.json @@ -0,0 +1,80 @@ +{ + "che": { + "1": "하북", + "2": "중원", + "3": "서북", + "4": "서촉", + "5": "남중", + "6": "초", + "7": "오월", + "8": "동이" + }, + "chess": { + "1": "킹", + "2": "퀸", + "3": "룩", + "4": "나이트", + "5": "비숍", + "6": "폰", + "7": "빈칸" + }, + "cr": { + "1": "하북", + "2": "중원", + "3": "서북", + "4": "서촉", + "5": "남중", + "6": "초", + "7": "오월", + "8": "동이" + }, + "ludo_rathowm": { + "1": "호넷 마인령", + "2": "케이브리스 마인령", + "3": "카라의 숲", + "4": "샹그릴라", + "5": "제스 북부", + "6": "제스 남부", + "7": "헬만 서부", + "8": "헬만 동부", + "9": "리자스 남부", + "10": "리자스 북부", + "11": "JAPAN", + "12": "자유도시 동부", + "13": "자유도시 서부", + "14": "AL교" + }, + "miniche": { + "1": "하북", + "2": "중원", + "3": "서북", + "4": "서촉", + "5": "남중", + "6": "초", + "7": "오월", + "8": "동이" + }, + "miniche_b": { + "1": "하북", + "2": "중원", + "3": "서북", + "4": "서촉", + "5": "남중", + "6": "초", + "7": "오월", + "8": "동이" + }, + "miniche_clean": { + "1": "하북", + "2": "중원", + "3": "서북", + "4": "서촉", + "5": "남중", + "6": "초", + "7": "오월", + "8": "동이" + }, + "pokemon_v1": { + "1": "관동 지방" + } +} diff --git a/app/game-engine/resources/unitset/unitset_basic.json b/app/game-engine/resources/unitset/unitset_basic.json new file mode 100644 index 0000000..a1f2e7e --- /dev/null +++ b/app/game-engine/resources/unitset/unitset_basic.json @@ -0,0 +1,263 @@ +{ + "id": "basic", + "name": "basic", + "defaultCrewTypeId": 1100, + "armTypes": { + "1": "보병", + "2": "궁병", + "3": "기병", + "4": "귀병", + "5": "차병" + }, + "crewTypes": [ + { + "id": 1000, + "armType": 0, + "name": "성벽", + "attack": 100, + "defence": 100, + "speed": 7, + "avoid": 0, + "magicCoef": 0, + "cost": 99, + "rice": 9, + "requirements": [], + "attackCoef": [], + "defenceCoef": { + "1": 1.2 + }, + "info": [ + "성벽입니다.", + "생성할 수 없습니다." + ], + "initSkillTrigger": null, + "phaseSkillTrigger": null, + "iActionList": null + }, + { + "id": 1100, + "armType": 1, + "name": "보병", + "attack": 100, + "defence": 150, + "speed": 7, + "avoid": 10, + "magicCoef": 0, + "cost": 9, + "rice": 9, + "requirements": [], + "attackCoef": { + "2": 1.2, + "3": 0.8, + "5": 1.2 + }, + "defenceCoef": { + "2": 0.8, + "3": 1.2, + "5": 0.8 + }, + "info": [ + "표준적인 보병입니다.", + "보병은 방어특화이며,", + "상대가 회피하기 어렵습니다." + ], + "initSkillTrigger": null, + "phaseSkillTrigger": null, + "iActionList": null + }, + { + "id": 1200, + "armType": 2, + "name": "궁병", + "attack": 100, + "defence": 100, + "speed": 7, + "avoid": 20, + "magicCoef": 0, + "cost": 10, + "rice": 10, + "requirements": [], + "attackCoef": { + "3": 1.2, + "1": 0.8, + "5": 1.2 + }, + "defenceCoef": { + "3": 0.8, + "1": 1.2, + "5": 0.8 + }, + "info": [ + "표준적인 궁병입니다.", + "궁병은 회피특화입니다." + ], + "initSkillTrigger": null, + "phaseSkillTrigger": null, + "iActionList": null + }, + { + "id": 1300, + "armType": 3, + "name": "기병", + "attack": 150, + "defence": 100, + "speed": 7, + "avoid": 5, + "magicCoef": 0, + "cost": 11, + "rice": 11, + "requirements": [], + "attackCoef": { + "1": 1.2, + "2": 0.8, + "5": 1.2 + }, + "defenceCoef": { + "1": 0.8, + "2": 1.2, + "5": 0.8 + }, + "info": [ + "표준적인 기병입니다.", + "기병은 공격특화입니다." + ], + "initSkillTrigger": null, + "phaseSkillTrigger": null, + "iActionList": null + }, + { + "id": 1400, + "armType": 4, + "name": "귀병", + "attack": 80, + "defence": 80, + "speed": 7, + "avoid": 5, + "magicCoef": 0.5, + "cost": 9, + "rice": 9, + "requirements": [], + "attackCoef": { + "5": 1.2 + }, + "defenceCoef": { + "5": 0.8 + }, + "info": [ + "계략을 사용하는 병종입니다." + ], + "initSkillTrigger": null, + "phaseSkillTrigger": null, + "iActionList": null + }, + { + "id": 1405, + "armType": 4, + "name": "남귀병", + "attack": 60, + "defence": 60, + "speed": 7, + "avoid": 10, + "magicCoef": 0.8, + "cost": 8, + "rice": 8, + "requirements": [], + "attackCoef": { + "5": 1.2 + }, + "defenceCoef": { + "5": 0.8 + }, + "info": [ + "전투를 포기하고 계략에 몰두합니다." + ], + "initSkillTrigger": null, + "phaseSkillTrigger": null, + "iActionList": null + }, + { + "id": 1500, + "armType": 5, + "name": "정란", + "attack": 100, + "defence": 100, + "speed": 6, + "avoid": 0, + "magicCoef": 0, + "cost": 15, + "rice": 5, + "requirements": [ + { + "type": "ReqMinRelYear", + "year": 3 + } + ], + "attackCoef": { + "1": 0.8, + "2": 0.8, + "3": 0.8, + "4": 0.8, + "0": 1.8 + }, + "defenceCoef": { + "1": 1.2, + "2": 1.2, + "3": 1.2, + "4": 1.2 + }, + "info": [ + "높은 구조물 위에서 공격합니다." + ], + "initSkillTrigger": [ + "che_성벽부상무효" + ], + "phaseSkillTrigger": null, + "iActionList": [ + "che_성벽선제" + ] + }, + { + "id": 1501, + "armType": 5, + "name": "충차", + "attack": 150, + "defence": 100, + "speed": 6, + "avoid": 0, + "magicCoef": 0, + "cost": 20, + "rice": 5, + "requirements": [ + { + "type": "ReqTech", + "tech": 1000 + }, + { + "type": "ReqMinRelYear", + "year": 3 + } + ], + "attackCoef": { + "1": 0.8, + "2": 0.8, + "3": 0.8, + "4": 0.8, + "0": 2.4 + }, + "defenceCoef": { + "1": 1.2, + "2": 1.2, + "3": 1.2, + "4": 1.2 + }, + "info": [ + "엄청난 위력으로 성벽을 부수어버립니다." + ], + "initSkillTrigger": [ + "che_성벽부상무효" + ], + "phaseSkillTrigger": null, + "iActionList": null + } + ] +} diff --git a/app/game-engine/resources/unitset/unitset_che.json b/app/game-engine/resources/unitset/unitset_che.json new file mode 100644 index 0000000..c019103 --- /dev/null +++ b/app/game-engine/resources/unitset/unitset_che.json @@ -0,0 +1,1358 @@ +{ + "id": "che", + "name": "che", + "defaultCrewTypeId": 1100, + "armTypes": { + "1": "보병", + "2": "궁병", + "3": "기병", + "4": "귀병", + "5": "차병" + }, + "crewTypes": [ + { + "id": 1000, + "armType": 0, + "name": "성벽", + "attack": 100, + "defence": 100, + "speed": 7, + "avoid": 0, + "magicCoef": 0, + "cost": 99, + "rice": 9, + "requirements": [ + { + "type": "Impossible" + } + ], + "attackCoef": [], + "defenceCoef": { + "1": 1.2 + }, + "info": [ + "성벽입니다.", + "생성할 수 없습니다." + ], + "initSkillTrigger": null, + "phaseSkillTrigger": [ + "che_선제사격시도", + "che_선제사격발동" + ], + "iActionList": null + }, + { + "id": 1100, + "armType": 1, + "name": "보병", + "attack": 100, + "defence": 150, + "speed": 7, + "avoid": 10, + "magicCoef": 0, + "cost": 9, + "rice": 9, + "requirements": [], + "attackCoef": { + "2": 1.2, + "3": 0.8, + "5": 1.2 + }, + "defenceCoef": { + "2": 0.8, + "3": 1.2, + "5": 0.8 + }, + "info": [ + "표준적인 보병입니다.", + "보병은 방어특화이며,", + "상대가 회피하기 어렵습니다." + ], + "initSkillTrigger": null, + "phaseSkillTrigger": [ + "che_방어력증가5p" + ], + "iActionList": null + }, + { + "id": 1101, + "armType": 1, + "name": "청주병", + "attack": 100, + "defence": 200, + "speed": 7, + "avoid": 10, + "magicCoef": 0, + "cost": 10, + "rice": 11, + "requirements": [ + { + "type": "ReqTech", + "tech": 1000 + }, + { + "type": "ReqRegions", + "regions": [ + "중원" + ] + } + ], + "attackCoef": { + "2": 1.2, + "3": 0.8, + "5": 1.2 + }, + "defenceCoef": { + "2": 0.8, + "3": 1.2, + "5": 0.8 + }, + "info": [ + "저렴하고 튼튼합니다." + ], + "initSkillTrigger": null, + "phaseSkillTrigger": [ + "che_방어력증가5p" + ], + "iActionList": null + }, + { + "id": 1102, + "armType": 1, + "name": "수병", + "attack": 150, + "defence": 150, + "speed": 7, + "avoid": 10, + "magicCoef": 0, + "cost": 11, + "rice": 10, + "requirements": [ + { + "type": "ReqTech", + "tech": 1000 + }, + { + "type": "ReqRegions", + "regions": [ + "오월" + ] + } + ], + "attackCoef": { + "2": 1.2, + "3": 0.8, + "5": 1.2 + }, + "defenceCoef": { + "2": 0.8, + "3": 1.2, + "5": 0.8 + }, + "info": [ + "저렴하고 강력합니다." + ], + "initSkillTrigger": null, + "phaseSkillTrigger": [ + "che_방어력증가5p" + ], + "iActionList": null + }, + { + "id": 1103, + "armType": 1, + "name": "자객병", + "attack": 100, + "defence": 150, + "speed": 8, + "avoid": 20, + "magicCoef": 0, + "cost": 10, + "rice": 10, + "requirements": [ + { + "type": "ReqTech", + "tech": 2000 + }, + { + "type": "ReqCities", + "cities": [ + "저" + ] + } + ], + "attackCoef": { + "2": 1.2, + "3": 0.8, + "5": 1.2 + }, + "defenceCoef": { + "2": 0.8, + "3": 1.2, + "5": 0.8 + }, + "info": [ + "은밀하고 날쌥니다." + ], + "initSkillTrigger": null, + "phaseSkillTrigger": [ + "che_방어력증가5p" + ], + "iActionList": null + }, + { + "id": 1104, + "armType": 1, + "name": "근위병", + "attack": 150, + "defence": 200, + "speed": 7, + "avoid": 10, + "magicCoef": 0, + "cost": 12, + "rice": 12, + "requirements": [ + { + "type": "ReqTech", + "tech": 3000 + }, + { + "type": "ReqCities", + "cities": [ + "낙양" + ] + } + ], + "attackCoef": { + "2": 1.2, + "3": 0.8, + "5": 1.2 + }, + "defenceCoef": { + "2": 0.8, + "3": 1.2, + "5": 0.8 + }, + "info": [ + "최강의 보병입니다." + ], + "initSkillTrigger": null, + "phaseSkillTrigger": [ + "che_방어력증가5p" + ], + "iActionList": null + }, + { + "id": 1105, + "armType": 1, + "name": "등갑병", + "attack": 100, + "defence": 225, + "speed": 7, + "avoid": 5, + "magicCoef": 0, + "cost": 13, + "rice": 10, + "requirements": [ + { + "type": "ReqTech", + "tech": 1000 + }, + { + "type": "ReqRegions", + "regions": [ + "남중" + ] + } + ], + "attackCoef": { + "2": 1.2, + "3": 0.8, + "5": 1.2 + }, + "defenceCoef": { + "2": 0.8, + "3": 1.2, + "5": 0.8 + }, + "info": [ + "등갑을 두른 보병입니다." + ], + "initSkillTrigger": null, + "phaseSkillTrigger": [ + "che_방어력증가5p" + ], + "iActionList": null + }, + { + "id": 1106, + "armType": 1, + "name": "백이병", + "attack": 175, + "defence": 175, + "speed": 7, + "avoid": 5, + "magicCoef": 0, + "cost": 13, + "rice": 11, + "requirements": [ + { + "type": "ReqTech", + "tech": 3000 + }, + { + "type": "ReqCities", + "cities": [ + "성도" + ] + } + ], + "attackCoef": { + "2": 1.1, + "3": 0.9, + "5": 1.1 + }, + "defenceCoef": { + "2": 0.9, + "3": 1.1, + "5": 0.9 + }, + "info": [ + "정예 보병입니다. 불리한 싸움도 버텨냅니다." + ], + "initSkillTrigger": null, + "phaseSkillTrigger": [ + "che_방어력증가5p" + ], + "iActionList": null + }, + { + "id": 1200, + "armType": 2, + "name": "궁병", + "attack": 100, + "defence": 100, + "speed": 7, + "avoid": 10, + "magicCoef": 0, + "cost": 10, + "rice": 10, + "requirements": [], + "attackCoef": { + "3": 1.2, + "1": 0.8, + "5": 1.2 + }, + "defenceCoef": { + "3": 0.8, + "1": 1.2, + "5": 0.8 + }, + "info": [ + "표준적인 궁병입니다.", + "궁병은 선제사격을 하는 병종입니다." + ], + "initSkillTrigger": null, + "phaseSkillTrigger": [ + "che_선제사격시도", + "che_선제사격발동" + ], + "iActionList": null + }, + { + "id": 1201, + "armType": 2, + "name": "궁기병", + "attack": 100, + "defence": 100, + "speed": 8, + "avoid": 20, + "magicCoef": 0, + "cost": 11, + "rice": 12, + "requirements": [ + { + "type": "ReqTech", + "tech": 1000 + }, + { + "type": "ReqRegions", + "regions": [ + "동이" + ] + } + ], + "attackCoef": { + "3": 1.2, + "1": 0.9, + "5": 1.2 + }, + "defenceCoef": { + "3": 0.8, + "1": 1.1, + "5": 0.8 + }, + "info": [ + "말을 타고 잘 피합니다. 특히 다른 궁병보다 보병에게 조금 더 강합니다." + ], + "initSkillTrigger": null, + "phaseSkillTrigger": [ + "che_선제사격시도", + "che_선제사격발동" + ], + "iActionList": null + }, + { + "id": 1202, + "armType": 2, + "name": "연노병", + "attack": 150, + "defence": 100, + "speed": 8, + "avoid": 10, + "magicCoef": 0, + "cost": 12, + "rice": 11, + "requirements": [ + { + "type": "ReqTech", + "tech": 1000 + }, + { + "type": "ReqRegions", + "regions": [ + "서촉" + ] + } + ], + "attackCoef": { + "3": 1.2, + "1": 0.8, + "5": 1.2 + }, + "defenceCoef": { + "3": 0.8, + "1": 1.2, + "5": 0.8 + }, + "info": [ + "화살을 연사합니다." + ], + "initSkillTrigger": null, + "phaseSkillTrigger": [ + "che_선제사격시도", + "che_선제사격발동" + ], + "iActionList": null + }, + { + "id": 1203, + "armType": 2, + "name": "강궁병", + "attack": 150, + "defence": 150, + "speed": 7, + "avoid": 10, + "magicCoef": 0, + "cost": 13, + "rice": 13, + "requirements": [ + { + "type": "ReqTech", + "tech": 3000 + }, + { + "type": "ReqCities", + "cities": [ + "양양" + ] + } + ], + "attackCoef": { + "3": 1.2, + "1": 0.8, + "5": 1.2 + }, + "defenceCoef": { + "3": 0.8, + "1": 1.2, + "5": 0.8 + }, + "info": [ + "강건한 궁병입니다." + ], + "initSkillTrigger": null, + "phaseSkillTrigger": [ + "che_선제사격시도", + "che_선제사격발동" + ], + "iActionList": null + }, + { + "id": 1204, + "armType": 2, + "name": "석궁병", + "attack": 200, + "defence": 100, + "speed": 7, + "avoid": 10, + "magicCoef": 0, + "cost": 13, + "rice": 13, + "requirements": [ + { + "type": "ReqTech", + "tech": 3000 + }, + { + "type": "ReqCities", + "cities": [ + "건업" + ] + } + ], + "attackCoef": { + "3": 1.2, + "1": 0.8, + "5": 1.2 + }, + "defenceCoef": { + "3": 0.8, + "1": 1.2, + "5": 0.8 + }, + "info": [ + "강력한 화살을 쏩니다." + ], + "initSkillTrigger": null, + "phaseSkillTrigger": [ + "che_선제사격시도", + "che_선제사격발동" + ], + "iActionList": null + }, + { + "id": 1300, + "armType": 3, + "name": "기병", + "attack": 150, + "defence": 100, + "speed": 7, + "avoid": 5, + "magicCoef": 0, + "cost": 11, + "rice": 11, + "requirements": [], + "attackCoef": { + "1": 1.2, + "2": 0.8, + "5": 1.2 + }, + "defenceCoef": { + "1": 0.8, + "2": 1.2, + "5": 0.8 + }, + "info": [ + "표준적인 기병입니다.", + "기병은 공격특화입니다." + ], + "initSkillTrigger": null, + "phaseSkillTrigger": [ + "che_기병병종전투" + ], + "iActionList": null + }, + { + "id": 1301, + "armType": 3, + "name": "백마병", + "attack": 200, + "defence": 100, + "speed": 7, + "avoid": 5, + "magicCoef": 0, + "cost": 12, + "rice": 13, + "requirements": [ + { + "type": "ReqTech", + "tech": 1000 + }, + { + "type": "ReqRegions", + "regions": [ + "하북" + ] + } + ], + "attackCoef": { + "1": 1.2, + "2": 0.8, + "5": 1.2 + }, + "defenceCoef": { + "1": 0.8, + "2": 1.2, + "5": 0.8 + }, + "info": [ + "백마의 위용을 보여줍니다." + ], + "initSkillTrigger": null, + "phaseSkillTrigger": [ + "che_기병병종전투" + ], + "iActionList": null + }, + { + "id": 1302, + "armType": 3, + "name": "중장기병", + "attack": 150, + "defence": 150, + "speed": 7, + "avoid": 5, + "magicCoef": 0, + "cost": 13, + "rice": 12, + "requirements": [ + { + "type": "ReqTech", + "tech": 1000 + }, + { + "type": "ReqRegions", + "regions": [ + "서북" + ] + } + ], + "attackCoef": { + "1": 1.2, + "2": 0.8, + "5": 1.2 + }, + "defenceCoef": { + "1": 0.8, + "2": 1.2, + "5": 0.8 + }, + "info": [ + "갑주를 두른 기병입니다." + ], + "initSkillTrigger": null, + "phaseSkillTrigger": [ + "che_기병병종전투" + ], + "iActionList": null + }, + { + "id": 1303, + "armType": 3, + "name": "돌격기병", + "attack": 200, + "defence": 100, + "speed": 8, + "avoid": 5, + "magicCoef": 0, + "cost": 13, + "rice": 11, + "requirements": [ + { + "type": "ReqTech", + "tech": 2000 + }, + { + "type": "ReqCities", + "cities": [ + "흉노" + ] + } + ], + "attackCoef": { + "1": 1.2, + "2": 0.8, + "5": 1.2 + }, + "defenceCoef": { + "1": 0.8, + "2": 1.2, + "5": 0.8 + }, + "info": [ + "저돌적으로 공격합니다." + ], + "initSkillTrigger": null, + "phaseSkillTrigger": [ + "che_기병병종전투" + ], + "iActionList": null + }, + { + "id": 1304, + "armType": 3, + "name": "철기병", + "attack": 100, + "defence": 250, + "speed": 7, + "avoid": 5, + "magicCoef": 0, + "cost": 11, + "rice": 13, + "requirements": [ + { + "type": "ReqTech", + "tech": 2000 + }, + { + "type": "ReqCities", + "cities": [ + "강" + ] + } + ], + "attackCoef": { + "1": 1.2, + "2": 0.8, + "5": 1.2 + }, + "defenceCoef": { + "1": 0.8, + "2": 1.2, + "5": 0.8 + }, + "info": [ + "철갑을 두른 기병입니다." + ], + "initSkillTrigger": null, + "phaseSkillTrigger": [ + "che_기병병종전투" + ], + "iActionList": null + }, + { + "id": 1305, + "armType": 3, + "name": "수렵기병", + "attack": 150, + "defence": 100, + "speed": 8, + "avoid": 15, + "magicCoef": 0, + "cost": 12, + "rice": 12, + "requirements": [ + { + "type": "ReqTech", + "tech": 2000 + }, + { + "type": "ReqCities", + "cities": [ + "산월" + ] + } + ], + "attackCoef": { + "1": 1.2, + "2": 0.8, + "5": 1.2 + }, + "defenceCoef": { + "1": 0.8, + "2": 1.2, + "5": 0.8 + }, + "info": [ + "날쎄고 빠른 기병입니다." + ], + "initSkillTrigger": null, + "phaseSkillTrigger": [ + "che_기병병종전투" + ], + "iActionList": null + }, + { + "id": 1306, + "armType": 3, + "name": "맹수병", + "attack": 250, + "defence": 175, + "speed": 6, + "avoid": 0, + "magicCoef": 0, + "cost": 16, + "rice": 16, + "requirements": [ + { + "type": "ReqTech", + "tech": 2000 + }, + { + "type": "ReqCities", + "cities": [ + "남만" + ] + } + ], + "attackCoef": { + "1": 1.2, + "2": 0.8, + "5": 1.2 + }, + "defenceCoef": { + "1": 0.8, + "2": 1.2, + "5": 0.8 + }, + "info": [ + "어느 누구보다 강력합니다." + ], + "initSkillTrigger": null, + "phaseSkillTrigger": [ + "che_기병병종전투" + ], + "iActionList": null + }, + { + "id": 1307, + "armType": 3, + "name": "호표기병", + "attack": 200, + "defence": 150, + "speed": 7, + "avoid": 5, + "magicCoef": 0, + "cost": 14, + "rice": 14, + "requirements": [ + { + "type": "ReqTech", + "tech": 3000 + }, + { + "type": "ReqCities", + "cities": [ + "허창" + ] + } + ], + "attackCoef": { + "1": 1.2, + "2": 0.8, + "5": 1.2 + }, + "defenceCoef": { + "1": 0.8, + "2": 1.2, + "5": 0.8 + }, + "info": [ + "정예 기병입니다." + ], + "initSkillTrigger": null, + "phaseSkillTrigger": [ + "che_기병병종전투" + ], + "iActionList": null + }, + { + "id": 1400, + "armType": 4, + "name": "귀병", + "attack": 80, + "defence": 80, + "speed": 7, + "avoid": 5, + "magicCoef": 0.5, + "cost": 9, + "rice": 9, + "requirements": [], + "attackCoef": { + "5": 1.2 + }, + "defenceCoef": { + "5": 0.8 + }, + "info": [ + "계략을 사용하는 병종입니다." + ], + "initSkillTrigger": null, + "phaseSkillTrigger": null, + "iActionList": null + }, + { + "id": 1401, + "armType": 4, + "name": "신귀병", + "attack": 80, + "defence": 80, + "speed": 7, + "avoid": 20, + "magicCoef": 0.6, + "cost": 10, + "rice": 10, + "requirements": [ + { + "type": "ReqTech", + "tech": 1000 + }, + { + "type": "ReqRegions", + "regions": [ + "초" + ] + } + ], + "attackCoef": { + "5": 1.2 + }, + "defenceCoef": { + "5": 0.8 + }, + "info": [ + "신출귀몰한 귀병입니다." + ], + "initSkillTrigger": null, + "phaseSkillTrigger": null, + "iActionList": null + }, + { + "id": 1402, + "armType": 4, + "name": "백귀병", + "attack": 80, + "defence": 130, + "speed": 7, + "avoid": 5, + "magicCoef": 0.6, + "cost": 9, + "rice": 11, + "requirements": [ + { + "type": "ReqTech", + "tech": 2000 + }, + { + "type": "ReqCities", + "cities": [ + "오환" + ] + } + ], + "attackCoef": { + "5": 1.2 + }, + "defenceCoef": { + "5": 0.8 + }, + "info": [ + "저렴하고 튼튼합니다." + ], + "initSkillTrigger": null, + "phaseSkillTrigger": null, + "iActionList": null + }, + { + "id": 1403, + "armType": 4, + "name": "흑귀병", + "attack": 130, + "defence": 80, + "speed": 7, + "avoid": 5, + "magicCoef": 0.6, + "cost": 11, + "rice": 9, + "requirements": [ + { + "type": "ReqTech", + "tech": 2000 + }, + { + "type": "ReqCities", + "cities": [ + "왜" + ] + } + ], + "attackCoef": { + "5": 1.2 + }, + "defenceCoef": { + "5": 0.8 + }, + "info": [ + "저렴하고 강력합니다." + ], + "initSkillTrigger": null, + "phaseSkillTrigger": null, + "iActionList": null + }, + { + "id": 1404, + "armType": 4, + "name": "악귀병", + "attack": 130, + "defence": 130, + "speed": 7, + "avoid": 0, + "magicCoef": 0.6, + "cost": 12, + "rice": 12, + "requirements": [ + { + "type": "ReqTech", + "tech": 3000 + }, + { + "type": "ReqCities", + "cities": [ + "장안" + ] + } + ], + "attackCoef": { + "5": 1.2 + }, + "defenceCoef": { + "5": 0.8 + }, + "info": [ + "백병전에도 능숙합니다." + ], + "initSkillTrigger": null, + "phaseSkillTrigger": null, + "iActionList": null + }, + { + "id": 1405, + "armType": 4, + "name": "남귀병", + "attack": 60, + "defence": 60, + "speed": 7, + "avoid": 10, + "magicCoef": 0.8, + "cost": 8, + "rice": 8, + "requirements": [ + { + "type": "ReqTech", + "tech": 1000 + } + ], + "attackCoef": { + "5": 1.2 + }, + "defenceCoef": { + "5": 0.8 + }, + "info": [ + "전투를 포기하고 계략에 몰두합니다." + ], + "initSkillTrigger": null, + "phaseSkillTrigger": null, + "iActionList": null + }, + { + "id": 1406, + "armType": 4, + "name": "황귀병", + "attack": 110, + "defence": 110, + "speed": 7, + "avoid": 0, + "magicCoef": 0.8, + "cost": 13, + "rice": 10, + "requirements": [ + { + "type": "ReqTech", + "tech": 3000 + }, + { + "type": "ReqCities", + "cities": [ + "낙양" + ] + } + ], + "attackCoef": { + "5": 1.2 + }, + "defenceCoef": { + "5": 0.8 + }, + "info": [ + "고도로 훈련된 귀병입니다." + ], + "initSkillTrigger": null, + "phaseSkillTrigger": null, + "iActionList": null + }, + { + "id": 1407, + "armType": 4, + "name": "천귀병", + "attack": 80, + "defence": 130, + "speed": 7, + "avoid": 15, + "magicCoef": 0.6, + "cost": 11, + "rice": 12, + "requirements": [ + { + "type": "ReqTech", + "tech": 3000 + }, + { + "type": "ReqCities", + "cities": [ + "성도" + ] + } + ], + "attackCoef": { + "5": 1.2 + }, + "defenceCoef": { + "5": 0.8 + }, + "info": [ + "갑주를 두른 귀병입니다." + ], + "initSkillTrigger": null, + "phaseSkillTrigger": null, + "iActionList": null + }, + { + "id": 1408, + "armType": 4, + "name": "마귀병", + "attack": 130, + "defence": 80, + "speed": 7, + "avoid": 15, + "magicCoef": 0.6, + "cost": 12, + "rice": 11, + "requirements": [ + { + "type": "ReqTech", + "tech": 3000 + }, + { + "type": "ReqCities", + "cities": [ + "업" + ] + } + ], + "attackCoef": { + "5": 1.2 + }, + "defenceCoef": { + "5": 0.8 + }, + "info": [ + "날카로운 무기를 가진 귀병입니다." + ], + "initSkillTrigger": null, + "phaseSkillTrigger": null, + "iActionList": null + }, + { + "id": 1500, + "armType": 5, + "name": "정란", + "attack": 100, + "defence": 100, + "speed": 6, + "avoid": 0, + "magicCoef": 0, + "cost": 14, + "rice": 5, + "requirements": [ + { + "type": "ReqMinRelYear", + "year": 3 + } + ], + "attackCoef": { + "1": 1.25, + "2": 1.25, + "3": 1.25, + "4": 1.25, + "0": 1.8, + "1106": 1.112 + }, + "defenceCoef": { + "1": 1.2, + "2": 1.2, + "3": 1.2, + "4": 1.2, + "1106": 1.067 + }, + "info": [ + "높은 구조물 위에서 공격합니다. 첫 공격은 성벽을 향합니다." + ], + "initSkillTrigger": [ + "che_성벽부상무효" + ], + "phaseSkillTrigger": [ + "che_선제사격시도", + "che_선제사격발동" + ], + "iActionList": [ + "che_성벽선제" + ] + }, + { + "id": 1501, + "armType": 5, + "name": "충차", + "attack": 150, + "defence": 100, + "speed": 6, + "avoid": 0, + "magicCoef": 0, + "cost": 18, + "rice": 5, + "requirements": [ + { + "type": "ReqTech", + "tech": 1000 + }, + { + "type": "ReqMinRelYear", + "year": 3 + } + ], + "attackCoef": { + "1": 0.8, + "2": 0.8, + "3": 0.8, + "4": 0.8, + "0": 2.4 + }, + "defenceCoef": { + "1": 1.2, + "2": 1.2, + "3": 1.2, + "4": 1.2 + }, + "info": [ + "엄청난 위력으로 성벽을 부수어버립니다." + ], + "initSkillTrigger": [ + "che_성벽부상무효" + ], + "phaseSkillTrigger": null, + "iActionList": null + }, + { + "id": 1502, + "armType": 5, + "name": "벽력거", + "attack": 150, + "defence": 100, + "speed": 6, + "avoid": 5, + "magicCoef": 0, + "cost": 20, + "rice": 5, + "requirements": [ + { + "type": "ReqTech", + "tech": 3000 + }, + { + "type": "ReqCities", + "cities": [ + "업" + ] + } + ], + "attackCoef": { + "1": 1.25, + "2": 1.25, + "3": 1.25, + "4": 1.25, + "0": 1.8, + "1106": 1.112 + }, + "defenceCoef": { + "1": 1.2, + "2": 1.2, + "3": 1.2, + "4": 1.2, + "1106": 1.067 + }, + "info": [ + "상대에게 돌덩이를 날립니다. 첫 공격은 성벽을 향합니다." + ], + "initSkillTrigger": [ + "che_성벽부상무효" + ], + "phaseSkillTrigger": [ + "che_선제사격시도", + "che_선제사격발동" + ], + "iActionList": [ + "che_성벽선제" + ] + }, + { + "id": 1503, + "armType": 5, + "name": "목우", + "attack": 50, + "defence": 200, + "speed": 5, + "avoid": 0, + "magicCoef": 0, + "cost": 15, + "rice": 5, + "requirements": [ + { + "type": "ReqTech", + "tech": 3000 + }, + { + "type": "ReqCities", + "cities": [ + "성도" + ] + } + ], + "attackCoef": { + "1": 1, + "2": 1, + "3": 1, + "4": 1, + "0": 1.8 + }, + "defenceCoef": { + "1": 1, + "2": 1, + "3": 1, + "4": 1, + "1106": 1 + }, + "info": [ + "상대를 저지하는 특수병기입니다." + ], + "initSkillTrigger": [ + "che_성벽부상무효" + ], + "phaseSkillTrigger": [ + "che_저지시도", + "che_저지발동" + ], + "iActionList": null + } + ] +} diff --git a/app/game-engine/resources/unitset/unitset_che_except_siege.json b/app/game-engine/resources/unitset/unitset_che_except_siege.json new file mode 100644 index 0000000..9585979 --- /dev/null +++ b/app/game-engine/resources/unitset/unitset_che_except_siege.json @@ -0,0 +1,1315 @@ +{ + "id": "che_except_siege", + "name": "che_except_siege", + "defaultCrewTypeId": 1100, + "armTypes": { + "1": "보병", + "2": "궁병", + "3": "기병", + "4": "귀병", + "5": "차병" + }, + "crewTypes": [ + { + "id": 1000, + "armType": 0, + "name": "성벽", + "attack": 100, + "defence": 100, + "speed": 7, + "avoid": 0, + "magicCoef": 0, + "cost": 99, + "rice": 9, + "requirements": [ + { + "type": "Impossible" + } + ], + "attackCoef": [], + "defenceCoef": { + "1": 1.2 + }, + "info": [ + "성벽입니다.", + "생성할 수 없습니다." + ], + "initSkillTrigger": null, + "phaseSkillTrigger": [ + "che_선제사격시도", + "che_선제사격발동" + ], + "iActionList": null + }, + { + "id": 1100, + "armType": 1, + "name": "보병", + "attack": 100, + "defence": 150, + "speed": 7, + "avoid": 10, + "magicCoef": 0, + "cost": 9, + "rice": 9, + "requirements": [], + "attackCoef": { + "2": 1.2, + "3": 0.8, + "5": 1.2 + }, + "defenceCoef": { + "2": 0.8, + "3": 1.2, + "5": 0.8 + }, + "info": [ + "표준적인 보병입니다.", + "보병은 방어특화이며,", + "상대가 회피하기 어렵습니다." + ], + "initSkillTrigger": null, + "phaseSkillTrigger": [ + "che_방어력증가5p" + ], + "iActionList": null + }, + { + "id": 1101, + "armType": 1, + "name": "청주병", + "attack": 100, + "defence": 200, + "speed": 7, + "avoid": 10, + "magicCoef": 0, + "cost": 10, + "rice": 11, + "requirements": [ + { + "type": "ReqTech", + "tech": 1000 + }, + { + "type": "ReqRegions", + "regions": [ + "중원" + ] + } + ], + "attackCoef": { + "2": 1.2, + "3": 0.8, + "5": 1.2 + }, + "defenceCoef": { + "2": 0.8, + "3": 1.2, + "5": 0.8 + }, + "info": [ + "저렴하고 튼튼합니다." + ], + "initSkillTrigger": null, + "phaseSkillTrigger": [ + "che_방어력증가5p" + ], + "iActionList": null + }, + { + "id": 1102, + "armType": 1, + "name": "수병", + "attack": 150, + "defence": 150, + "speed": 7, + "avoid": 10, + "magicCoef": 0, + "cost": 11, + "rice": 10, + "requirements": [ + { + "type": "ReqTech", + "tech": 1000 + }, + { + "type": "ReqRegions", + "regions": [ + "오월" + ] + } + ], + "attackCoef": { + "2": 1.2, + "3": 0.8, + "5": 1.2 + }, + "defenceCoef": { + "2": 0.8, + "3": 1.2, + "5": 0.8 + }, + "info": [ + "저렴하고 강력합니다." + ], + "initSkillTrigger": null, + "phaseSkillTrigger": [ + "che_방어력증가5p" + ], + "iActionList": null + }, + { + "id": 1103, + "armType": 1, + "name": "자객병", + "attack": 100, + "defence": 150, + "speed": 8, + "avoid": 20, + "magicCoef": 0, + "cost": 10, + "rice": 10, + "requirements": [ + { + "type": "ReqTech", + "tech": 2000 + }, + { + "type": "ReqCities", + "cities": [ + "저" + ] + } + ], + "attackCoef": { + "2": 1.2, + "3": 0.8, + "5": 1.2 + }, + "defenceCoef": { + "2": 0.8, + "3": 1.2, + "5": 0.8 + }, + "info": [ + "은밀하고 날쌥니다." + ], + "initSkillTrigger": null, + "phaseSkillTrigger": [ + "che_방어력증가5p" + ], + "iActionList": null + }, + { + "id": 1104, + "armType": 1, + "name": "근위병", + "attack": 150, + "defence": 200, + "speed": 7, + "avoid": 10, + "magicCoef": 0, + "cost": 12, + "rice": 12, + "requirements": [ + { + "type": "ReqTech", + "tech": 3000 + }, + { + "type": "ReqCities", + "cities": [ + "낙양" + ] + } + ], + "attackCoef": { + "2": 1.2, + "3": 0.8, + "5": 1.2 + }, + "defenceCoef": { + "2": 0.8, + "3": 1.2, + "5": 0.8 + }, + "info": [ + "최강의 보병입니다." + ], + "initSkillTrigger": null, + "phaseSkillTrigger": [ + "che_방어력증가5p" + ], + "iActionList": null + }, + { + "id": 1105, + "armType": 1, + "name": "등갑병", + "attack": 100, + "defence": 225, + "speed": 7, + "avoid": 5, + "magicCoef": 0, + "cost": 13, + "rice": 10, + "requirements": [ + { + "type": "ReqTech", + "tech": 1000 + }, + { + "type": "ReqRegions", + "regions": [ + "남중" + ] + } + ], + "attackCoef": { + "2": 1.2, + "3": 0.8, + "5": 1.2 + }, + "defenceCoef": { + "2": 0.8, + "3": 1.2, + "5": 0.8 + }, + "info": [ + "등갑을 두른 보병입니다." + ], + "initSkillTrigger": null, + "phaseSkillTrigger": [ + "che_방어력증가5p" + ], + "iActionList": null + }, + { + "id": 1106, + "armType": 1, + "name": "백이병", + "attack": 175, + "defence": 175, + "speed": 7, + "avoid": 5, + "magicCoef": 0, + "cost": 13, + "rice": 11, + "requirements": [ + { + "type": "ReqTech", + "tech": 3000 + }, + { + "type": "ReqCities", + "cities": [ + "성도" + ] + } + ], + "attackCoef": { + "2": 1.1, + "3": 0.9, + "5": 1.1 + }, + "defenceCoef": { + "2": 0.9, + "3": 1.1, + "5": 0.9 + }, + "info": [ + "정예 보병입니다. 불리한 싸움도 버텨냅니다." + ], + "initSkillTrigger": null, + "phaseSkillTrigger": [ + "che_방어력증가5p" + ], + "iActionList": null + }, + { + "id": 1200, + "armType": 2, + "name": "궁병", + "attack": 100, + "defence": 100, + "speed": 7, + "avoid": 10, + "magicCoef": 0, + "cost": 10, + "rice": 10, + "requirements": [], + "attackCoef": { + "3": 1.2, + "1": 0.8, + "5": 1.2 + }, + "defenceCoef": { + "3": 0.8, + "1": 1.2, + "5": 0.8 + }, + "info": [ + "표준적인 궁병입니다.", + "궁병은 선제사격을 하는 병종입니다." + ], + "initSkillTrigger": null, + "phaseSkillTrigger": [ + "che_선제사격시도", + "che_선제사격발동" + ], + "iActionList": null + }, + { + "id": 1201, + "armType": 2, + "name": "궁기병", + "attack": 100, + "defence": 100, + "speed": 8, + "avoid": 20, + "magicCoef": 0, + "cost": 11, + "rice": 12, + "requirements": [ + { + "type": "ReqTech", + "tech": 1000 + }, + { + "type": "ReqRegions", + "regions": [ + "동이" + ] + } + ], + "attackCoef": { + "3": 1.2, + "1": 0.9, + "5": 1.2 + }, + "defenceCoef": { + "3": 0.8, + "1": 1.1, + "5": 0.8 + }, + "info": [ + "말을 타고 잘 피합니다. 특히 다른 궁병보다 보병에게 조금 더 강합니다." + ], + "initSkillTrigger": null, + "phaseSkillTrigger": [ + "che_선제사격시도", + "che_선제사격발동" + ], + "iActionList": null + }, + { + "id": 1202, + "armType": 2, + "name": "연노병", + "attack": 150, + "defence": 100, + "speed": 8, + "avoid": 10, + "magicCoef": 0, + "cost": 12, + "rice": 11, + "requirements": [ + { + "type": "ReqTech", + "tech": 1000 + }, + { + "type": "ReqRegions", + "regions": [ + "서촉" + ] + } + ], + "attackCoef": { + "3": 1.2, + "1": 0.8, + "5": 1.2 + }, + "defenceCoef": { + "3": 0.8, + "1": 1.2, + "5": 0.8 + }, + "info": [ + "화살을 연사합니다." + ], + "initSkillTrigger": null, + "phaseSkillTrigger": [ + "che_선제사격시도", + "che_선제사격발동" + ], + "iActionList": null + }, + { + "id": 1203, + "armType": 2, + "name": "강궁병", + "attack": 150, + "defence": 150, + "speed": 7, + "avoid": 10, + "magicCoef": 0, + "cost": 13, + "rice": 13, + "requirements": [ + { + "type": "ReqTech", + "tech": 3000 + }, + { + "type": "ReqCities", + "cities": [ + "양양" + ] + } + ], + "attackCoef": { + "3": 1.2, + "1": 0.8, + "5": 1.2 + }, + "defenceCoef": { + "3": 0.8, + "1": 1.2, + "5": 0.8 + }, + "info": [ + "강건한 궁병입니다." + ], + "initSkillTrigger": null, + "phaseSkillTrigger": [ + "che_선제사격시도", + "che_선제사격발동" + ], + "iActionList": null + }, + { + "id": 1204, + "armType": 2, + "name": "석궁병", + "attack": 200, + "defence": 100, + "speed": 7, + "avoid": 10, + "magicCoef": 0, + "cost": 13, + "rice": 13, + "requirements": [ + { + "type": "ReqTech", + "tech": 3000 + }, + { + "type": "ReqCities", + "cities": [ + "건업" + ] + } + ], + "attackCoef": { + "3": 1.2, + "1": 0.8, + "5": 1.2 + }, + "defenceCoef": { + "3": 0.8, + "1": 1.2, + "5": 0.8 + }, + "info": [ + "강력한 화살을 쏩니다." + ], + "initSkillTrigger": null, + "phaseSkillTrigger": [ + "che_선제사격시도", + "che_선제사격발동" + ], + "iActionList": null + }, + { + "id": 1300, + "armType": 3, + "name": "기병", + "attack": 150, + "defence": 100, + "speed": 7, + "avoid": 5, + "magicCoef": 0, + "cost": 11, + "rice": 11, + "requirements": [], + "attackCoef": { + "1": 1.2, + "2": 0.8, + "5": 1.2 + }, + "defenceCoef": { + "1": 0.8, + "2": 1.2, + "5": 0.8 + }, + "info": [ + "표준적인 기병입니다.", + "기병은 공격특화입니다." + ], + "initSkillTrigger": null, + "phaseSkillTrigger": [ + "che_기병병종전투" + ], + "iActionList": null + }, + { + "id": 1301, + "armType": 3, + "name": "백마병", + "attack": 200, + "defence": 100, + "speed": 7, + "avoid": 5, + "magicCoef": 0, + "cost": 12, + "rice": 13, + "requirements": [ + { + "type": "ReqTech", + "tech": 1000 + }, + { + "type": "ReqRegions", + "regions": [ + "하북" + ] + } + ], + "attackCoef": { + "1": 1.2, + "2": 0.8, + "5": 1.2 + }, + "defenceCoef": { + "1": 0.8, + "2": 1.2, + "5": 0.8 + }, + "info": [ + "백마의 위용을 보여줍니다." + ], + "initSkillTrigger": null, + "phaseSkillTrigger": [ + "che_기병병종전투" + ], + "iActionList": null + }, + { + "id": 1302, + "armType": 3, + "name": "중장기병", + "attack": 150, + "defence": 150, + "speed": 7, + "avoid": 5, + "magicCoef": 0, + "cost": 13, + "rice": 12, + "requirements": [ + { + "type": "ReqTech", + "tech": 1000 + }, + { + "type": "ReqRegions", + "regions": [ + "서북" + ] + } + ], + "attackCoef": { + "1": 1.2, + "2": 0.8, + "5": 1.2 + }, + "defenceCoef": { + "1": 0.8, + "2": 1.2, + "5": 0.8 + }, + "info": [ + "갑주를 두른 기병입니다." + ], + "initSkillTrigger": null, + "phaseSkillTrigger": [ + "che_기병병종전투" + ], + "iActionList": null + }, + { + "id": 1303, + "armType": 3, + "name": "돌격기병", + "attack": 200, + "defence": 100, + "speed": 8, + "avoid": 5, + "magicCoef": 0, + "cost": 13, + "rice": 11, + "requirements": [ + { + "type": "ReqTech", + "tech": 2000 + }, + { + "type": "ReqCities", + "cities": [ + "흉노" + ] + } + ], + "attackCoef": { + "1": 1.2, + "2": 0.8, + "5": 1.2 + }, + "defenceCoef": { + "1": 0.8, + "2": 1.2, + "5": 0.8 + }, + "info": [ + "저돌적으로 공격합니다." + ], + "initSkillTrigger": null, + "phaseSkillTrigger": [ + "che_기병병종전투" + ], + "iActionList": null + }, + { + "id": 1304, + "armType": 3, + "name": "철기병", + "attack": 100, + "defence": 200, + "speed": 7, + "avoid": 5, + "magicCoef": 0, + "cost": 11, + "rice": 13, + "requirements": [ + { + "type": "ReqTech", + "tech": 2000 + }, + { + "type": "ReqCities", + "cities": [ + "강" + ] + } + ], + "attackCoef": { + "1": 1.2, + "2": 0.8, + "5": 1.2 + }, + "defenceCoef": { + "1": 0.8, + "2": 1.2, + "5": 0.8 + }, + "info": [ + "철갑을 두른 기병입니다." + ], + "initSkillTrigger": null, + "phaseSkillTrigger": [ + "che_기병병종전투" + ], + "iActionList": null + }, + { + "id": 1305, + "armType": 3, + "name": "수렵기병", + "attack": 150, + "defence": 100, + "speed": 8, + "avoid": 15, + "magicCoef": 0, + "cost": 12, + "rice": 12, + "requirements": [ + { + "type": "ReqTech", + "tech": 2000 + }, + { + "type": "ReqCities", + "cities": [ + "산월" + ] + } + ], + "attackCoef": { + "1": 1.2, + "2": 0.8, + "5": 1.2 + }, + "defenceCoef": { + "1": 0.8, + "2": 1.2, + "5": 0.8 + }, + "info": [ + "날쎄고 빠른 기병입니다." + ], + "initSkillTrigger": null, + "phaseSkillTrigger": [ + "che_기병병종전투" + ], + "iActionList": null + }, + { + "id": 1306, + "armType": 3, + "name": "맹수병", + "attack": 250, + "defence": 175, + "speed": 6, + "avoid": 0, + "magicCoef": 0, + "cost": 16, + "rice": 16, + "requirements": [ + { + "type": "ReqTech", + "tech": 2000 + }, + { + "type": "ReqCities", + "cities": [ + "남만" + ] + } + ], + "attackCoef": { + "1": 1.2, + "2": 0.8, + "5": 1.2 + }, + "defenceCoef": { + "1": 0.8, + "2": 1.2, + "5": 0.8 + }, + "info": [ + "어느 누구보다 강력합니다." + ], + "initSkillTrigger": null, + "phaseSkillTrigger": [ + "che_기병병종전투" + ], + "iActionList": null + }, + { + "id": 1307, + "armType": 3, + "name": "호표기병", + "attack": 200, + "defence": 150, + "speed": 7, + "avoid": 5, + "magicCoef": 0, + "cost": 14, + "rice": 14, + "requirements": [ + { + "type": "ReqTech", + "tech": 3000 + }, + { + "type": "ReqCities", + "cities": [ + "허창" + ] + } + ], + "attackCoef": { + "1": 1.2, + "2": 0.8, + "5": 1.2 + }, + "defenceCoef": { + "1": 0.8, + "2": 1.2, + "5": 0.8 + }, + "info": [ + "정예 기병입니다." + ], + "initSkillTrigger": null, + "phaseSkillTrigger": [ + "che_기병병종전투" + ], + "iActionList": null + }, + { + "id": 1400, + "armType": 4, + "name": "귀병", + "attack": 80, + "defence": 80, + "speed": 7, + "avoid": 5, + "magicCoef": 0.5, + "cost": 9, + "rice": 9, + "requirements": [], + "attackCoef": { + "5": 1.2 + }, + "defenceCoef": { + "5": 0.8 + }, + "info": [ + "계략을 사용하는 병종입니다." + ], + "initSkillTrigger": null, + "phaseSkillTrigger": null, + "iActionList": null + }, + { + "id": 1401, + "armType": 4, + "name": "신귀병", + "attack": 80, + "defence": 80, + "speed": 7, + "avoid": 20, + "magicCoef": 0.6, + "cost": 10, + "rice": 10, + "requirements": [ + { + "type": "ReqTech", + "tech": 1000 + }, + { + "type": "ReqRegions", + "regions": [ + "초" + ] + } + ], + "attackCoef": { + "5": 1.2 + }, + "defenceCoef": { + "5": 0.8 + }, + "info": [ + "신출귀몰한 귀병입니다." + ], + "initSkillTrigger": null, + "phaseSkillTrigger": null, + "iActionList": null + }, + { + "id": 1402, + "armType": 4, + "name": "백귀병", + "attack": 80, + "defence": 130, + "speed": 7, + "avoid": 5, + "magicCoef": 0.6, + "cost": 9, + "rice": 11, + "requirements": [ + { + "type": "ReqTech", + "tech": 2000 + }, + { + "type": "ReqCities", + "cities": [ + "오환" + ] + } + ], + "attackCoef": { + "5": 1.2 + }, + "defenceCoef": { + "5": 0.8 + }, + "info": [ + "저렴하고 튼튼합니다." + ], + "initSkillTrigger": null, + "phaseSkillTrigger": null, + "iActionList": null + }, + { + "id": 1403, + "armType": 4, + "name": "흑귀병", + "attack": 130, + "defence": 80, + "speed": 7, + "avoid": 5, + "magicCoef": 0.6, + "cost": 11, + "rice": 9, + "requirements": [ + { + "type": "ReqTech", + "tech": 2000 + }, + { + "type": "ReqCities", + "cities": [ + "왜" + ] + } + ], + "attackCoef": { + "5": 1.2 + }, + "defenceCoef": { + "5": 0.8 + }, + "info": [ + "저렴하고 강력합니다." + ], + "initSkillTrigger": null, + "phaseSkillTrigger": null, + "iActionList": null + }, + { + "id": 1404, + "armType": 4, + "name": "악귀병", + "attack": 130, + "defence": 130, + "speed": 7, + "avoid": 0, + "magicCoef": 0.6, + "cost": 12, + "rice": 12, + "requirements": [ + { + "type": "ReqTech", + "tech": 3000 + }, + { + "type": "ReqCities", + "cities": [ + "장안" + ] + } + ], + "attackCoef": { + "5": 1.2 + }, + "defenceCoef": { + "5": 0.8 + }, + "info": [ + "백병전에도 능숙합니다." + ], + "initSkillTrigger": null, + "phaseSkillTrigger": null, + "iActionList": null + }, + { + "id": 1405, + "armType": 4, + "name": "남귀병", + "attack": 60, + "defence": 60, + "speed": 7, + "avoid": 10, + "magicCoef": 0.8, + "cost": 8, + "rice": 8, + "requirements": [ + { + "type": "ReqTech", + "tech": 1000 + } + ], + "attackCoef": { + "5": 1.2 + }, + "defenceCoef": { + "5": 0.8 + }, + "info": [ + "전투를 포기하고 계략에 몰두합니다." + ], + "initSkillTrigger": null, + "phaseSkillTrigger": null, + "iActionList": null + }, + { + "id": 1406, + "armType": 4, + "name": "황귀병", + "attack": 110, + "defence": 110, + "speed": 7, + "avoid": 0, + "magicCoef": 0.8, + "cost": 13, + "rice": 10, + "requirements": [ + { + "type": "ReqTech", + "tech": 3000 + }, + { + "type": "ReqCities", + "cities": [ + "낙양" + ] + } + ], + "attackCoef": { + "5": 1.2 + }, + "defenceCoef": { + "5": 0.8 + }, + "info": [ + "고도로 훈련된 귀병입니다." + ], + "initSkillTrigger": null, + "phaseSkillTrigger": null, + "iActionList": null + }, + { + "id": 1407, + "armType": 4, + "name": "천귀병", + "attack": 80, + "defence": 130, + "speed": 7, + "avoid": 15, + "magicCoef": 0.6, + "cost": 11, + "rice": 12, + "requirements": [ + { + "type": "ReqTech", + "tech": 3000 + }, + { + "type": "ReqCities", + "cities": [ + "성도" + ] + } + ], + "attackCoef": { + "5": 1.2 + }, + "defenceCoef": { + "5": 0.8 + }, + "info": [ + "갑주를 두른 귀병입니다." + ], + "initSkillTrigger": null, + "phaseSkillTrigger": null, + "iActionList": null + }, + { + "id": 1408, + "armType": 4, + "name": "마귀병", + "attack": 130, + "defence": 80, + "speed": 7, + "avoid": 15, + "magicCoef": 0.6, + "cost": 12, + "rice": 11, + "requirements": [ + { + "type": "ReqTech", + "tech": 3000 + }, + { + "type": "ReqCities", + "cities": [ + "업" + ] + } + ], + "attackCoef": { + "5": 1.2 + }, + "defenceCoef": { + "5": 0.8 + }, + "info": [ + "날카로운 무기를 가진 귀병입니다." + ], + "initSkillTrigger": null, + "phaseSkillTrigger": null, + "iActionList": null + }, + { + "id": 1500, + "armType": 5, + "name": "정란", + "attack": 100, + "defence": 100, + "speed": 6, + "avoid": 0, + "magicCoef": 0, + "cost": 14, + "rice": 5, + "requirements": [ + { + "type": "ReqMinRelYear", + "year": 3 + } + ], + "attackCoef": { + "1": 1.25, + "2": 1.25, + "3": 1.25, + "4": 1.25, + "0": 1.2, + "1106": 1.112 + }, + "defenceCoef": { + "1": 1.2, + "2": 1.2, + "3": 1.2, + "4": 1.2, + "1106": 1.067 + }, + "info": [ + "높은 구조물 위에서 공격합니다. 첫 공격은 성벽을 향합니다." + ], + "initSkillTrigger": [ + "che_성벽부상무효" + ], + "phaseSkillTrigger": [ + "che_선제사격시도", + "che_선제사격발동" + ], + "iActionList": [ + "che_성벽선제" + ] + }, + { + "id": 1502, + "armType": 5, + "name": "벽력거", + "attack": 150, + "defence": 100, + "speed": 6, + "avoid": 5, + "magicCoef": 0, + "cost": 20, + "rice": 5, + "requirements": [ + { + "type": "ReqTech", + "tech": 3000 + }, + { + "type": "ReqCities", + "cities": [ + "업" + ] + } + ], + "attackCoef": { + "1": 1.25, + "2": 1.25, + "3": 1.25, + "4": 1.25, + "0": 1.2, + "1106": 1.112 + }, + "defenceCoef": { + "1": 1.2, + "2": 1.2, + "3": 1.2, + "4": 1.2, + "1106": 1.067 + }, + "info": [ + "상대에게 돌덩이를 날립니다. 첫 공격은 성벽을 향합니다." + ], + "initSkillTrigger": [ + "che_성벽부상무효" + ], + "phaseSkillTrigger": [ + "che_선제사격시도", + "che_선제사격발동" + ], + "iActionList": [ + "che_성벽선제" + ] + }, + { + "id": 1503, + "armType": 5, + "name": "목우", + "attack": 50, + "defence": 200, + "speed": 5, + "avoid": 0, + "magicCoef": 0, + "cost": 15, + "rice": 5, + "requirements": [ + { + "type": "ReqTech", + "tech": 3000 + }, + { + "type": "ReqCities", + "cities": [ + "성도" + ] + } + ], + "attackCoef": { + "1": 1, + "2": 1, + "3": 1, + "4": 1, + "0": 1.2 + }, + "defenceCoef": { + "1": 1, + "2": 1, + "3": 1, + "4": 1, + "1106": 1 + }, + "info": [ + "상대를 저지하는 특수병기입니다." + ], + "initSkillTrigger": [ + "che_성벽부상무효" + ], + "phaseSkillTrigger": [ + "che_저지시도", + "che_저지발동" + ], + "iActionList": null + } + ] +} diff --git a/app/game-engine/resources/unitset/unitset_cr.json b/app/game-engine/resources/unitset/unitset_cr.json new file mode 100644 index 0000000..0e4f09e --- /dev/null +++ b/app/game-engine/resources/unitset/unitset_cr.json @@ -0,0 +1,836 @@ +{ + "id": "cr", + "name": "cr", + "defaultCrewTypeId": 1100, + "armTypes": { + "1": "보병", + "2": "궁병", + "3": "기병", + "4": "귀병", + "5": "차병" + }, + "crewTypes": [ + { + "id": 1000, + "armType": 0, + "name": "성벽", + "attack": 100, + "defence": 100, + "speed": 7, + "avoid": 0, + "magicCoef": 0, + "cost": 99, + "rice": 9, + "requirements": [ + { + "type": "Impossible" + } + ], + "attackCoef": [], + "defenceCoef": { + "1": 1.2 + }, + "info": [ + "성벽입니다.", + "생성할 수 없습니다." + ], + "initSkillTrigger": null, + "phaseSkillTrigger": null, + "iActionList": null + }, + { + "id": 1100, + "armType": 1, + "name": "보병", + "attack": 100, + "defence": 150, + "speed": 7, + "avoid": 10, + "magicCoef": 0, + "cost": 9, + "rice": 9, + "requirements": [], + "attackCoef": { + "2": 1.2, + "3": 0.8, + "5": 1.2 + }, + "defenceCoef": { + "2": 0.8, + "3": 1.2, + "5": 0.8 + }, + "info": [ + "표준적인 보병입니다.", + "보병은 방어특화이며,", + "상대가 회피하기 어렵습니다." + ], + "initSkillTrigger": null, + "phaseSkillTrigger": null, + "iActionList": null + }, + { + "id": 1200, + "armType": 2, + "name": "궁병", + "attack": 100, + "defence": 100, + "speed": 7, + "avoid": 10, + "magicCoef": 0, + "cost": 10, + "rice": 10, + "requirements": [], + "attackCoef": { + "3": 1.2, + "1": 0.8, + "5": 1.2 + }, + "defenceCoef": { + "3": 0.8, + "1": 1.2, + "5": 0.8 + }, + "info": [ + "표준적인 궁병입니다.", + "궁병은 선제사격을 하는 병종입니다." + ], + "initSkillTrigger": null, + "phaseSkillTrigger": [ + "che_선제사격시도", + "che_선제사격발동" + ], + "iActionList": null + }, + { + "id": 1300, + "armType": 3, + "name": "기병", + "attack": 150, + "defence": 100, + "speed": 7, + "avoid": 5, + "magicCoef": 0, + "cost": 11, + "rice": 11, + "requirements": [], + "attackCoef": { + "1": 1.2, + "2": 0.8, + "5": 1.2 + }, + "defenceCoef": { + "1": 0.8, + "2": 1.2, + "5": 0.8 + }, + "info": [ + "표준적인 기병입니다.", + "기병은 공격특화입니다." + ], + "initSkillTrigger": null, + "phaseSkillTrigger": null, + "iActionList": null + }, + { + "id": 1104, + "armType": 1, + "name": "근위병", + "attack": 150, + "defence": 200, + "speed": 7, + "avoid": 10, + "magicCoef": 0, + "cost": 12, + "rice": 12, + "requirements": [ + { + "type": "ReqTech", + "tech": 2000 + }, + { + "type": "ReqCities", + "cities": [ + "낙양" + ] + } + ], + "attackCoef": { + "2": 1.2, + "3": 0.8, + "5": 1.2 + }, + "defenceCoef": { + "2": 0.8, + "3": 1.2, + "5": 0.8 + }, + "info": [ + "최강의 보병입니다." + ], + "initSkillTrigger": null, + "phaseSkillTrigger": [ + "che_방어력증가5p" + ], + "iActionList": null + }, + { + "id": 1106, + "armType": 1, + "name": "백이병", + "attack": 175, + "defence": 175, + "speed": 7, + "avoid": 5, + "magicCoef": 0, + "cost": 13, + "rice": 11, + "requirements": [ + { + "type": "ReqTech", + "tech": 2000 + }, + { + "type": "ReqCities", + "cities": [ + "성도" + ] + } + ], + "attackCoef": { + "2": 1.1, + "3": 0.9, + "5": 1.1 + }, + "defenceCoef": { + "2": 0.9, + "3": 1.1, + "5": 0.9 + }, + "info": [ + "정예 보병입니다. 불리한 싸움도 버텨냅니다." + ], + "initSkillTrigger": null, + "phaseSkillTrigger": [ + "che_방어력증가5p" + ], + "iActionList": null + }, + { + "id": 97201, + "armType": 2, + "name": "화랑", + "attack": 175, + "defence": 150, + "speed": 8, + "avoid": 15, + "magicCoef": 0.05, + "cost": 13, + "rice": 13, + "requirements": [ + { + "type": "ReqTech", + "tech": 2000 + }, + { + "type": "ReqCities", + "cities": [ + "한", + "서라벌" + ] + } + ], + "attackCoef": { + "3": 1.2, + "1": 0.9, + "5": 1.2 + }, + "defenceCoef": { + "3": 0.8, + "1": 1.1, + "5": 0.8 + }, + "info": [ + "특수한 궁병입니다." + ], + "initSkillTrigger": null, + "phaseSkillTrigger": [ + "che_선제사격시도", + "che_선제사격발동" + ], + "iActionList": null + }, + { + "id": 1204, + "armType": 2, + "name": "석궁병", + "attack": 200, + "defence": 125, + "speed": 7, + "avoid": 10, + "magicCoef": 0, + "cost": 13, + "rice": 13, + "requirements": [ + { + "type": "ReqTech", + "tech": 2000 + }, + { + "type": "ReqCities", + "cities": [ + "건업" + ] + } + ], + "attackCoef": { + "3": 1.2, + "1": 0.8, + "5": 1.2 + }, + "defenceCoef": { + "3": 0.8, + "1": 1.2, + "5": 0.8 + }, + "info": [ + "강력한 화살을 쏩니다." + ], + "initSkillTrigger": null, + "phaseSkillTrigger": [ + "che_선제사격시도", + "che_선제사격발동" + ], + "iActionList": null + }, + { + "id": 1303, + "armType": 3, + "name": "돌격기병", + "attack": 200, + "defence": 125, + "speed": 8, + "avoid": 10, + "magicCoef": 0, + "cost": 13, + "rice": 12, + "requirements": [ + { + "type": "ReqTech", + "tech": 2000 + }, + { + "type": "ReqCities", + "cities": [ + "서량", + "안정" + ] + } + ], + "attackCoef": { + "1": 1.2, + "2": 0.8, + "5": 1.2 + }, + "defenceCoef": { + "1": 0.8, + "2": 1.2, + "5": 0.8 + }, + "info": [ + "저돌적으로 공격합니다." + ], + "initSkillTrigger": null, + "phaseSkillTrigger": [ + "che_기병병종전투" + ], + "iActionList": null + }, + { + "id": 1307, + "armType": 3, + "name": "호표기병", + "attack": 200, + "defence": 150, + "speed": 7, + "avoid": 5, + "magicCoef": 0, + "cost": 14, + "rice": 14, + "requirements": [ + { + "type": "ReqTech", + "tech": 2000 + }, + { + "type": "ReqCities", + "cities": [ + "허창" + ] + } + ], + "attackCoef": { + "1": 1.2, + "2": 0.8, + "5": 1.2 + }, + "defenceCoef": { + "1": 0.8, + "2": 1.2, + "5": 0.8 + }, + "info": [ + "정예 기병입니다." + ], + "initSkillTrigger": null, + "phaseSkillTrigger": [ + "che_기병병종전투" + ], + "iActionList": null + }, + { + "id": 1306, + "armType": 3, + "name": "맹수병", + "attack": 250, + "defence": 175, + "speed": 6, + "avoid": 0, + "magicCoef": 0, + "cost": 16, + "rice": 16, + "requirements": [ + { + "type": "ReqTech", + "tech": 2000 + }, + { + "type": "ReqCities", + "cities": [ + "운남" + ] + } + ], + "attackCoef": { + "1": 1.2, + "2": 0.8, + "5": 1.2 + }, + "defenceCoef": { + "1": 0.8, + "2": 1.2, + "5": 0.8 + }, + "info": [ + "어느 누구보다 강력합니다." + ], + "initSkillTrigger": null, + "phaseSkillTrigger": [ + "che_기병병종전투" + ], + "iActionList": null + }, + { + "id": 1400, + "armType": 4, + "name": "귀병", + "attack": 80, + "defence": 80, + "speed": 7, + "avoid": 5, + "magicCoef": 0.5, + "cost": 9, + "rice": 9, + "requirements": [], + "attackCoef": { + "5": 1.2 + }, + "defenceCoef": { + "5": 0.8 + }, + "info": [ + "계략을 사용하는 병종입니다." + ], + "initSkillTrigger": null, + "phaseSkillTrigger": null, + "iActionList": null + }, + { + "id": 1405, + "armType": 4, + "name": "남귀병", + "attack": 60, + "defence": 60, + "speed": 7, + "avoid": 10, + "magicCoef": 0.8, + "cost": 8, + "rice": 8, + "requirements": [ + { + "type": "ReqTech", + "tech": 1000 + } + ], + "attackCoef": { + "5": 1.2 + }, + "defenceCoef": { + "5": 0.8 + }, + "info": [ + "전투를 포기하고 계략에 몰두합니다." + ], + "initSkillTrigger": null, + "phaseSkillTrigger": null, + "iActionList": null + }, + { + "id": 1404, + "armType": 4, + "name": "악귀병", + "attack": 130, + "defence": 130, + "speed": 7, + "avoid": 0, + "magicCoef": 0.6, + "cost": 12, + "rice": 12, + "requirements": [ + { + "type": "ReqTech", + "tech": 2000 + }, + { + "type": "ReqCities", + "cities": [ + "장안" + ] + } + ], + "attackCoef": { + "5": 1.2 + }, + "defenceCoef": { + "5": 0.8 + }, + "info": [ + "백병전에도 능숙합니다." + ], + "initSkillTrigger": null, + "phaseSkillTrigger": null, + "iActionList": null + }, + { + "id": 1407, + "armType": 4, + "name": "천귀병", + "attack": 90, + "defence": 130, + "speed": 7, + "avoid": 15, + "magicCoef": 0.6, + "cost": 11, + "rice": 12, + "requirements": [ + { + "type": "ReqTech", + "tech": 2000 + }, + { + "type": "ReqCities", + "cities": [ + "성도" + ] + } + ], + "attackCoef": { + "5": 1.2 + }, + "defenceCoef": { + "5": 0.8 + }, + "info": [ + "갑주를 두른 귀병입니다." + ], + "initSkillTrigger": null, + "phaseSkillTrigger": null, + "iActionList": null + }, + { + "id": 1500, + "armType": 5, + "name": "정란", + "attack": 100, + "defence": 100, + "speed": 6, + "avoid": 0, + "magicCoef": 0, + "cost": 14, + "rice": 5, + "requirements": [ + { + "type": "ReqMinRelYear", + "year": 3 + } + ], + "attackCoef": { + "1": 1.25, + "2": 1.25, + "3": 1.25, + "4": 1.25, + "0": 1.8, + "1106": 1.112 + }, + "defenceCoef": { + "1": 1.2, + "2": 1.2, + "3": 1.2, + "4": 1.2 + }, + "info": [ + "높은 구조물 위에서 공격합니다." + ], + "initSkillTrigger": [ + "che_성벽부상무효" + ], + "phaseSkillTrigger": [ + "che_선제사격시도", + "che_선제사격발동" + ], + "iActionList": null + }, + { + "id": 1501, + "armType": 5, + "name": "충차", + "attack": 150, + "defence": 100, + "speed": 6, + "avoid": 0, + "magicCoef": 0, + "cost": 20, + "rice": 5, + "requirements": [ + { + "type": "ReqTech", + "tech": 1000 + }, + { + "type": "ReqMinRelYear", + "year": 3 + } + ], + "attackCoef": { + "1": 0.8, + "2": 0.8, + "3": 0.8, + "4": 0.8, + "0": 2.4 + }, + "defenceCoef": { + "1": 1.2, + "2": 1.2, + "3": 1.2, + "4": 1.2 + }, + "info": [ + "엄청난 위력으로 성벽을 부수어버립니다." + ], + "initSkillTrigger": [ + "che_성벽부상무효" + ], + "phaseSkillTrigger": null, + "iActionList": null + }, + { + "id": 1502, + "armType": 5, + "name": "벽력거", + "attack": 135, + "defence": 100, + "speed": 6, + "avoid": 5, + "magicCoef": 0, + "cost": 20, + "rice": 5, + "requirements": [ + { + "type": "ReqTech", + "tech": 2000 + }, + { + "type": "ReqCities", + "cities": [ + "업" + ] + } + ], + "attackCoef": { + "1": 1.25, + "2": 1.25, + "3": 1.25, + "4": 1.25, + "0": 1.8, + "1106": 1.112 + }, + "defenceCoef": { + "1": 0.833, + "2": 0.833, + "3": 0.833, + "4": 0.833, + "1106": 0.909 + }, + "info": [ + "상대에게 돌덩이를 날립니다." + ], + "initSkillTrigger": [ + "che_성벽부상무효" + ], + "phaseSkillTrigger": [ + "che_선제사격시도", + "che_선제사격발동" + ], + "iActionList": null + }, + { + "id": 97101, + "armType": 1, + "name": "중장보병", + "attack": 150, + "defence": 175, + "speed": 7, + "avoid": 10, + "magicCoef": 0, + "cost": 12, + "rice": 12, + "requirements": [ + { + "type": "ReqTech", + "tech": 3000 + } + ], + "attackCoef": { + "2": 1.2, + "3": 0.8, + "5": 1.2 + }, + "defenceCoef": { + "2": 0.8, + "3": 1.2, + "5": 0.8 + }, + "info": [ + "전천후 보병입니다." + ], + "initSkillTrigger": null, + "phaseSkillTrigger": [ + "che_방어력증가5p" + ], + "iActionList": null + }, + { + "id": 1202, + "armType": 2, + "name": "연노병", + "attack": 150, + "defence": 175, + "speed": 8, + "avoid": 10, + "magicCoef": 0, + "cost": 12, + "rice": 12, + "requirements": [ + { + "type": "ReqTech", + "tech": 3000 + } + ], + "attackCoef": { + "3": 1.2, + "1": 0.8, + "5": 1.2 + }, + "defenceCoef": { + "3": 0.8, + "1": 1.2, + "5": 0.8 + }, + "info": [ + "화살을 연사합니다." + ], + "initSkillTrigger": null, + "phaseSkillTrigger": [ + "che_선제사격시도", + "che_선제사격발동" + ], + "iActionList": null + }, + { + "id": 1304, + "armType": 3, + "name": "철기병", + "attack": 175, + "defence": 175, + "speed": 7, + "avoid": 5, + "magicCoef": 0, + "cost": 13, + "rice": 13, + "requirements": [ + { + "type": "ReqTech", + "tech": 3000 + } + ], + "attackCoef": { + "1": 1.2, + "2": 0.8, + "5": 1.2 + }, + "defenceCoef": { + "1": 0.8, + "2": 1.2, + "5": 0.8 + }, + "info": [ + "철갑을 두른 기병입니다." + ], + "initSkillTrigger": null, + "phaseSkillTrigger": [ + "che_기병병종전투" + ], + "iActionList": null + }, + { + "id": 1401, + "armType": 4, + "name": "신귀병", + "attack": 100, + "defence": 100, + "speed": 7, + "avoid": 20, + "magicCoef": 0.6, + "cost": 12, + "rice": 12, + "requirements": [ + { + "type": "ReqTech", + "tech": 3000 + } + ], + "attackCoef": { + "5": 1.2 + }, + "defenceCoef": { + "5": 0.8 + }, + "info": [ + "신출귀몰한 귀병입니다." + ], + "initSkillTrigger": null, + "phaseSkillTrigger": null, + "iActionList": null + } + ] +} diff --git a/app/game-engine/resources/unitset/unitset_event_more_crewtype.json b/app/game-engine/resources/unitset/unitset_event_more_crewtype.json new file mode 100644 index 0000000..311f007 --- /dev/null +++ b/app/game-engine/resources/unitset/unitset_event_more_crewtype.json @@ -0,0 +1,1974 @@ +{ + "id": "event_more_crewtype", + "name": "event_more_crewtype", + "defaultCrewTypeId": 1100, + "armTypes": { + "1": "보병", + "2": "궁병", + "3": "기병", + "4": "귀병", + "5": "차병" + }, + "crewTypes": [ + { + "id": 1000, + "armType": 0, + "name": "성벽", + "attack": 100, + "defence": 100, + "speed": 7, + "avoid": 0, + "magicCoef": 0, + "cost": 99, + "rice": 9, + "requirements": [ + { + "type": "Impossible" + } + ], + "attackCoef": [], + "defenceCoef": { + "1": 1.2 + }, + "info": [ + "성벽입니다.", + "생성할 수 없습니다." + ], + "initSkillTrigger": null, + "phaseSkillTrigger": [ + "che_선제사격시도", + "che_선제사격발동" + ], + "iActionList": null + }, + { + "id": 1100, + "armType": 1, + "name": "보병", + "attack": 100, + "defence": 150, + "speed": 7, + "avoid": 10, + "magicCoef": 0, + "cost": 9, + "rice": 9, + "requirements": [], + "attackCoef": { + "2": 1.2, + "3": 0.8, + "5": 1.2 + }, + "defenceCoef": { + "2": 0.8, + "3": 1.2, + "5": 0.8 + }, + "info": [ + "표준적인 보병입니다.", + "보병은 방어특화이며,", + "상대가 회피하기 어렵습니다." + ], + "initSkillTrigger": null, + "phaseSkillTrigger": [ + "che_방어력증가5p" + ], + "iActionList": null + }, + { + "id": 1101, + "armType": 1, + "name": "청주병", + "attack": 100, + "defence": 200, + "speed": 7, + "avoid": 10, + "magicCoef": 0, + "cost": 10, + "rice": 11, + "requirements": [ + { + "type": "ReqTech", + "tech": 1000 + }, + { + "type": "ReqRegions", + "regions": [ + "중원" + ] + } + ], + "attackCoef": { + "2": 1.2, + "3": 0.8, + "5": 1.2 + }, + "defenceCoef": { + "2": 0.8, + "3": 1.2, + "5": 0.8 + }, + "info": [ + "저렴하고 튼튼합니다." + ], + "initSkillTrigger": null, + "phaseSkillTrigger": [ + "che_방어력증가5p" + ], + "iActionList": null + }, + { + "id": 1102, + "armType": 1, + "name": "수병", + "attack": 150, + "defence": 150, + "speed": 7, + "avoid": 10, + "magicCoef": 0, + "cost": 11, + "rice": 10, + "requirements": [ + { + "type": "ReqTech", + "tech": 1000 + }, + { + "type": "ReqRegions", + "regions": [ + "오월" + ] + } + ], + "attackCoef": { + "2": 1.2, + "3": 0.8, + "5": 1.2 + }, + "defenceCoef": { + "2": 0.8, + "3": 1.2, + "5": 0.8 + }, + "info": [ + "저렴하고 강력합니다." + ], + "initSkillTrigger": null, + "phaseSkillTrigger": [ + "che_방어력증가5p" + ], + "iActionList": null + }, + { + "id": 1103, + "armType": 1, + "name": "자객병", + "attack": 100, + "defence": 150, + "speed": 8, + "avoid": 20, + "magicCoef": 0, + "cost": 10, + "rice": 10, + "requirements": [ + { + "type": "ReqTech", + "tech": 2000 + }, + { + "type": "ReqCities", + "cities": [ + "저" + ] + } + ], + "attackCoef": { + "2": 1.2, + "3": 0.8, + "5": 1.2 + }, + "defenceCoef": { + "2": 0.8, + "3": 1.2, + "5": 0.8 + }, + "info": [ + "은밀하고 날쌥니다." + ], + "initSkillTrigger": null, + "phaseSkillTrigger": [ + "che_방어력증가5p" + ], + "iActionList": null + }, + { + "id": 1104, + "armType": 1, + "name": "근위병", + "attack": 150, + "defence": 200, + "speed": 7, + "avoid": 10, + "magicCoef": 0, + "cost": 12, + "rice": 12, + "requirements": [ + { + "type": "ReqTech", + "tech": 3000 + }, + { + "type": "ReqCities", + "cities": [ + "낙양" + ] + } + ], + "attackCoef": { + "2": 1.2, + "3": 0.8, + "5": 1.2 + }, + "defenceCoef": { + "2": 0.8, + "3": 1.2, + "5": 0.8 + }, + "info": [ + "최강의 보병입니다." + ], + "initSkillTrigger": null, + "phaseSkillTrigger": [ + "che_방어력증가5p" + ], + "iActionList": null + }, + { + "id": 1105, + "armType": 1, + "name": "등갑병", + "attack": 100, + "defence": 225, + "speed": 7, + "avoid": 5, + "magicCoef": 0, + "cost": 13, + "rice": 10, + "requirements": [ + { + "type": "ReqTech", + "tech": 1000 + }, + { + "type": "ReqRegions", + "regions": [ + "남중" + ] + } + ], + "attackCoef": { + "2": 1.2, + "3": 0.8, + "5": 1.2 + }, + "defenceCoef": { + "2": 0.8, + "3": 1.2, + "5": 0.8 + }, + "info": [ + "등갑을 두른 보병입니다." + ], + "initSkillTrigger": null, + "phaseSkillTrigger": [ + "che_방어력증가5p" + ], + "iActionList": null + }, + { + "id": 1106, + "armType": 1, + "name": "백이병", + "attack": 175, + "defence": 175, + "speed": 7, + "avoid": 5, + "magicCoef": 0, + "cost": 13, + "rice": 11, + "requirements": [ + { + "type": "ReqTech", + "tech": 3000 + }, + { + "type": "ReqCities", + "cities": [ + "성도" + ] + } + ], + "attackCoef": { + "2": 1.1, + "3": 0.9, + "5": 1.1 + }, + "defenceCoef": { + "2": 0.9, + "3": 1.1, + "5": 0.9 + }, + "info": [ + "정예 보병입니다. 불리한 싸움도 버텨냅니다." + ], + "initSkillTrigger": null, + "phaseSkillTrigger": [ + "che_방어력증가5p" + ], + "iActionList": null + }, + { + "id": 91100, + "armType": 1, + "name": "대검병", + "attack": 150, + "defence": 225, + "speed": 7, + "avoid": 10, + "magicCoef": 0, + "cost": 13, + "rice": 13, + "requirements": [ + { + "type": "ReqTech", + "tech": 4000 + }, + { + "type": "ReqCitiesWithCityLevel", + "level": 8, + "cities": [ + "완" + ] + }, + { + "type": "ReqNationAux", + "key": "can_대검병사용", + "op": "==", + "value": 1 + } + ], + "attackCoef": { + "2": 1.2, + "3": 0.8, + "5": 1.2 + }, + "defenceCoef": { + "2": 0.8, + "3": 1.2, + "5": 0.8 + }, + "info": [ + "대형 검을 사용합니다." + ], + "initSkillTrigger": null, + "phaseSkillTrigger": [ + "che_방어력증가5p" + ], + "iActionList": null + }, + { + "id": 91101, + "armType": 1, + "name": "강습병", + "attack": 175, + "defence": 200, + "speed": 7, + "avoid": 10, + "magicCoef": 0, + "cost": 13, + "rice": 13, + "requirements": [ + { + "type": "ReqTech", + "tech": 4000 + }, + { + "type": "ReqCitiesWithCityLevel", + "level": 8, + "cities": [ + "북평" + ] + } + ], + "attackCoef": { + "2": 1.2, + "3": 0.8, + "5": 1.2 + }, + "defenceCoef": { + "2": 0.8, + "3": 1.2, + "5": 0.8 + }, + "info": [ + "철퇴를 사용합니다." + ], + "initSkillTrigger": null, + "phaseSkillTrigger": [ + "che_방어력증가5p" + ], + "iActionList": null + }, + { + "id": 91102, + "armType": 1, + "name": "극병", + "attack": 250, + "defence": 150, + "speed": 7, + "avoid": 0, + "magicCoef": 0, + "cost": 18, + "rice": 18, + "requirements": [ + { + "type": "ReqTech", + "tech": 5000 + }, + { + "type": "ReqCitiesWithCityLevel", + "level": 8, + "cities": [ + "저" + ] + }, + { + "type": "ReqNationAux", + "key": "can_극병사용", + "op": "==", + "value": 1 + } + ], + "attackCoef": { + "2": 1.2, + "3": 0.8, + "5": 1.2 + }, + "defenceCoef": { + "2": 0.8, + "3": 1.2, + "5": 0.8 + }, + "info": [ + "긴 극을 사용합니다." + ], + "initSkillTrigger": null, + "phaseSkillTrigger": [ + "che_방어력증가5p" + ], + "iActionList": null + }, + { + "id": 1200, + "armType": 2, + "name": "궁병", + "attack": 100, + "defence": 100, + "speed": 7, + "avoid": 10, + "magicCoef": 0, + "cost": 10, + "rice": 10, + "requirements": [], + "attackCoef": { + "3": 1.2, + "1": 0.8, + "5": 1.2 + }, + "defenceCoef": { + "3": 0.8, + "1": 1.2, + "5": 0.8 + }, + "info": [ + "표준적인 궁병입니다.", + "궁병은 선제사격을 하는 병종입니다." + ], + "initSkillTrigger": null, + "phaseSkillTrigger": [ + "che_선제사격시도", + "che_선제사격발동" + ], + "iActionList": null + }, + { + "id": 1201, + "armType": 2, + "name": "궁기병", + "attack": 100, + "defence": 100, + "speed": 8, + "avoid": 20, + "magicCoef": 0, + "cost": 11, + "rice": 12, + "requirements": [ + { + "type": "ReqTech", + "tech": 1000 + }, + { + "type": "ReqRegions", + "regions": [ + "동이" + ] + } + ], + "attackCoef": { + "3": 1.2, + "1": 0.9, + "5": 1.2 + }, + "defenceCoef": { + "3": 0.8, + "1": 1.1, + "5": 0.8 + }, + "info": [ + "말을 타고 잘 피합니다. 특히 다른 궁병보다 보병에게 조금 더 강합니다." + ], + "initSkillTrigger": null, + "phaseSkillTrigger": [ + "che_선제사격시도", + "che_선제사격발동" + ], + "iActionList": null + }, + { + "id": 1202, + "armType": 2, + "name": "연노병", + "attack": 150, + "defence": 100, + "speed": 8, + "avoid": 10, + "magicCoef": 0, + "cost": 12, + "rice": 11, + "requirements": [ + { + "type": "ReqTech", + "tech": 1000 + }, + { + "type": "ReqRegions", + "regions": [ + "서촉" + ] + } + ], + "attackCoef": { + "3": 1.2, + "1": 0.8, + "5": 1.2 + }, + "defenceCoef": { + "3": 0.8, + "1": 1.2, + "5": 0.8 + }, + "info": [ + "화살을 연사합니다." + ], + "initSkillTrigger": null, + "phaseSkillTrigger": [ + "che_선제사격시도", + "che_선제사격발동" + ], + "iActionList": null + }, + { + "id": 1203, + "armType": 2, + "name": "강궁병", + "attack": 150, + "defence": 150, + "speed": 7, + "avoid": 10, + "magicCoef": 0, + "cost": 13, + "rice": 13, + "requirements": [ + { + "type": "ReqTech", + "tech": 3000 + }, + { + "type": "ReqCities", + "cities": [ + "양양" + ] + } + ], + "attackCoef": { + "3": 1.2, + "1": 0.8, + "5": 1.2 + }, + "defenceCoef": { + "3": 0.8, + "1": 1.2, + "5": 0.8 + }, + "info": [ + "강건한 궁병입니다." + ], + "initSkillTrigger": null, + "phaseSkillTrigger": [ + "che_선제사격시도", + "che_선제사격발동" + ], + "iActionList": null + }, + { + "id": 1204, + "armType": 2, + "name": "석궁병", + "attack": 200, + "defence": 100, + "speed": 7, + "avoid": 10, + "magicCoef": 0, + "cost": 13, + "rice": 13, + "requirements": [ + { + "type": "ReqTech", + "tech": 3000 + }, + { + "type": "ReqCities", + "cities": [ + "건업" + ] + } + ], + "attackCoef": { + "3": 1.2, + "1": 0.8, + "5": 1.2 + }, + "defenceCoef": { + "3": 0.8, + "1": 1.2, + "5": 0.8 + }, + "info": [ + "강력한 화살을 쏩니다." + ], + "initSkillTrigger": null, + "phaseSkillTrigger": [ + "che_선제사격시도", + "che_선제사격발동" + ], + "iActionList": null + }, + { + "id": 91200, + "armType": 2, + "name": "화랑", + "attack": 150, + "defence": 150, + "speed": 8, + "avoid": 25, + "magicCoef": 0, + "cost": 14, + "rice": 14, + "requirements": [ + { + "type": "ReqTech", + "tech": 4000 + }, + { + "type": "ReqCitiesWithCityLevel", + "level": 8, + "cities": [ + "위례" + ] + } + ], + "attackCoef": { + "3": 1.2, + "1": 0.8, + "5": 1.2 + }, + "defenceCoef": { + "3": 0.8, + "1": 1.2, + "5": 0.8 + }, + "info": [ + "궁술 실력이 뛰어납니다." + ], + "initSkillTrigger": null, + "phaseSkillTrigger": [ + "che_선제사격시도", + "che_선제사격발동" + ], + "iActionList": null + }, + { + "id": 91201, + "armType": 2, + "name": "화시병", + "attack": 225, + "defence": 100, + "speed": 7, + "avoid": 10, + "magicCoef": 0, + "cost": 14, + "rice": 14, + "requirements": [ + { + "type": "ReqTech", + "tech": 4000 + }, + { + "type": "ReqCitiesWithCityLevel", + "level": 8, + "cities": [ + "장사" + ] + }, + { + "type": "ReqNationAux", + "key": "can_화시병사용", + "op": "==", + "value": 1 + } + ], + "attackCoef": { + "3": 1.2, + "1": 0.8, + "5": 1.2 + }, + "defenceCoef": { + "3": 0.8, + "1": 1.2, + "5": 0.8 + }, + "info": [ + "불이 붙은 화살을 날립니다." + ], + "initSkillTrigger": null, + "phaseSkillTrigger": [ + "che_선제사격시도", + "che_선제사격발동" + ], + "iActionList": null + }, + { + "id": 91202, + "armType": 2, + "name": "원융노병", + "attack": 250, + "defence": 100, + "speed": 7, + "avoid": 10, + "magicCoef": 0, + "cost": 20, + "rice": 19, + "requirements": [ + { + "type": "ReqTech", + "tech": 5000 + }, + { + "type": "ReqCitiesWithCityLevel", + "level": 8, + "cities": [ + "흉노" + ] + }, + { + "type": "ReqNationAux", + "key": "can_원융노병사용", + "op": "==", + "value": 1 + } + ], + "attackCoef": { + "3": 1.2, + "1": 0.8, + "5": 1.2 + }, + "defenceCoef": { + "3": 0.8, + "1": 1.2, + "5": 0.8 + }, + "info": [ + "먼 거리에서 적을 제압합니다." + ], + "initSkillTrigger": null, + "phaseSkillTrigger": [ + "che_선제사격시도", + "che_선제사격발동" + ], + "iActionList": null + }, + { + "id": 1300, + "armType": 3, + "name": "기병", + "attack": 150, + "defence": 100, + "speed": 7, + "avoid": 5, + "magicCoef": 0, + "cost": 11, + "rice": 11, + "requirements": [], + "attackCoef": { + "1": 1.2, + "2": 0.8, + "5": 1.2 + }, + "defenceCoef": { + "1": 0.8, + "2": 1.2, + "5": 0.8 + }, + "info": [ + "표준적인 기병입니다.", + "기병은 공격특화입니다." + ], + "initSkillTrigger": null, + "phaseSkillTrigger": [ + "che_기병병종전투" + ], + "iActionList": null + }, + { + "id": 1301, + "armType": 3, + "name": "백마병", + "attack": 200, + "defence": 100, + "speed": 7, + "avoid": 5, + "magicCoef": 0, + "cost": 12, + "rice": 13, + "requirements": [ + { + "type": "ReqTech", + "tech": 1000 + }, + { + "type": "ReqRegions", + "regions": [ + "하북" + ] + } + ], + "attackCoef": { + "1": 1.2, + "2": 0.8, + "5": 1.2 + }, + "defenceCoef": { + "1": 0.8, + "2": 1.2, + "5": 0.8 + }, + "info": [ + "백마의 위용을 보여줍니다." + ], + "initSkillTrigger": null, + "phaseSkillTrigger": [ + "che_기병병종전투" + ], + "iActionList": null + }, + { + "id": 1302, + "armType": 3, + "name": "중장기병", + "attack": 150, + "defence": 150, + "speed": 7, + "avoid": 5, + "magicCoef": 0, + "cost": 13, + "rice": 12, + "requirements": [ + { + "type": "ReqTech", + "tech": 1000 + }, + { + "type": "ReqRegions", + "regions": [ + "서북" + ] + } + ], + "attackCoef": { + "1": 1.2, + "2": 0.8, + "5": 1.2 + }, + "defenceCoef": { + "1": 0.8, + "2": 1.2, + "5": 0.8 + }, + "info": [ + "갑주를 두른 기병입니다." + ], + "initSkillTrigger": null, + "phaseSkillTrigger": [ + "che_기병병종전투" + ], + "iActionList": null + }, + { + "id": 1303, + "armType": 3, + "name": "돌격기병", + "attack": 200, + "defence": 100, + "speed": 8, + "avoid": 5, + "magicCoef": 0, + "cost": 13, + "rice": 11, + "requirements": [ + { + "type": "ReqTech", + "tech": 2000 + }, + { + "type": "ReqCities", + "cities": [ + "흉노" + ] + } + ], + "attackCoef": { + "1": 1.2, + "2": 0.8, + "5": 1.2 + }, + "defenceCoef": { + "1": 0.8, + "2": 1.2, + "5": 0.8 + }, + "info": [ + "저돌적으로 공격합니다." + ], + "initSkillTrigger": null, + "phaseSkillTrigger": [ + "che_기병병종전투" + ], + "iActionList": null + }, + { + "id": 1304, + "armType": 3, + "name": "철기병", + "attack": 100, + "defence": 250, + "speed": 7, + "avoid": 5, + "magicCoef": 0, + "cost": 11, + "rice": 13, + "requirements": [ + { + "type": "ReqTech", + "tech": 2000 + }, + { + "type": "ReqCities", + "cities": [ + "강" + ] + } + ], + "attackCoef": { + "1": 1.2, + "2": 0.8, + "5": 1.2 + }, + "defenceCoef": { + "1": 0.8, + "2": 1.2, + "5": 0.8 + }, + "info": [ + "철갑을 두른 기병입니다." + ], + "initSkillTrigger": null, + "phaseSkillTrigger": [ + "che_기병병종전투" + ], + "iActionList": null + }, + { + "id": 1305, + "armType": 3, + "name": "수렵기병", + "attack": 150, + "defence": 100, + "speed": 8, + "avoid": 15, + "magicCoef": 0, + "cost": 12, + "rice": 12, + "requirements": [ + { + "type": "ReqTech", + "tech": 2000 + }, + { + "type": "ReqCities", + "cities": [ + "산월" + ] + } + ], + "attackCoef": { + "1": 1.2, + "2": 0.8, + "5": 1.2 + }, + "defenceCoef": { + "1": 0.8, + "2": 1.2, + "5": 0.8 + }, + "info": [ + "날쎄고 빠른 기병입니다." + ], + "initSkillTrigger": null, + "phaseSkillTrigger": [ + "che_기병병종전투" + ], + "iActionList": null + }, + { + "id": 1306, + "armType": 3, + "name": "맹수병", + "attack": 250, + "defence": 175, + "speed": 6, + "avoid": 0, + "magicCoef": 0, + "cost": 16, + "rice": 16, + "requirements": [ + { + "type": "ReqTech", + "tech": 2000 + }, + { + "type": "ReqCities", + "cities": [ + "남만" + ] + } + ], + "attackCoef": { + "1": 1.2, + "2": 0.8, + "5": 1.2 + }, + "defenceCoef": { + "1": 0.8, + "2": 1.2, + "5": 0.8 + }, + "info": [ + "어느 누구보다 강력합니다." + ], + "initSkillTrigger": null, + "phaseSkillTrigger": [ + "che_기병병종전투" + ], + "iActionList": null + }, + { + "id": 1307, + "armType": 3, + "name": "호표기병", + "attack": 200, + "defence": 150, + "speed": 7, + "avoid": 5, + "magicCoef": 0, + "cost": 14, + "rice": 14, + "requirements": [ + { + "type": "ReqTech", + "tech": 3000 + }, + { + "type": "ReqCities", + "cities": [ + "허창" + ] + } + ], + "attackCoef": { + "1": 1.2, + "2": 0.8, + "5": 1.2 + }, + "defenceCoef": { + "1": 0.8, + "2": 1.2, + "5": 0.8 + }, + "info": [ + "정예 기병입니다." + ], + "initSkillTrigger": null, + "phaseSkillTrigger": [ + "che_기병병종전투" + ], + "iActionList": null + }, + { + "id": 91300, + "armType": 3, + "name": "양마기병", + "attack": 200, + "defence": 175, + "speed": 7, + "avoid": 5, + "magicCoef": 0, + "cost": 15, + "rice": 15, + "requirements": [ + { + "type": "ReqTech", + "tech": 4000 + }, + { + "type": "ReqCitiesWithCityLevel", + "level": 8, + "cities": [ + "한중" + ] + } + ], + "attackCoef": { + "1": 1.1, + "2": 0.9, + "5": 1.1 + }, + "defenceCoef": { + "1": 0.9, + "2": 1.1, + "5": 0.9 + }, + "info": [ + "험준한 지형에서 뛰어납니다.", + "불리한 싸움도 버텨냅니다." + ], + "initSkillTrigger": null, + "phaseSkillTrigger": [ + "che_기병병종전투" + ], + "iActionList": null + }, + { + "id": 91301, + "armType": 3, + "name": "산저병", + "attack": 225, + "defence": 150, + "speed": 7, + "avoid": 5, + "magicCoef": 0, + "cost": 15, + "rice": 15, + "requirements": [ + { + "type": "ReqTech", + "tech": 4000 + }, + { + "type": "ReqCitiesWithCityLevel", + "level": 8, + "cities": [ + "수춘" + ] + }, + { + "type": "ReqNationAux", + "key": "can_산저병사용", + "op": "==", + "value": 1 + } + ], + "attackCoef": { + "1": 1.2, + "2": 0.8, + "5": 1.2 + }, + "defenceCoef": { + "1": 0.8, + "2": 1.2, + "5": 0.8 + }, + "info": [ + "무식할 정도로 전장을 누빕니다." + ], + "initSkillTrigger": null, + "phaseSkillTrigger": [ + "che_기병병종전투" + ], + "iActionList": null + }, + { + "id": 91302, + "armType": 3, + "name": "상병", + "attack": 225, + "defence": 250, + "speed": 5, + "avoid": 0, + "magicCoef": 0, + "cost": 24, + "rice": 24, + "requirements": [ + { + "type": "ReqTech", + "tech": 5000 + }, + { + "type": "ReqCitiesWithCityLevel", + "level": 8, + "cities": [ + "남만" + ] + }, + { + "type": "ReqNationAux", + "key": "can_상병사용", + "op": "==", + "value": 1 + } + ], + "attackCoef": { + "1": 1.2, + "2": 0.8, + "5": 1.2 + }, + "defenceCoef": { + "1": 0.8, + "2": 1.2, + "5": 0.8 + }, + "info": [ + "거대한 코끼리와 함께합니다." + ], + "initSkillTrigger": null, + "phaseSkillTrigger": [ + "che_기병병종전투" + ], + "iActionList": null + }, + { + "id": 1400, + "armType": 4, + "name": "귀병", + "attack": 80, + "defence": 80, + "speed": 7, + "avoid": 5, + "magicCoef": 0.5, + "cost": 9, + "rice": 9, + "requirements": [], + "attackCoef": { + "5": 1.2 + }, + "defenceCoef": { + "5": 0.8 + }, + "info": [ + "계략을 사용하는 병종입니다." + ], + "initSkillTrigger": null, + "phaseSkillTrigger": null, + "iActionList": null + }, + { + "id": 1401, + "armType": 4, + "name": "신귀병", + "attack": 80, + "defence": 80, + "speed": 7, + "avoid": 20, + "magicCoef": 0.6, + "cost": 10, + "rice": 10, + "requirements": [ + { + "type": "ReqTech", + "tech": 1000 + }, + { + "type": "ReqRegions", + "regions": [ + "초" + ] + } + ], + "attackCoef": { + "5": 1.2 + }, + "defenceCoef": { + "5": 0.8 + }, + "info": [ + "신출귀몰한 귀병입니다." + ], + "initSkillTrigger": null, + "phaseSkillTrigger": null, + "iActionList": null + }, + { + "id": 1402, + "armType": 4, + "name": "백귀병", + "attack": 80, + "defence": 130, + "speed": 7, + "avoid": 5, + "magicCoef": 0.6, + "cost": 9, + "rice": 11, + "requirements": [ + { + "type": "ReqTech", + "tech": 2000 + }, + { + "type": "ReqCities", + "cities": [ + "오환" + ] + } + ], + "attackCoef": { + "5": 1.2 + }, + "defenceCoef": { + "5": 0.8 + }, + "info": [ + "저렴하고 튼튼합니다." + ], + "initSkillTrigger": null, + "phaseSkillTrigger": null, + "iActionList": null + }, + { + "id": 1403, + "armType": 4, + "name": "흑귀병", + "attack": 130, + "defence": 80, + "speed": 7, + "avoid": 5, + "magicCoef": 0.6, + "cost": 11, + "rice": 9, + "requirements": [ + { + "type": "ReqTech", + "tech": 2000 + }, + { + "type": "ReqCities", + "cities": [ + "왜" + ] + } + ], + "attackCoef": { + "5": 1.2 + }, + "defenceCoef": { + "5": 0.8 + }, + "info": [ + "저렴하고 강력합니다." + ], + "initSkillTrigger": null, + "phaseSkillTrigger": null, + "iActionList": null + }, + { + "id": 1404, + "armType": 4, + "name": "악귀병", + "attack": 130, + "defence": 130, + "speed": 7, + "avoid": 0, + "magicCoef": 0.6, + "cost": 12, + "rice": 12, + "requirements": [ + { + "type": "ReqTech", + "tech": 3000 + }, + { + "type": "ReqCities", + "cities": [ + "장안" + ] + } + ], + "attackCoef": { + "5": 1.2 + }, + "defenceCoef": { + "5": 0.8 + }, + "info": [ + "백병전에도 능숙합니다." + ], + "initSkillTrigger": null, + "phaseSkillTrigger": null, + "iActionList": null + }, + { + "id": 1405, + "armType": 4, + "name": "남귀병", + "attack": 60, + "defence": 60, + "speed": 7, + "avoid": 10, + "magicCoef": 0.8, + "cost": 8, + "rice": 8, + "requirements": [ + { + "type": "ReqTech", + "tech": 1000 + } + ], + "attackCoef": { + "5": 1.2 + }, + "defenceCoef": { + "5": 0.8 + }, + "info": [ + "전투를 포기하고 계략에 몰두합니다." + ], + "initSkillTrigger": null, + "phaseSkillTrigger": null, + "iActionList": null + }, + { + "id": 1406, + "armType": 4, + "name": "황귀병", + "attack": 110, + "defence": 110, + "speed": 7, + "avoid": 0, + "magicCoef": 0.8, + "cost": 13, + "rice": 10, + "requirements": [ + { + "type": "ReqTech", + "tech": 3000 + }, + { + "type": "ReqCities", + "cities": [ + "낙양" + ] + } + ], + "attackCoef": { + "5": 1.2 + }, + "defenceCoef": { + "5": 0.8 + }, + "info": [ + "고도로 훈련된 귀병입니다." + ], + "initSkillTrigger": null, + "phaseSkillTrigger": null, + "iActionList": null + }, + { + "id": 1407, + "armType": 4, + "name": "천귀병", + "attack": 80, + "defence": 130, + "speed": 7, + "avoid": 15, + "magicCoef": 0.6, + "cost": 11, + "rice": 12, + "requirements": [ + { + "type": "ReqTech", + "tech": 3000 + }, + { + "type": "ReqCities", + "cities": [ + "성도" + ] + } + ], + "attackCoef": { + "5": 1.2 + }, + "defenceCoef": { + "5": 0.8 + }, + "info": [ + "갑주를 두른 귀병입니다." + ], + "initSkillTrigger": null, + "phaseSkillTrigger": null, + "iActionList": null + }, + { + "id": 1408, + "armType": 4, + "name": "마귀병", + "attack": 130, + "defence": 80, + "speed": 7, + "avoid": 15, + "magicCoef": 0.6, + "cost": 12, + "rice": 11, + "requirements": [ + { + "type": "ReqTech", + "tech": 3000 + }, + { + "type": "ReqCities", + "cities": [ + "업" + ] + } + ], + "attackCoef": { + "5": 1.2 + }, + "defenceCoef": { + "5": 0.8 + }, + "info": [ + "날카로운 무기를 가진 귀병입니다." + ], + "initSkillTrigger": null, + "phaseSkillTrigger": null, + "iActionList": null + }, + { + "id": 91400, + "armType": 4, + "name": "음귀병", + "attack": 110, + "defence": 110, + "speed": 7, + "avoid": 15, + "magicCoef": 0.7, + "cost": 13, + "rice": 11, + "requirements": [ + { + "type": "ReqTech", + "tech": 4000 + }, + { + "type": "ReqCitiesWithCityLevel", + "level": 8, + "cities": [ + "강릉" + ] + }, + { + "type": "ReqNationAux", + "key": "can_음귀병사용", + "op": "==", + "value": 1 + } + ], + "attackCoef": { + "5": 1.2 + }, + "defenceCoef": { + "5": 0.8 + }, + "info": [ + "악기를 연주하여 적을 혼란시킵니다." + ], + "initSkillTrigger": null, + "phaseSkillTrigger": null, + "iActionList": null + }, + { + "id": 91401, + "armType": 4, + "name": "향귀병", + "attack": 100, + "defence": 120, + "speed": 8, + "avoid": 5, + "magicCoef": 0.6, + "cost": 12, + "rice": 12, + "requirements": [ + { + "type": "ReqTech", + "tech": 4000 + }, + { + "type": "ReqHighLevelCities", + "level": 8, + "count": 4 + }, + { + "type": "ReqNotChief" + } + ], + "attackCoef": { + "5": 1.2 + }, + "defenceCoef": { + "5": 0.8 + }, + "info": [ + "독특한 향을 피웁니다." + ], + "initSkillTrigger": null, + "phaseSkillTrigger": null, + "iActionList": null + }, + { + "id": 91402, + "armType": 4, + "name": "무희", + "attack": 180, + "defence": 80, + "speed": 7, + "avoid": 10, + "magicCoef": 0.6, + "cost": 18, + "rice": 17, + "requirements": [ + { + "type": "ReqTech", + "tech": 5000 + }, + { + "type": "ReqCitiesWithCityLevel", + "level": 8, + "cities": [ + "왜" + ] + }, + { + "type": "ReqNationAux", + "key": "can_무희사용", + "op": "==", + "value": 1 + } + ], + "attackCoef": { + "5": 1.2 + }, + "defenceCoef": { + "5": 0.8 + }, + "info": [ + "검무를 추는 귀병입니다." + ], + "initSkillTrigger": null, + "phaseSkillTrigger": null, + "iActionList": null + }, + { + "id": 1500, + "armType": 5, + "name": "정란", + "attack": 100, + "defence": 100, + "speed": 6, + "avoid": 0, + "magicCoef": 0, + "cost": 14, + "rice": 5, + "requirements": [ + { + "type": "ReqMinRelYear", + "year": 3 + } + ], + "attackCoef": { + "1": 1.25, + "2": 1.25, + "3": 1.25, + "4": 1.25, + "0": 1.8, + "1106": 1.112, + "91300": 1.112 + }, + "defenceCoef": { + "1": 1.2, + "2": 1.2, + "3": 1.2, + "4": 1.2, + "1106": 1.067, + "91300": 1.112 + }, + "info": [ + "높은 구조물 위에서 공격합니다. 첫 공격은 성벽을 향합니다." + ], + "initSkillTrigger": [ + "che_성벽부상무효" + ], + "phaseSkillTrigger": [ + "che_선제사격시도", + "che_선제사격발동" + ], + "iActionList": [ + "che_성벽선제" + ] + }, + { + "id": 1501, + "armType": 5, + "name": "충차", + "attack": 150, + "defence": 100, + "speed": 6, + "avoid": 0, + "magicCoef": 0, + "cost": 18, + "rice": 5, + "requirements": [ + { + "type": "ReqTech", + "tech": 1000 + }, + { + "type": "ReqMinRelYear", + "year": 3 + } + ], + "attackCoef": { + "1": 0.8, + "2": 0.8, + "3": 0.8, + "4": 0.8, + "0": 2.4, + "1106": 1.112, + "91300": 1.112 + }, + "defenceCoef": { + "1": 1.2, + "2": 1.2, + "3": 1.2, + "4": 1.2, + "1106": 1.067, + "91300": 1.067 + }, + "info": [ + "엄청난 위력으로 성벽을 부수어버립니다." + ], + "initSkillTrigger": [ + "che_성벽부상무효" + ], + "phaseSkillTrigger": null, + "iActionList": null + }, + { + "id": 1502, + "armType": 5, + "name": "벽력거", + "attack": 150, + "defence": 100, + "speed": 6, + "avoid": 5, + "magicCoef": 0, + "cost": 20, + "rice": 5, + "requirements": [ + { + "type": "ReqTech", + "tech": 3000 + }, + { + "type": "ReqCities", + "cities": [ + "업" + ] + } + ], + "attackCoef": { + "1": 1.25, + "2": 1.25, + "3": 1.25, + "4": 1.25, + "0": 1.8, + "1106": 1.112, + "91300": 1.112 + }, + "defenceCoef": { + "1": 1.2, + "2": 1.2, + "3": 1.2, + "4": 1.2, + "1106": 1.067, + "91300": 1.112 + }, + "info": [ + "상대에게 돌덩이를 날립니다. 첫 공격은 성벽을 향합니다." + ], + "initSkillTrigger": [ + "che_성벽부상무효" + ], + "phaseSkillTrigger": [ + "che_선제사격시도", + "che_선제사격발동" + ], + "iActionList": [ + "che_성벽선제" + ] + }, + { + "id": 1503, + "armType": 5, + "name": "목우", + "attack": 50, + "defence": 200, + "speed": 5, + "avoid": 0, + "magicCoef": 0, + "cost": 15, + "rice": 5, + "requirements": [ + { + "type": "ReqTech", + "tech": 3000 + }, + { + "type": "ReqCities", + "cities": [ + "성도" + ] + } + ], + "attackCoef": { + "1": 1, + "2": 1, + "3": 1, + "4": 1, + "0": 1.8 + }, + "defenceCoef": { + "1": 1, + "2": 1, + "3": 1, + "4": 1 + }, + "info": [ + "상대를 저지하는 특수병기입니다." + ], + "initSkillTrigger": [ + "che_성벽부상무효" + ], + "phaseSkillTrigger": [ + "che_저지시도", + "che_저지발동" + ], + "iActionList": null + }, + { + "id": 91500, + "armType": 5, + "name": "화륜차", + "attack": 300, + "defence": 0, + "speed": 5, + "avoid": 0, + "magicCoef": 0, + "cost": 40, + "rice": 5, + "requirements": [ + { + "type": "ReqTech", + "tech": 5000 + }, + { + "type": "ReqNationAux", + "key": "did_특성초토화", + "op": ">=", + "value": 1 + }, + { + "type": "ReqChief" + }, + { + "type": "ReqNationAux", + "key": "can_화륜차사용", + "op": "==", + "value": 1 + } + ], + "attackCoef": { + "1": 1.25, + "2": 1.25, + "3": 1.25, + "4": 1.25, + "0": 1.25, + "1106": 1.112, + "91300": 1.112 + }, + "defenceCoef": { + "1": 1.2, + "2": 1.2, + "3": 1.2, + "4": 1.2, + "1106": 1.067, + "91300": 1.067 + }, + "info": [ + "불타는 바퀴로 적진을 붕괴시킵니다." + ], + "initSkillTrigger": [ + "che_성벽부상무효" + ], + "phaseSkillTrigger": null, + "iActionList": null + } + ] +} diff --git a/app/game-engine/resources/unitset/unitset_ludo_rathowm.json b/app/game-engine/resources/unitset/unitset_ludo_rathowm.json new file mode 100644 index 0000000..af66f62 --- /dev/null +++ b/app/game-engine/resources/unitset/unitset_ludo_rathowm.json @@ -0,0 +1,1843 @@ +{ + "id": "ludo_rathowm", + "name": "ludo_rathowm", + "defaultCrewTypeId": 1100, + "armTypes": { + "1": "보병", + "2": "궁병", + "3": "기병", + "4": "귀병", + "5": "차병" + }, + "crewTypes": [ + { + "id": 1000, + "armType": 0, + "name": "성벽", + "attack": 100, + "defence": 100, + "speed": 7, + "avoid": 0, + "magicCoef": 0, + "cost": 99, + "rice": 9, + "requirements": [ + { + "type": "Impossible" + } + ], + "attackCoef": [], + "defenceCoef": { + "1": 1.2 + }, + "info": [ + "성벽입니다.", + "생성할 수 없습니다." + ], + "initSkillTrigger": null, + "phaseSkillTrigger": null, + "iActionList": null + }, + { + "id": 217100, + "armType": 1, + "name": "보병", + "attack": 100, + "defence": 150, + "speed": 7, + "avoid": 10, + "magicCoef": 0, + "cost": 9, + "rice": 9, + "requirements": [], + "attackCoef": { + "2": 1.2, + "3": 0.8, + "5": 1.2, + "217502": 1 + }, + "defenceCoef": { + "2": 0.8, + "3": 1.2, + "5": 0.8, + "217502": 1 + }, + "info": [ + "표준적인 보병입니다. 보병은 방어특화입니다." + ], + "initSkillTrigger": null, + "phaseSkillTrigger": [ + "che_방어력증가5p" + ], + "iActionList": null + }, + { + "id": 217101, + "armType": 1, + "name": "마물병", + "attack": 110, + "defence": 160, + "speed": 7, + "avoid": 10, + "magicCoef": 0, + "cost": 9, + "rice": 10, + "requirements": [ + { + "type": "ReqRegions", + "regions": [ + "호넷 마인령", + "케이브리스 마인령" + ] + } + ], + "attackCoef": { + "2": 1.2, + "3": 0.8, + "5": 1.2, + "217502": 1 + }, + "defenceCoef": { + "2": 0.8, + "3": 1.2, + "5": 0.8, + "217502": 1 + }, + "info": [ + "마군 지역 기본병종입니다. 조금더 강하지만 쌀을 많이 소비합니다." + ], + "initSkillTrigger": null, + "phaseSkillTrigger": [ + "che_방어력증가5p" + ], + "iActionList": null + }, + { + "id": 217102, + "armType": 1, + "name": "중장보병", + "attack": 100, + "defence": 250, + "speed": 7, + "avoid": 5, + "magicCoef": 0, + "cost": 13, + "rice": 10, + "requirements": [ + { + "type": "ReqTech", + "tech": 1000 + }, + { + "type": "ReqRegions", + "regions": [ + "헬만 동부" + ] + } + ], + "attackCoef": { + "2": 1.2, + "3": 0.8, + "5": 1.2, + "217502": 1 + }, + "defenceCoef": { + "2": 0.8, + "3": 1.2, + "5": 0.8, + "217502": 1 + }, + "info": [ + "헬만 특유의 견고한 보병입니다." + ], + "initSkillTrigger": null, + "phaseSkillTrigger": [ + "che_방어력증가5p" + ], + "iActionList": null + }, + { + "id": 217103, + "armType": 1, + "name": "흑의 군 보병", + "attack": 150, + "defence": 150, + "speed": 7, + "avoid": 10, + "magicCoef": 0, + "cost": 12, + "rice": 11, + "requirements": [ + { + "type": "ReqTech", + "tech": 1000 + }, + { + "type": "ReqRegions", + "regions": [ + "리자스 남부", + "리자스 북부" + ] + } + ], + "attackCoef": { + "2": 1.2, + "3": 0.8, + "5": 1.2, + "217502": 1 + }, + "defenceCoef": { + "2": 0.8, + "3": 1.2, + "5": 0.8, + "217502": 1 + }, + "info": [ + "흑의 군 전통의 체계적인 훈련으로 공격력을 보완했습니다." + ], + "initSkillTrigger": null, + "phaseSkillTrigger": [ + "che_방어력증가5p" + ], + "iActionList": null + }, + { + "id": 217104, + "armType": 1, + "name": "용병", + "attack": 125, + "defence": 175, + "speed": 7, + "avoid": 10, + "magicCoef": 0, + "cost": 12, + "rice": 11, + "requirements": [ + { + "type": "ReqTech", + "tech": 1000 + }, + { + "type": "ReqRegions", + "regions": [ + "자유도시 동부" + ] + } + ], + "attackCoef": { + "2": 1.2, + "3": 0.8, + "5": 1.2, + "217502": 1 + }, + "defenceCoef": { + "2": 0.8, + "3": 1.2, + "5": 0.8, + "217502": 1 + }, + "info": [ + "일반 보병보다 비싸지만 받은 만큼은 일해줍니다." + ], + "initSkillTrigger": null, + "phaseSkillTrigger": [ + "che_방어력증가5p" + ], + "iActionList": null + }, + { + "id": 217105, + "armType": 1, + "name": "사메라이", + "attack": 175, + "defence": 150, + "speed": 7, + "avoid": 0, + "magicCoef": 0, + "cost": 11, + "rice": 10, + "requirements": [ + { + "type": "ReqTech", + "tech": 1000 + }, + { + "type": "ReqRegions", + "regions": [ + "제스 남부" + ] + } + ], + "attackCoef": { + "2": 1.2, + "3": 0.8, + "5": 1.2, + "217502": 1 + }, + "defenceCoef": { + "2": 0.8, + "3": 1.2, + "5": 0.8, + "217502": 1 + }, + "info": [ + "검으로 난무를 가하는 몬스터 보병입니다." + ], + "initSkillTrigger": null, + "phaseSkillTrigger": [ + "che_방어력증가5p" + ], + "iActionList": null + }, + { + "id": 217106, + "armType": 1, + "name": "템플나이트병", + "attack": 75, + "defence": 275, + "speed": 7, + "avoid": 0, + "magicCoef": 0, + "cost": 11, + "rice": 12, + "requirements": [ + { + "type": "ReqTech", + "tech": 1000 + }, + { + "type": "ReqRegions", + "regions": [ + "AL교" + ] + } + ], + "attackCoef": { + "2": 1.2, + "3": 0.8, + "5": 1.2, + "217502": 1 + }, + "defenceCoef": { + "2": 0.8, + "3": 1.2, + "5": 0.8, + "217502": 1 + }, + "info": [ + "공격을 포기하고 오직 방어에만 집중합니다." + ], + "initSkillTrigger": null, + "phaseSkillTrigger": [ + "che_방어력증가5p" + ], + "iActionList": null + }, + { + "id": 217107, + "armType": 1, + "name": "메이드병", + "attack": 150, + "defence": 150, + "speed": 7, + "avoid": 20, + "magicCoef": 0, + "cost": 13, + "rice": 11, + "requirements": [ + { + "type": "ReqTech", + "tech": 2000 + }, + { + "type": "ReqCities", + "cities": [ + "메이드의 묘지" + ] + } + ], + "attackCoef": { + "2": 1.2, + "3": 0.8, + "5": 1.2, + "217502": 1 + }, + "defenceCoef": { + "2": 0.8, + "3": 1.2, + "5": 0.8, + "217502": 1 + }, + "info": [ + "켓셀링크 휘하의 날렵한 전투메이드입니다." + ], + "initSkillTrigger": null, + "phaseSkillTrigger": [ + "che_방어력증가5p" + ], + "iActionList": null + }, + { + "id": 217108, + "armType": 1, + "name": "요괴병", + "attack": 150, + "defence": 150, + "speed": 8, + "avoid": 0, + "magicCoef": 0, + "cost": 11, + "rice": 13, + "requirements": [ + { + "type": "ReqTech", + "tech": 2000 + }, + { + "type": "ReqCities", + "cities": [ + "오슈" + ] + } + ], + "attackCoef": { + "2": 1.2, + "3": 0.8, + "5": 1.2, + "217502": 1 + }, + "defenceCoef": { + "2": 0.8, + "3": 1.2, + "5": 0.8, + "217502": 1 + }, + "info": [ + "단단한 육체를 믿고 적진을 돌파합니다." + ], + "initSkillTrigger": null, + "phaseSkillTrigger": [ + "che_방어력증가5p" + ], + "iActionList": null + }, + { + "id": 217109, + "armType": 1, + "name": "리자스 친위병", + "attack": 150, + "defence": 200, + "speed": 7, + "avoid": 10, + "magicCoef": 0, + "cost": 12, + "rice": 12, + "requirements": [ + { + "type": "ReqTech", + "tech": 3000 + }, + { + "type": "ReqCities", + "cities": [ + "리자스성" + ] + } + ], + "attackCoef": { + "2": 1.2, + "3": 0.8, + "5": 1.2, + "217502": 1 + }, + "defenceCoef": { + "2": 0.8, + "3": 1.2, + "5": 0.8, + "217502": 1 + }, + "info": [ + "여왕을 수호하는 리자스 최강의 보병 정예보병입니다." + ], + "initSkillTrigger": null, + "phaseSkillTrigger": [ + "che_방어력증가5p" + ], + "iActionList": null + }, + { + "id": 217110, + "armType": 1, + "name": "케이브리스 마물병", + "attack": 200, + "defence": 150, + "speed": 7, + "avoid": 5, + "magicCoef": 0, + "cost": 13, + "rice": 14, + "requirements": [ + { + "type": "ReqTech", + "tech": 3000 + }, + { + "type": "ReqCities", + "cities": [ + "케이브리스의 성" + ] + } + ], + "attackCoef": { + "2": 1.2, + "3": 0.8, + "5": 1.2, + "217502": 1 + }, + "defenceCoef": { + "2": 0.8, + "3": 1.2, + "5": 0.8, + "217502": 1 + }, + "info": [ + "케이브리스 직속의 마물 정예 전투보병입니다." + ], + "initSkillTrigger": null, + "phaseSkillTrigger": [ + "che_방어력증가5p" + ], + "iActionList": null + }, + { + "id": 217111, + "armType": 1, + "name": "투신", + "attack": 200, + "defence": 300, + "speed": 7, + "avoid": 5, + "magicCoef": 0, + "cost": 28, + "rice": 23, + "requirements": [ + { + "type": "ReqTech", + "tech": 5000 + }, + { + "type": "ReqCities", + "cities": [ + "투신도시" + ] + } + ], + "attackCoef": { + "2": 1.2, + "3": 0.8, + "5": 1.2, + "217502": 1 + }, + "defenceCoef": { + "2": 0.8, + "3": 1.2, + "5": 0.8, + "217502": 1 + }, + "info": [ + "성마교단 유적에서 발굴된 사상 최강의 보병입니다." + ], + "initSkillTrigger": null, + "phaseSkillTrigger": [ + "che_방어력증가5p" + ], + "iActionList": null + }, + { + "id": 217200, + "armType": 2, + "name": "궁병", + "attack": 100, + "defence": 100, + "speed": 7, + "avoid": 20, + "magicCoef": 0, + "cost": 10, + "rice": 10, + "requirements": [], + "attackCoef": { + "1": 0.8, + "3": 1.2, + "5": 1.2, + "217502": 1 + }, + "defenceCoef": { + "1": 1.2, + "3": 0.8, + "5": 0.8, + "217502": 1 + }, + "info": [ + "표준적인 궁병입니다. 궁병은 회피특화입니다." + ], + "initSkillTrigger": null, + "phaseSkillTrigger": null, + "iActionList": null + }, + { + "id": 217201, + "armType": 2, + "name": "투척마물병", + "attack": 150, + "defence": 100, + "speed": 7, + "avoid": 10, + "magicCoef": 0, + "cost": 11, + "rice": 12, + "requirements": [ + { + "type": "ReqTech", + "tech": 1000 + }, + { + "type": "ReqRegions", + "regions": [ + "호넷 마인령" + ] + } + ], + "attackCoef": { + "1": 0.8, + "3": 1.2, + "5": 1.2, + "217502": 1 + }, + "defenceCoef": { + "1": 1.2, + "3": 0.8, + "5": 0.8, + "217502": 1 + }, + "info": [ + "날렵함을 포기하고 도끼를 투척합니다." + ], + "initSkillTrigger": null, + "phaseSkillTrigger": null, + "iActionList": null + }, + { + "id": 217202, + "armType": 2, + "name": "백의 군 궁병", + "attack": 100, + "defence": 100, + "speed": 8, + "avoid": 30, + "magicCoef": 0, + "cost": 11, + "rice": 11, + "requirements": [ + { + "type": "ReqTech", + "tech": 1000 + }, + { + "type": "ReqRegions", + "regions": [ + "리자스 남부" + ] + } + ], + "attackCoef": { + "1": 0.8, + "3": 1.2, + "5": 1.2, + "217502": 1 + }, + "defenceCoef": { + "1": 1.2, + "3": 0.8, + "5": 0.8, + "217502": 1 + }, + "info": [ + "전략을 활용하여 치고 빠지기에 능합니다." + ], + "initSkillTrigger": null, + "phaseSkillTrigger": null, + "iActionList": null + }, + { + "id": 217203, + "armType": 2, + "name": "벌레술사병", + "attack": 100, + "defence": 150, + "speed": 7, + "avoid": 20, + "magicCoef": 0, + "cost": 12, + "rice": 12, + "requirements": [ + { + "type": "ReqTech", + "tech": 2000 + }, + { + "type": "ReqCities", + "cities": [ + "호박성" + ] + } + ], + "attackCoef": { + "1": 0.8, + "3": 1.2, + "5": 1.2, + "217502": 1 + }, + "defenceCoef": { + "1": 1.2, + "3": 0.8, + "5": 0.8, + "217502": 1 + }, + "info": [ + "벌레들을 부려 몸을 보호하는 궁병입니다." + ], + "initSkillTrigger": null, + "phaseSkillTrigger": null, + "iActionList": null + }, + { + "id": 217204, + "armType": 2, + "name": "저격암살병", + "attack": 225, + "defence": 75, + "speed": 5, + "avoid": 10, + "magicCoef": 0, + "cost": 14, + "rice": 11, + "requirements": [ + { + "type": "ReqTech", + "tech": 2000 + }, + { + "type": "ReqCities", + "cities": [ + "블라디보스토크" + ] + } + ], + "attackCoef": { + "1": 0.8, + "3": 1.2, + "5": 1.2, + "217502": 1 + }, + "defenceCoef": { + "1": 1.2, + "3": 0.8, + "5": 0.8, + "217502": 1 + }, + "info": [ + "독을 바른 탄환으로 적의 목숨을 앗아갑니다." + ], + "initSkillTrigger": null, + "phaseSkillTrigger": null, + "iActionList": null + }, + { + "id": 217205, + "armType": 2, + "name": "호루스병", + "attack": 150, + "defence": 100, + "speed": 8, + "avoid": 20, + "magicCoef": 0, + "cost": 11, + "rice": 12, + "requirements": [ + { + "type": "ReqTech", + "tech": 2000 + }, + { + "type": "ReqCities", + "cities": [ + "거대전함" + ] + } + ], + "attackCoef": { + "1": 0.8, + "3": 1.2, + "5": 1.2, + "217502": 1 + }, + "defenceCoef": { + "1": 1.2, + "3": 0.8, + "5": 0.8, + "217502": 1 + }, + "info": [ + "민첩하게 파고드는 호루스족 궁병입니다." + ], + "initSkillTrigger": null, + "phaseSkillTrigger": null, + "iActionList": null + }, + { + "id": 217206, + "armType": 2, + "name": "튤립병", + "attack": 200, + "defence": 100, + "speed": 7, + "avoid": 20, + "magicCoef": 0, + "cost": 13, + "rice": 13, + "requirements": [ + { + "type": "ReqTech", + "tech": 3000 + }, + { + "type": "ReqCities", + "cities": [ + "커스텀" + ] + } + ], + "attackCoef": { + "1": 0.8, + "3": 1.2, + "5": 1.2, + "217502": 1 + }, + "defenceCoef": { + "1": 1.2, + "3": 0.8, + "5": 0.8, + "217502": 1 + }, + "info": [ + "최첨단병기 튤립으로 적을 폭격합니다." + ], + "initSkillTrigger": null, + "phaseSkillTrigger": null, + "iActionList": null + }, + { + "id": 217207, + "armType": 2, + "name": "아이스플레임 궁병", + "attack": 150, + "defence": 150, + "speed": 7, + "avoid": 20, + "magicCoef": 0, + "cost": 13, + "rice": 13, + "requirements": [ + { + "type": "ReqTech", + "tech": 3000 + }, + { + "type": "ReqCities", + "cities": [ + "라그나로크 아크" + ] + } + ], + "attackCoef": { + "1": 0.8, + "3": 1.2, + "5": 1.2, + "217502": 1 + }, + "defenceCoef": { + "1": 1.2, + "3": 0.8, + "5": 0.8, + "217502": 1 + }, + "info": [ + "혁명을 성공으로 이끈 정예 게릴라 궁병입니다." + ], + "initSkillTrigger": null, + "phaseSkillTrigger": null, + "iActionList": null + }, + { + "id": 217208, + "armType": 2, + "name": "카라 궁병", + "attack": 225, + "defence": 225, + "speed": 7, + "avoid": 30, + "magicCoef": 0, + "cost": 25, + "rice": 25, + "requirements": [ + { + "type": "ReqTech", + "tech": 5000 + }, + { + "type": "ReqCities", + "cities": [ + "펜실 카우" + ] + } + ], + "attackCoef": { + "1": 0.8, + "3": 1.2, + "5": 1.2, + "217502": 1 + }, + "defenceCoef": { + "1": 1.2, + "3": 0.8, + "5": 0.8, + "217502": 1 + }, + "info": [ + "선조의 힘을 이어받은 최강의 카라 정예 궁병입니다." + ], + "initSkillTrigger": null, + "phaseSkillTrigger": null, + "iActionList": null + }, + { + "id": 217300, + "armType": 3, + "name": "기동병", + "attack": 150, + "defence": 100, + "speed": 7, + "avoid": 5, + "magicCoef": 0, + "cost": 11, + "rice": 11, + "requirements": [], + "attackCoef": { + "1": 1.2, + "2": 0.8, + "5": 1.2, + "217502": 1 + }, + "defenceCoef": { + "1": 0.8, + "2": 1.2, + "5": 0.8, + "217502": 1 + }, + "info": [ + "표준적인 기동병입니다. 기동병은 공격특화입니다." + ], + "initSkillTrigger": null, + "phaseSkillTrigger": [ + "che_기병병종전투" + ], + "iActionList": null + }, + { + "id": 217301, + "armType": 3, + "name": "하치온나", + "attack": 175, + "defence": 100, + "speed": 7, + "avoid": 15, + "magicCoef": 0, + "cost": 12, + "rice": 12, + "requirements": [ + { + "type": "ReqTech", + "tech": 1000 + }, + { + "type": "ReqRegions", + "regions": [ + "자유도시 서부" + ] + } + ], + "attackCoef": { + "1": 1.2, + "2": 0.8, + "5": 1.2, + "217502": 1 + }, + "defenceCoef": { + "1": 0.8, + "2": 1.2, + "5": 0.8, + "217502": 1 + }, + "info": [ + "작은 몸으로 회피하며 따끔한 일격을 먹이는 몬스터 기동병입니다." + ], + "initSkillTrigger": null, + "phaseSkillTrigger": [ + "che_기병병종전투" + ], + "iActionList": null + }, + { + "id": 217302, + "armType": 3, + "name": "적의 군 기동병", + "attack": 200, + "defence": 100, + "speed": 7, + "avoid": 5, + "magicCoef": 0, + "cost": 12, + "rice": 13, + "requirements": [ + { + "type": "ReqTech", + "tech": 1000 + }, + { + "type": "ReqRegions", + "regions": [ + "리자스 북부" + ] + } + ], + "attackCoef": { + "1": 1.2, + "2": 0.8, + "5": 1.2, + "217502": 1 + }, + "defenceCoef": { + "1": 0.8, + "2": 1.2, + "5": 0.8, + "217502": 1 + }, + "info": [ + "리자스군의 자랑인 기동부대입니다." + ], + "initSkillTrigger": null, + "phaseSkillTrigger": [ + "che_기병병종전투" + ], + "iActionList": null + }, + { + "id": 217303, + "armType": 3, + "name": "안드로이드 기동병", + "attack": 175, + "defence": 150, + "speed": 7, + "avoid": 10, + "magicCoef": 0, + "cost": 13, + "rice": 12, + "requirements": [ + { + "type": "ReqTech", + "tech": 2000 + }, + { + "type": "ReqCities", + "cities": [ + "악의 탑" + ] + } + ], + "attackCoef": { + "1": 1.2, + "2": 0.8, + "5": 1.2, + "217502": 1 + }, + "defenceCoef": { + "1": 0.8, + "2": 1.2, + "5": 0.8, + "217502": 1 + }, + "info": [ + "파이아르가 개발한 최첨단 안드로이드 기동병입니다." + ], + "initSkillTrigger": null, + "phaseSkillTrigger": [ + "che_기병병종전투" + ], + "iActionList": null + }, + { + "id": 217304, + "armType": 3, + "name": "파란쵸 기동병", + "attack": 200, + "defence": 100, + "speed": 8, + "avoid": 5, + "magicCoef": 0, + "cost": 13, + "rice": 11, + "requirements": [ + { + "type": "ReqTech", + "tech": 2000 + }, + { + "type": "ReqCities", + "cities": [ + "파란쵸 왕국" + ] + } + ], + "attackCoef": { + "1": 1.2, + "2": 0.8, + "5": 1.2, + "217502": 1 + }, + "defenceCoef": { + "1": 0.8, + "2": 1.2, + "5": 0.8, + "217502": 1 + }, + "info": [ + "적진을 일점돌파하는 파란쵸왕국의 돌격 기동병입니다. " + ], + "initSkillTrigger": null, + "phaseSkillTrigger": [ + "che_기병병종전투" + ], + "iActionList": null + }, + { + "id": 217305, + "armType": 3, + "name": "비행마물병", + "attack": 150, + "defence": 100, + "speed": 8, + "avoid": 15, + "magicCoef": 0, + "cost": 12, + "rice": 12, + "requirements": [ + { + "type": "ReqTech", + "tech": 2000 + }, + { + "type": "ReqCities", + "cities": [ + "죽음의 대지" + ] + } + ], + "attackCoef": { + "1": 1.2, + "2": 0.8, + "5": 1.2, + "217502": 1 + }, + "defenceCoef": { + "1": 0.8, + "2": 1.2, + "5": 0.8, + "217502": 1 + }, + "info": [ + "비행마물에 올라탄 기동마물병입니다." + ], + "initSkillTrigger": null, + "phaseSkillTrigger": [ + "che_기병병종전투" + ], + "iActionList": null + }, + { + "id": 217306, + "armType": 3, + "name": "마물조련사병", + "attack": 250, + "defence": 200, + "speed": 6, + "avoid": 0, + "magicCoef": 0, + "cost": 16, + "rice": 16, + "requirements": [ + { + "type": "ReqTech", + "tech": 3000 + }, + { + "type": "ReqCities", + "cities": [ + "랑그바우" + ] + } + ], + "attackCoef": { + "1": 1.2, + "2": 0.8, + "5": 1.2, + "217502": 1 + }, + "defenceCoef": { + "1": 0.8, + "2": 1.2, + "5": 0.8, + "217502": 1 + }, + "info": [ + "무시무시한 몬스터에 올라타서 싸우는 극강의 기동병입니다." + ], + "initSkillTrigger": null, + "phaseSkillTrigger": [ + "che_기병병종전투" + ], + "iActionList": null + }, + { + "id": 217307, + "armType": 3, + "name": "기마병", + "attack": 200, + "defence": 150, + "speed": 7, + "avoid": 5, + "magicCoef": 0, + "cost": 14, + "rice": 14, + "requirements": [ + { + "type": "ReqTech", + "tech": 3000 + }, + { + "type": "ReqCities", + "cities": [ + "오와리" + ] + } + ], + "attackCoef": { + "1": 1.2, + "2": 0.8, + "5": 1.2, + "217502": 1 + }, + "defenceCoef": { + "1": 0.8, + "2": 1.2, + "5": 0.8, + "217502": 1 + }, + "info": [ + "JAPAN 특유의 기마에 올라타 적을 짓밟는 기동병입니다." + ], + "initSkillTrigger": null, + "phaseSkillTrigger": [ + "che_기병병종전투" + ], + "iActionList": null + }, + { + "id": 217308, + "armType": 3, + "name": "엔젤나이트", + "attack": 300, + "defence": 200, + "speed": 7, + "avoid": 5, + "magicCoef": 0, + "cost": 25, + "rice": 25, + "requirements": [ + { + "type": "ReqTech", + "tech": 5000 + }, + { + "type": "ReqCities", + "cities": [ + "떨어진 궁도" + ] + } + ], + "attackCoef": { + "1": 1.2, + "2": 0.8, + "5": 1.2, + "217502": 1 + }, + "defenceCoef": { + "1": 0.8, + "2": 1.2, + "5": 0.8, + "217502": 1 + }, + "info": [ + "신의 명령으로 파멸을 내리기 위해 강림했습니다." + ], + "initSkillTrigger": null, + "phaseSkillTrigger": [ + "che_기병병종전투" + ], + "iActionList": null + }, + { + "id": 217400, + "armType": 4, + "name": "마법병", + "attack": 80, + "defence": 80, + "speed": 7, + "avoid": 5, + "magicCoef": 0.6, + "cost": 9, + "rice": 9, + "requirements": [], + "attackCoef": { + "5": 1.2 + }, + "defenceCoef": { + "5": 0.8 + }, + "info": [ + "마법을 사용하는 병종입니다." + ], + "initSkillTrigger": null, + "phaseSkillTrigger": null, + "iActionList": null + }, + { + "id": 217401, + "armType": 4, + "name": "마물 마법병", + "attack": 90, + "defence": 90, + "speed": 7, + "avoid": 0, + "magicCoef": 0.6, + "cost": 11, + "rice": 9, + "requirements": [ + { + "type": "ReqRegions", + "regions": [ + "호넷 마인령", + "케이브리스 마인령" + ] + } + ], + "attackCoef": { + "5": 1.2 + }, + "defenceCoef": { + "5": 0.8 + }, + "info": [ + "마군 지역 기본병종입니다. 조금더 강하지만 금을 많이 소비합니다." + ], + "initSkillTrigger": null, + "phaseSkillTrigger": null, + "iActionList": null + }, + { + "id": 217402, + "armType": 4, + "name": "카라 마법병", + "attack": 80, + "defence": 80, + "speed": 7, + "avoid": 20, + "magicCoef": 0.6, + "cost": 10, + "rice": 10, + "requirements": [ + { + "type": "ReqTech", + "tech": 1000 + }, + { + "type": "ReqRegions", + "regions": [ + "카라의 숲" + ] + } + ], + "attackCoef": { + "5": 1.2 + }, + "defenceCoef": { + "5": 0.8 + }, + "info": [ + "신속히 움직이며 카라의 저주로 적을 공격합니다." + ], + "initSkillTrigger": null, + "phaseSkillTrigger": null, + "iActionList": null + }, + { + "id": 217403, + "armType": 4, + "name": "제스 마법병", + "attack": 100, + "defence": 100, + "speed": 7, + "avoid": 0, + "magicCoef": 0.6, + "cost": 10, + "rice": 10, + "requirements": [ + { + "type": "ReqTech", + "tech": 1000 + }, + { + "type": "ReqRegions", + "regions": [ + "제스 북부" + ] + } + ], + "attackCoef": { + "5": 1.2 + }, + "defenceCoef": { + "5": 0.8 + }, + "info": [ + "마법국가 제스의 전통있는 마법병입니다." + ], + "initSkillTrigger": null, + "phaseSkillTrigger": null, + "iActionList": null + }, + { + "id": 217404, + "armType": 4, + "name": "무녀", + "attack": 80, + "defence": 80, + "speed": 8, + "avoid": 10, + "magicCoef": 0.6, + "cost": 10, + "rice": 10, + "requirements": [ + { + "type": "ReqTech", + "tech": 1000 + }, + { + "type": "ReqRegions", + "regions": [ + "JAPAN" + ] + } + ], + "attackCoef": { + "5": 1.2 + }, + "defenceCoef": { + "5": 0.8 + }, + "info": [ + "신마법과 함께 신통한 춤으로 활력을 불어넣는 마법병입니다." + ], + "initSkillTrigger": null, + "phaseSkillTrigger": null, + "iActionList": null + }, + { + "id": 217405, + "armType": 4, + "name": "프로즌", + "attack": 90, + "defence": 70, + "speed": 7, + "avoid": 10, + "magicCoef": 0.8, + "cost": 10, + "rice": 10, + "requirements": [ + { + "type": "ReqTech", + "tech": 1000 + }, + { + "type": "ReqRegions", + "regions": [ + "헬만 서부" + ] + } + ], + "attackCoef": { + "5": 1.2 + }, + "defenceCoef": { + "5": 0.8 + }, + "info": [ + "백병전에 불리한 연약한 몸으로 마법 사용에 집중하는 몬스터입니다." + ], + "initSkillTrigger": null, + "phaseSkillTrigger": null, + "iActionList": null + }, + { + "id": 217406, + "armType": 4, + "name": "마소한 마법병", + "attack": 70, + "defence": 90, + "speed": 7, + "avoid": 10, + "magicCoef": 0.8, + "cost": 11, + "rice": 10, + "requirements": [ + { + "type": "ReqTech", + "tech": 1000 + }, + { + "type": "ReqRegions", + "regions": [ + "케이브리스 마인령" + ] + } + ], + "attackCoef": { + "5": 1.2 + }, + "defenceCoef": { + "5": 0.8 + }, + "info": [ + "로브를 여러겹 둘러입은 마물마법병입니다. 직접 전투보단 마법에 집중합니다." + ], + "initSkillTrigger": null, + "phaseSkillTrigger": null, + "iActionList": null + }, + { + "id": 217407, + "armType": 4, + "name": "신관병", + "attack": 80, + "defence": 130, + "speed": 7, + "avoid": 5, + "magicCoef": 0.6, + "cost": 9, + "rice": 11, + "requirements": [ + { + "type": "ReqTech", + "tech": 2000 + }, + { + "type": "ReqCities", + "cities": [ + "카이즈" + ] + } + ], + "attackCoef": { + "5": 1.2 + }, + "defenceCoef": { + "5": 0.8 + }, + "info": [ + "AL교의 전투신관입니다. 몸을 보호하는 성스러운 마법을 사용합니다." + ], + "initSkillTrigger": null, + "phaseSkillTrigger": null, + "iActionList": null + }, + { + "id": 217408, + "armType": 4, + "name": "중장마법병", + "attack": 80, + "defence": 130, + "speed": 7, + "avoid": 15, + "magicCoef": 0.6, + "cost": 11, + "rice": 12, + "requirements": [ + { + "type": "ReqTech", + "tech": 3000 + }, + { + "type": "ReqCities", + "cities": [ + "로제스그라드" + ] + } + ], + "attackCoef": { + "5": 1.2 + }, + "defenceCoef": { + "5": 0.8 + }, + "info": [ + "두터운 로브를 입고 불길한 주문을 읊습니다." + ], + "initSkillTrigger": null, + "phaseSkillTrigger": null, + "iActionList": null + }, + { + "id": 217409, + "armType": 4, + "name": "악마병", + "attack": 130, + "defence": 80, + "speed": 7, + "avoid": 15, + "magicCoef": 0.6, + "cost": 11, + "rice": 12, + "requirements": [ + { + "type": "ReqTech", + "tech": 3000 + }, + { + "type": "ReqCities", + "cities": [ + "올드제스" + ] + } + ], + "attackCoef": { + "5": 1.2 + }, + "defenceCoef": { + "5": 0.8 + }, + "info": [ + "고대 제스 왕가의 계약에 따라 소환된 흑마법병입니다." + ], + "initSkillTrigger": null, + "phaseSkillTrigger": null, + "iActionList": null + }, + { + "id": 217410, + "armType": 4, + "name": "호넷 마물병", + "attack": 130, + "defence": 130, + "speed": 7, + "avoid": 0, + "magicCoef": 0.6, + "cost": 12, + "rice": 12, + "requirements": [ + { + "type": "ReqTech", + "tech": 3000 + }, + { + "type": "ReqCities", + "cities": [ + "구 마왕성" + ] + } + ], + "attackCoef": { + "5": 1.2 + }, + "defenceCoef": { + "5": 0.8 + }, + "info": [ + "호넷 직속의 최강 마물 마법병입니다." + ], + "initSkillTrigger": null, + "phaseSkillTrigger": null, + "iActionList": null + }, + { + "id": 217411, + "armType": 4, + "name": "Z가디언", + "attack": 180, + "defence": 180, + "speed": 7, + "avoid": 0, + "magicCoef": 0.7, + "cost": 28, + "rice": 20, + "requirements": [ + { + "type": "ReqTech", + "tech": 5000 + }, + { + "type": "ReqCities", + "cities": [ + "라그나로크 아크" + ] + } + ], + "attackCoef": { + "5": 1.2 + }, + "defenceCoef": { + "5": 0.8 + }, + "info": [ + "제스의 기술력이 집약된 최고의 마법병기입니다." + ], + "initSkillTrigger": null, + "phaseSkillTrigger": null, + "iActionList": null + }, + { + "id": 217500, + "armType": 5, + "name": "정란", + "attack": 150, + "defence": 150, + "speed": 6, + "avoid": 0, + "magicCoef": 0, + "cost": 15, + "rice": 5, + "requirements": [ + { + "type": "ReqMinRelYear", + "year": 3 + } + ], + "attackCoef": { + "1": 0.8, + "2": 0.8, + "3": 0.8, + "4": 0.8, + "0": 1.8 + }, + "defenceCoef": { + "1": 1.2, + "2": 1.2, + "3": 1.2, + "4": 1.2 + }, + "info": [ + "높은 구조물 위에서 공격합니다." + ], + "initSkillTrigger": [ + "che_성벽부상무효" + ], + "phaseSkillTrigger": null, + "iActionList": null + }, + { + "id": 217501, + "armType": 5, + "name": "충차", + "attack": 150, + "defence": 100, + "speed": 6, + "avoid": 0, + "magicCoef": 0, + "cost": 20, + "rice": 5, + "requirements": [ + { + "type": "ReqTech", + "tech": 1000 + }, + { + "type": "ReqMinRelYear", + "year": 3 + } + ], + "attackCoef": { + "1": 0.8, + "2": 0.8, + "3": 0.8, + "4": 0.8, + "0": 2.4 + }, + "defenceCoef": { + "1": 1.2, + "2": 1.2, + "3": 1.2, + "4": 1.2 + }, + "info": [ + "엄청난 위력으로 성벽을 부수어버립니다." + ], + "initSkillTrigger": [ + "che_성벽부상무효" + ], + "phaseSkillTrigger": null, + "iActionList": null + }, + { + "id": 217502, + "armType": 5, + "name": "튤립3호", + "attack": 275, + "defence": 300, + "speed": 6, + "avoid": 0, + "magicCoef": 0, + "cost": 35, + "rice": 15, + "requirements": [ + { + "type": "ReqTech", + "tech": 5000 + }, + { + "type": "ReqCities", + "cities": [ + "커스텀" + ] + } + ], + "attackCoef": [], + "defenceCoef": [], + "info": [ + "파괴적인 위력과 정말 파괴적인 비용을 자랑하는 전차입니다. " + ], + "initSkillTrigger": [ + "che_성벽부상무효" + ], + "phaseSkillTrigger": null, + "iActionList": null + } + ] +} diff --git a/app/game-engine/resources/unitset/unitset_siegetank.json b/app/game-engine/resources/unitset/unitset_siegetank.json new file mode 100644 index 0000000..82591fa --- /dev/null +++ b/app/game-engine/resources/unitset/unitset_siegetank.json @@ -0,0 +1,303 @@ +{ + "id": "siegetank", + "name": "siegetank", + "defaultCrewTypeId": 1100, + "armTypes": { + "1": "보병", + "2": "궁병", + "3": "기병", + "4": "귀병", + "5": "차병" + }, + "crewTypes": [ + { + "id": 1000, + "armType": 0, + "name": "성벽", + "attack": 100, + "defence": 100, + "speed": 7, + "avoid": 0, + "magicCoef": 0, + "cost": 99, + "rice": 9, + "requirements": [ + { + "type": "Impossible" + } + ], + "attackCoef": [], + "defenceCoef": { + "1": 1.2 + }, + "info": [ + "성벽입니다.", + "생성할 수 없습니다." + ], + "initSkillTrigger": null, + "phaseSkillTrigger": null, + "iActionList": null + }, + { + "id": 1100, + "armType": 1, + "name": "보병", + "attack": 100, + "defence": 150, + "speed": 7, + "avoid": 10, + "magicCoef": 0, + "cost": 18, + "rice": 18, + "requirements": [], + "attackCoef": { + "2": 1.2, + "3": 0.8 + }, + "defenceCoef": { + "2": 0.8, + "3": 1.2 + }, + "info": [ + "표준적인 보병입니다.", + "보병은 방어특화이며,", + "상대가 회피하기 어렵습니다." + ], + "initSkillTrigger": null, + "phaseSkillTrigger": null, + "iActionList": null + }, + { + "id": 1200, + "armType": 2, + "name": "궁병", + "attack": 100, + "defence": 100, + "speed": 7, + "avoid": 20, + "magicCoef": 0, + "cost": 20, + "rice": 20, + "requirements": [], + "attackCoef": { + "3": 1.2, + "1": 0.8 + }, + "defenceCoef": { + "3": 0.8, + "1": 1.2 + }, + "info": [ + "표준적인 궁병입니다.", + "궁병은 회피특화입니다." + ], + "initSkillTrigger": null, + "phaseSkillTrigger": null, + "iActionList": null + }, + { + "id": 1300, + "armType": 3, + "name": "기병", + "attack": 150, + "defence": 100, + "speed": 7, + "avoid": 5, + "magicCoef": 0, + "cost": 22, + "rice": 22, + "requirements": [], + "attackCoef": { + "1": 1.2, + "2": 0.8 + }, + "defenceCoef": { + "1": 0.8, + "2": 1.2 + }, + "info": [ + "표준적인 기병입니다.", + "기병은 공격특화입니다." + ], + "initSkillTrigger": null, + "phaseSkillTrigger": null, + "iActionList": null + }, + { + "id": 1400, + "armType": 4, + "name": "귀병", + "attack": 80, + "defence": 80, + "speed": 7, + "avoid": 5, + "magicCoef": 0.5, + "cost": 18, + "rice": 18, + "requirements": [], + "attackCoef": [], + "defenceCoef": [], + "info": [ + "계략을 사용하는 병종입니다." + ], + "initSkillTrigger": null, + "phaseSkillTrigger": null, + "iActionList": null + }, + { + "id": 1405, + "armType": 4, + "name": "남귀병", + "attack": 60, + "defence": 60, + "speed": 7, + "avoid": 10, + "magicCoef": 0.8, + "cost": 16, + "rice": 16, + "requirements": [ + { + "type": "ReqTech", + "tech": 1000 + } + ], + "attackCoef": [], + "defenceCoef": [], + "info": [ + "전투를 포기하고 계략에 몰두합니다." + ], + "initSkillTrigger": null, + "phaseSkillTrigger": null, + "iActionList": null + }, + { + "id": 1500, + "armType": 5, + "name": "정란", + "attack": 100, + "defence": 100, + "speed": 6, + "avoid": 0, + "magicCoef": 0, + "cost": 7, + "rice": 3, + "requirements": [], + "attackCoef": [ + 1.8 + ], + "defenceCoef": [], + "info": [ + "높은 구조물 위에서 공격합니다." + ], + "initSkillTrigger": [ + "che_성벽부상무효" + ], + "phaseSkillTrigger": null, + "iActionList": null + }, + { + "id": 1501, + "armType": 5, + "name": "충차", + "attack": 150, + "defence": 100, + "speed": 6, + "avoid": 0, + "magicCoef": 0, + "cost": 10, + "rice": 3, + "requirements": [ + { + "type": "ReqTech", + "tech": 1000 + }, + { + "type": "ReqMinRelYear", + "year": 3 + } + ], + "attackCoef": [ + 2.4 + ], + "defenceCoef": [], + "info": [ + "엄청난 위력으로 성벽을 부수어버립니다." + ], + "initSkillTrigger": [ + "che_성벽부상무효" + ], + "phaseSkillTrigger": null, + "iActionList": null + }, + { + "id": 1502, + "armType": 5, + "name": "벽력거", + "attack": 200, + "defence": 100, + "speed": 6, + "avoid": 0, + "magicCoef": 0, + "cost": 20, + "rice": 4, + "requirements": [ + { + "type": "ReqTech", + "tech": 3000 + }, + { + "type": "ReqCities", + "cities": [ + "업" + ] + } + ], + "attackCoef": [ + 1.8 + ], + "defenceCoef": [], + "info": [ + "상대에게 돌덩이를 날립니다." + ], + "initSkillTrigger": [ + "che_성벽부상무효" + ], + "phaseSkillTrigger": null, + "iActionList": null + }, + { + "id": 1503, + "armType": 5, + "name": "목우", + "attack": 50, + "defence": 200, + "speed": 5, + "avoid": 0, + "magicCoef": 0, + "cost": 15, + "rice": 3, + "requirements": [ + { + "type": "ReqTech", + "tech": 3000 + }, + { + "type": "ReqCities", + "cities": [ + "성도" + ] + } + ], + "attackCoef": [], + "defenceCoef": [], + "info": [ + "상대를 저지하는 특수병기입니다." + ], + "initSkillTrigger": [ + "che_성벽부상무효" + ], + "phaseSkillTrigger": null, + "iActionList": null + } + ] +} diff --git a/packages/logic/src/index.ts b/packages/logic/src/index.ts index ec2d37d..e0679d8 100644 --- a/packages/logic/src/index.ts +++ b/packages/logic/src/index.ts @@ -3,6 +3,7 @@ export type { RandomGenerator } from '@sammo-ts/common'; export * from './actions/index.js'; export * from './constraints/index.js'; export * from './logging/index.js'; +export * from './messages/index.js'; export * from './ports/world.js'; export * from './ports/worldSnapshot.js'; export * from './scenario/index.js'; diff --git a/packages/logic/src/messages/index.ts b/packages/logic/src/messages/index.ts new file mode 100644 index 0000000..4b7e164 --- /dev/null +++ b/packages/logic/src/messages/index.ts @@ -0,0 +1 @@ +export * from './message.js'; diff --git a/packages/logic/src/messages/message.ts b/packages/logic/src/messages/message.ts new file mode 100644 index 0000000..5ce76f6 --- /dev/null +++ b/packages/logic/src/messages/message.ts @@ -0,0 +1,168 @@ +export type MessageType = 'public' | 'private' | 'national' | 'diplomacy'; + +export const MESSAGE_MAILBOX_PUBLIC = 9999; +export const MESSAGE_MAILBOX_NATIONAL_BASE = 9000; + +export interface MessageTarget { + generalId: number; + generalName: string; + nationId: number; + nationName: string; + color: string; + icon: string; +} + +export type MessageOption = Record; + +export interface MessageDraft { + msgType: MessageType; + src: MessageTarget; + dest: MessageTarget; + text: string; + time: Date; + validUntil: Date; + option?: MessageOption | null; +} + +export interface MessagePayload { + src: MessageTarget; + dest: MessageTarget; + text: string; + option?: MessageOption | null; +} + +export interface MessageRecordDraft { + mailbox: number; + msgType: MessageType; + srcId: number; + destId: number; + time: Date; + validUntil: Date; + payload: MessagePayload; +} + +export interface MessageStore { + insertMessage(draft: MessageRecordDraft): Promise; +} + +export const isValidMailbox = (mailbox: number): boolean => + mailbox > 0 && mailbox <= MESSAGE_MAILBOX_PUBLIC; + +export const resolveReceiverMailbox = (draft: MessageDraft): number => { + switch (draft.msgType) { + case 'public': + return MESSAGE_MAILBOX_PUBLIC; + case 'national': + case 'diplomacy': + return MESSAGE_MAILBOX_NATIONAL_BASE + draft.dest.nationId; + case 'private': + return draft.dest.generalId; + } +}; + +export const resolveSenderMailbox = (draft: MessageDraft): number | null => { + switch (draft.msgType) { + case 'public': + return null; + case 'private': + return draft.src.generalId !== draft.dest.generalId + ? draft.src.generalId + : null; + case 'national': + return draft.src.nationId !== draft.dest.nationId + ? MESSAGE_MAILBOX_NATIONAL_BASE + draft.src.nationId + : null; + case 'diplomacy': + return MESSAGE_MAILBOX_NATIONAL_BASE + draft.src.nationId; + } +}; + +const buildPayload = ( + draft: MessageDraft, + optionOverride?: MessageOption | null +): MessagePayload => ({ + src: draft.src, + dest: draft.dest, + text: draft.text, + option: optionOverride ?? draft.option ?? {}, +}); + +const buildRecord = ( + draft: MessageDraft, + mailbox: number, + optionOverride?: MessageOption | null +): MessageRecordDraft => { + const payload = buildPayload(draft, optionOverride); + let srcId = draft.src.generalId; + let destId = draft.dest.generalId; + + if (draft.msgType === 'public') { + destId = MESSAGE_MAILBOX_PUBLIC; + } else if (draft.msgType === 'national' || draft.msgType === 'diplomacy') { + srcId = MESSAGE_MAILBOX_NATIONAL_BASE + draft.src.nationId; + destId = MESSAGE_MAILBOX_NATIONAL_BASE + draft.dest.nationId; + } + + return { + mailbox, + msgType: draft.msgType, + srcId, + destId, + time: draft.time, + validUntil: draft.validUntil, + payload, + }; +}; + +const buildSenderOption = ( + draft: MessageDraft, + receiverId: number +): MessageOption => { + const option = { + ...(draft.option ?? {}), + receiverMessageID: receiverId, + }; + + if (draft.msgType === 'diplomacy' && 'action' in option) { + const { action: _action, ...rest } = option; + return rest; + } + + return option; +}; + +// 메시지 전달 규칙(수신/송신 복사본)을 그대로 유지한다. +export const sendMessage = async ( + store: MessageStore, + draft: MessageDraft, + options: { sendDestOnly?: boolean } = {} +): Promise<{ receiverId: number; senderId?: number }> => { + const receiverMailbox = resolveReceiverMailbox(draft); + if (!isValidMailbox(receiverMailbox)) { + throw new Error(`Invalid receiver mailbox: ${receiverMailbox}`); + } + + const receiverRecord = buildRecord(draft, receiverMailbox); + const receiverId = await store.insertMessage(receiverRecord); + if (!receiverId) { + throw new Error('Failed to send receiver message.'); + } + + if (options.sendDestOnly) { + return { receiverId }; + } + + const senderMailbox = resolveSenderMailbox(draft); + if (!senderMailbox || senderMailbox === receiverMailbox) { + return { receiverId }; + } + + const senderRecord = buildRecord( + draft, + senderMailbox, + buildSenderOption(draft, receiverId) + ); + const senderId = await store.insertMessage(senderRecord); + + return senderId ? { receiverId, senderId } : { receiverId }; +}; diff --git a/packages/logic/test/message.test.ts b/packages/logic/test/message.test.ts new file mode 100644 index 0000000..569d654 --- /dev/null +++ b/packages/logic/test/message.test.ts @@ -0,0 +1,109 @@ +import { describe, expect, it } from 'vitest'; + +import { + MESSAGE_MAILBOX_NATIONAL_BASE, + MESSAGE_MAILBOX_PUBLIC, + sendMessage, + type MessageDraft, + type MessageRecordDraft, + type MessageStore, + type MessageTarget, +} from '../src/messages/message.js'; + +const buildTarget = (overrides: Partial = {}): MessageTarget => ({ + generalId: 1, + generalName: '테스트', + nationId: 1, + nationName: '나라', + color: '#000000', + icon: '', + ...overrides, +}); + +class InMemoryMessageStore implements MessageStore { + private nextId = 1; + public readonly records: Array<{ id: number; draft: MessageRecordDraft }> = []; + + async insertMessage(draft: MessageRecordDraft): Promise { + const id = this.nextId++; + this.records.push({ id, draft }); + return id; + } +} + +const buildDraft = (overrides: Partial = {}): MessageDraft => ({ + msgType: 'private', + src: buildTarget({ generalId: 10, nationId: 1 }), + dest: buildTarget({ generalId: 20, nationId: 2 }), + text: '안녕', + time: new Date('2025-01-01T00:00:00Z'), + validUntil: new Date('9999-12-31T00:00:00Z'), + option: {}, + ...overrides, +}); + +describe('sendMessage', () => { + it('sends a private message to receiver and sender', async () => { + const store = new InMemoryMessageStore(); + const draft = buildDraft(); + + const result = await sendMessage(store, draft); + + expect(result.receiverId).toBe(1); + expect(result.senderId).toBe(2); + expect(store.records).toHaveLength(2); + expect(store.records[0].draft.mailbox).toBe(draft.dest.generalId); + expect(store.records[1].draft.mailbox).toBe(draft.src.generalId); + expect(store.records[0].draft.payload.option).not.toHaveProperty( + 'receiverMessageID' + ); + expect(store.records[1].draft.payload.option).toMatchObject({ + receiverMessageID: 1, + }); + }); + + it('sends only one national message when nations match', async () => { + const store = new InMemoryMessageStore(); + const draft = buildDraft({ + msgType: 'national', + dest: buildTarget({ generalId: 0, nationId: 1 }), + }); + + const result = await sendMessage(store, draft); + + expect(result.senderId).toBeUndefined(); + expect(store.records).toHaveLength(1); + expect(store.records[0].draft.mailbox).toBe( + MESSAGE_MAILBOX_NATIONAL_BASE + 1 + ); + }); + + it('keeps public messages in the shared mailbox only', async () => { + const store = new InMemoryMessageStore(); + const draft = buildDraft({ + msgType: 'public', + dest: buildTarget({ generalId: 0, nationId: 0 }), + }); + + const result = await sendMessage(store, draft); + + expect(result.senderId).toBeUndefined(); + expect(store.records).toHaveLength(1); + expect(store.records[0].draft.mailbox).toBe(MESSAGE_MAILBOX_PUBLIC); + }); + + it('removes diplomacy action from sender copy', async () => { + const store = new InMemoryMessageStore(); + const draft = buildDraft({ + msgType: 'diplomacy', + option: { action: 'test', payload: 1 }, + dest: buildTarget({ generalId: 0, nationId: 2 }), + }); + + await sendMessage(store, draft); + + const senderPayload = store.records[1].draft.payload.option ?? {}; + expect(senderPayload).not.toHaveProperty('action'); + expect(senderPayload).toMatchObject({ payload: 1 }); + }); +});