리제 구현



이만큼하고 리제 전장 구현


==========================================


현재 인게임 캐릭터 종류는 158명

현재 구현한 캐릭터는 9명 (알파 제외 21스쿼드, 앨리스, 바닐라, 리제)

3월 안애 모든 캐릭터를 구현하기 위해서 하루 약 149/31 = 4.806 = 5명을 구현해야 함

혹시 미완성인채로 올리고 군바 할까봐 여기에 미리 적어놓고 계속 수정하다가 릴리즈 글에 붙여넣기

(생각해보니 다 만들어도 그때 가면 신캐 계속 나와서 어쩔수 없이 적어야겠네)


* 파이썬3.9로 작성됨

* 아직 행동 관련 기능은 구현되지 않음 (캐릭 순서, 스킬 사용시 ap소모, 라운드마다 ap 충전 등)


* 어쩌다보니 쥰내 길어짐






LO.lo_system.Game()

전투 관리 클래스

allyfield = 아군 진영

enemyfield = 적군 진영

round = 웨이브 라운드


pprint() = 현재 전투 상황을 이쁘게 출력(함수 호출시 출력할 문자열을 반환하지 않고 바로 출력함)

put_character(c, enemy) = 캐릭터(c) 배치 (enemy가 true면 적 진영에 배치, 기본값은 false = 아군 진영에 배치)

get_character(x, y, enemy) = 주어진 좌표에 있는 캐릭터를 반환 (enemy가 true면 적 진영에서 정보를 가져옴, 기본값은 true = 아군 진영에서 가져옴)

좌표는 아군, 적군 모두 다음과 같음 

0, 0 (= 0)0, 1 (= 1)0, 2 (= 2) 
1, 0 (= 3) 1, 1 (= 4) 1, 2 (= 5) 
2, 0 (= 6) 2, 1 (= 7) 2, 2 (= 8) 

get_character_int(p, enemy) = get_character와 기능 똑같음, p = 3*x + y


trigger_all(trig) = 키패드 기준 789456123순으로 각 캐릭터의 패시브를 발동함

trig에는 LO.lo_import에 있는 TRIGGERS를 참고

예: "전투 시작시" 조건의 버프를 적용하고 싶을 때 trigger_all(WAVE)를 실행


check_protect(pos, enemy)

pos는 좌표를 정수로 바꾼(3*x+y) 값의 리스트

예: 적군 정중앙에 십자가 범위공격시 check_protect([1, 3, 4, 5, 8], true)

enemy가 true면 적 진영, false(기본값)면 아군 진영에서

pos 좌표들에 공격을 가할 때 실제로 공격받는 캐릭터들을 반환


반환은 9개 요소 리스트, n번 인덱스 요소는 좌표 n에 공격받는 캐릭에 대한 정보를 담음

pos에 없는 좌표에 대해서는 None, pos에 있는 좌표에 대해서는 다음 4가지 중 하나

(TARGET_PROTECT, 캐릭터) = 캐릭터가 이 위치를 지정보호함

(ROW_PROTECT, 캐릭터) = 캐릭터가 이 위치를 행보호함

(COLUMN_PROTECT, 캐릭터) = 캐릭터가 이 위치를 열보호함

('', 캐릭터) = 아무 보호 받지 않음(캐릭터는 그 위치에 있는 캐릭터임)


skill(subject_pos, skill_number, object_pos, subject_is_enemy)

subject_is_enemy가 true면 적 진영에서, false면 아군 진영에서

subject_pos 좌표에 있는 캐릭터가 액티브 skill_number번을 object_pos 좌표에 사용함

object가 아군인지 적인지는 subject_pos에 있는 캐릭터의 skill_isattack 값에 따라 결정함

반환값은 없음

(반격 기능 아직 구현 안됨)



LO.lo_system.Buff(buff_type, buff_value, buff_round, buff_operator, removable, max_stack, tag)

buff_type = 버프 타입(공, 치, 적, 방관, 표식, 받피 등등, LO.lo_import 참고)

buff_value = 버프 수치

buff_round = 버프 라운드 (영구 시 MAX=9223372036854775807를 입력하면 됨)

buff_operator = 버프 연산 유형, '+' 또는 '*'(기본값)

removable = 기본값 true, false로 설정시 해제불가

max_stack = 최대 중첩 수치, 제한이 없으면 0을 입력

tag = max_stack을 설정했을 경우 [str]로 꼭 사용, 기믹 등에 사용


+n%의 경우 곱연산이므로 '*'로 사용하고, 버프 수치에는 수치를 100으로 나눠서 그대로 사용할 것

예: 2라동안 공+20%면 Buff(ATK, d('0.2'), 2)

단, 치명, 적중, 효과 발동의 경우 수치를 그대로 사용하고 '+'를 사용할 것

예: 2라동안 적+20%면 Buff(ACC, d('20'), 2, '+

보호, 표식, 이동불가, 기믹 등의 경우 1, '+'를 사용할 것

예: 3라동안 표식이면 Buff(MARKED, 1, 3, '+')

피해최소화의 경우는 피해를 최소화 할 데미지 기준값을 적고 '+'를 사용할 것

예: Buff(MINIMIZE_DMG, 9999999, MAX, '+')


LO.lo_system.BuffList(buff1, buff2, ...)

그냥 버프 모아둠

update(round_pass)

round_pass가 true면 버프들의 라운드 모두 1 차감, false시 변함 없음

버프 라운드가 0 이하면 제거함

(즉시 피해량 증가 등에 사용)

BuffList끼리 더하면 합쳐짐

BuffList에 정수를 곱하면 그 안의 버프들 모두 수치에 정수를 곱함


filter(arg1, arg2, ...)

버프들 중 arg 타입의 버프만 필러팅

반환 = [arg1버프 리스트, arg2버프 리스트, ...]


filter_combine(arg1, arg2, ...)

filter에서 리스트들을 모두 합함


combine()

모든 버프를 합해서 BuffForCalc로 반환


LO.lo_system.BuffForCalc(Buff들의 리스트(BuffList가 아님))

실제 수치 계산을 위해 쓰임

계산 타입이 '*' 인 버프는 1을 더해져서 저장됨 (버프 타입 구별 X)

각 버프 타입마다 [곱연산수치, 합연산수치]로 저장되어

calc(type, value) 호출시 value * buffs[type][0] + buffs[type][1]을 반환


LO.lo_character_main.Character(game, x, y, rarity, lvl, stats, equips, skill_lvls, link, linkbonus, affection, oauth)

game = 캐릭터가 포함된 Game

None으로 해도 수동으로 버프를 주거나 타겟에게 주는 데미지를 계산할 수는 있음

x, y = 좌표

rarity = 등급(RARITY_B~SS)

lvl = 레벨

stats = 강화포인트(순서대로 공방체적회치, 예: [21, 0, 0, 0, 0, 178])

equips = [장비, 장비, 장비, 장비]

(아직 칩 os 기어 자리 안정함, 장비 미장착시 None)

skill_lvls = [액1스, 액2스, 패1스, 패2스, 패3스] 레벨

link = 링크적합률(%수치 그대로)

linkbonus = 링보 5개 옵션 중 위부터 순서대로 0, 1, 2, 3, 4 중 하나 택, 미선택시 None

affection = 호감도

oauth = 서약 여부 (T/F)

id = 캐릭터 도감 번호

type = XX형 XX기

name = 이름/별명

group = 소속부대

isenemy = 적 여부(대부분 false)

is21squad = 21스쿼드 소속 여부

isags = 바이오로이드/로봇

baseATK/DEF/HP/ACC/EVA/CRIT = 1렙 공방체적회치(순서대로 B, A, S, SS)

baseRESIST = 저항(불, 얼음, 전기)

baseDATK/DDEF/DHP = 레벨 증가에 따른 공방체 증가량

baseRange = 사거리

aoe = 범위

apcost = 스킬 비용

atkrate = 스킬 계수

buffrate = 버프 계수 (실제 계수 = 앞 수치 + 뒤 수치 * 스킬레벨)

skill_isattack = 공격/아군버프

skill_ignore_protect = 보호무시 여부


link_bonus_buffs = 링보로 얻는 버프

full_link_bonus_buffs = 풀링보로 얻는 버프

love_buffs = 서약/호감도200으로 얻는 버프(벞디벞+1)

normal_buffs = 공치적방회행벞

other_buffs = 표식, 이동불가, 보호, 지원공격, 보호막, 사거리, 반격, 방관, 방어막/피해감소 무시 등등

gimmick_buffs = 기믹용 벞

active_res__buffs = 효저/효저깍 벞

equip_buffs = 장비 고정 증가 수치(예: 공칩 +100)

anti_os_buffs = 대OS벞

damage_taken_decrease_buffs = 받피감

damage_taken_increase_buffs = 받피증


stack_limited_buff_tags = 중첩 제한 있는 버프 태그 모음, 얼마나 중첩되어있는지 알 수 있음 (중첩 제한 걸을 시 태그를 입력해야 하는 이유)

racon = 정찰 여부


getPos() = x, y

getPosInt() = 3*x + y

getSkillRange(num) = num번 스킬 사거리 반환, 사거리 버프 반영됨

getSkillRate(number) = num번 스킬의 공격계수, 버프계수 반환(패시브의 경우 공격계수는 0)

getAOE(number, basex, basey, _slice) = number번 스킬을 좌표 basex, basey에 사용했을 때의 실제 공격 범위 좌표값들

레벨에 따른 범위 확대/제한을 위해 _slice에 적절한 값을 입력(그리폰의 스킬 코드와 aoe 참고)

getTargets(number, basex, basey, is_follow_attack, _slice) = 공격받는 캐릭터들을 반환

decideActiveResist() = 효과 저항 판정함

True = 효과 저항 성공, False = 효과 저항 실패

decideCrit(target) = target의 회피와 자신의 적중, 치명률에 따라 적중/치명타 판정

0 = 회피, 1 = 적중, 1.5 = 치명타

giveBuff(Buff, force) = Buff를 추가

findBuff_byTag(t) = t라는 태그를 가진 모든 버프 반환


removeBuff_byTag(t, debuff, count)

removeBuff_byType(t, debuff, count)

t라는 태그/버프타입을(를) 가진 버프를 제거함

debuff가 false(기본값)이면 버프, true면 디버프, None이면 모든 버프

count는 최대로 삭제할 버프 개수(기본값=MAX)



캐릭터 스킬 구현 방법

기본 틀


빨, 파 각각에 액1, 액2를 구현

공격 스킬이라면

for target in actual_targets:

    h = self.decideCrit(target)

로 시작, 이후 적중시/치명타시 버프를 주거나 하면 됨

액1 구현시 지원공격할때는 버프를 주지 않기 위해서 if not follow와 같은 조건문을 꼭 넣을 것

데미지 계산은 result[target] = (h, self.calcDamage(target, atk_rate * h))와 같이 사용할 것

예: 그리폰

그리폰2스의 경우 추가화염피해도 구현


패시브의 경우 (예: 그리폰)

패시브 스킬을 발동시키기 위해 WAVE, ROUND, ATTACK, HIT 등의 트리거를 인수로 받아서 매번 호출되기 때문에

조건에 맞는 조건문을 사용



무용같이 폼체인지가 일어나는 경우

폼체인지용 변수들을 만들어주고

기본 함수들을 개조해서 사용할 것

(자세한 사항은 무용 코드 참고)