조회 수 1461 추천 수 0 댓글 4
?

단축키

Prev이전 문서

Next다음 문서

크게 작게 위로 아래로 댓글로 가기 인쇄
?

단축키

Prev이전 문서

Next다음 문서

크게 작게 위로 아래로 댓글로 가기 인쇄

저는 스크립트 문외한입니다..만 구글링의 힘을 빌려서 어느정도 스크립트를 짜집기 해봤습니다.

 

RPG MV 에 있는 변수 대입값 스크립트 (script) 란에 다음과 같이 입력했습니다.

 

if (target.result().critical) {

($gameActors.actor(7).mat *35.8 - $gameTroop.members()[0].mdf * 2)*2}

else {

$gameActors.actor(7).mat *35.8 - $gameTroop.members()[0].mdf * 2}

end

 

하지만 이대로 쓰면 에러가 납니다. target이나 result 에 대한 정의가 되지 않았다면서 말이죠.

 

조건부에 공격시 치명타가 터졌는지 안터졌는지 판별하는 부분을 어떻게 코딩 해야 하는지 알고 싶습니다.

 

(글로벌 변수니 인스턴스 변수니 아직 개념이 안잡혀서 모릅니다. ㅠ)

?
  • ?
    huguduk 2017.01.23 20:25
    스크립트 이전에 간단한 코딩공부를 하시면 도움이 될것같습니다.

    함수의 전체스코프를 올려주시지 않아서 원인은 알수없습니다만, 아마도 정의되지않은 변수 target혹은

    target의 result함수를 참조하지 못해서 문제가 생기는것같습니다.
  • profile
    lklslel 2017.01.27 01:52

    정확하게 어떤 기능을 만드시려는지 설명이 우선 필요합니다.

    어떤 상황에서 어느 쪽이 어떤 효과를 받는지 등등의

    일련의 흐름을 알려주시지 않으면 정확하게 캐치해드릴 수 없습니다.



    그리고 모호하게 생각하는 부분에 대해서 먼저 이야기하겠습니다.


    1. $gameActors 부분에서 $gameActors.actor(7)부분은


    Game_Action.prototype.subject = function() {
    if (this._subjectActorId > 0) {
    return $gameActors.actor(this._subjectActorId);
    } else {
    return $gameTroop.members()[this._subjectEnemyIndex];
    }
    };


    를 참고하셔서 작성하신 것 같은데

    맵을 이동하거나 바뀔 때마다 액터의 배열 인덱스 번호는 바뀌게 되어

    현재 맵에서 사용할 수 없는 this._subjectActorId 일 경우에는 제대로

    실행이 되지 않을 수 있습니다.


    우선 this._subjectActorId에 해당하는 액터가 존재하는가를 살펴야합니다.



    2. target.result().critical 이부분은 특정 객체(Game_Action 등) 내에서

    사용되는 외부로부터 전달되어 온 파라미터 변수 값을 기반으로

    로직이 기동하는 것이기 때문에 그냥 쓰게 되면 존재하지 않거나

    올바르지 않은 값이라는 에러가 뜨게 됩니다.


    Game_Action 객체는 배틀러의 각종 행동에 대한 처리를 담당합니다.


    배틀러로 등록된

    $gameParty.members()
    $gameTroop.members()

    에 연관된 모든 행동에 연관된다고 보시면 되겠습니다.


    그러므로 target.result().critical처럼 사용하시려면 target을

    가져올 수 있는 시점에 대해서 먼저 아셔야 합니다.

    BattleManager.startAction() 함수를 살펴보시면

    (js/rpg_manager.js : 2138줄)

    실행하는 중에 tartget들이 생성됩니다.


    BattleManager.startAction = function() {
    var subject = this._subject;
    var action = subject.currentAction();
    var targets = action.makeTargets();
    this._phase = 'action';
    this._action = action;
    this._targets = targets;
    subject.useItem(action.item());
    this._action.applyGlobal();
    this.refreshStatus();
    this._logWindow.startAction(subject, action, targets);
    };


    살펴보시면 여기에서는 직접적으로 실행해서

    크리티컬이 터졌는지까지는 알 수 없습니다.

    targets로 묶여있기 때문인데요.

    Game_Action.prototype.apply = function(target) {
    var result = target.result();
    this.subject().clearResult();
    result.clear();
    result.used = this.testApply(target);
    result.missed = (result.used && Math.random() >= this.itemHit(target));
    result.evaded = (!result.missed && Math.random() < this.itemEva(target));
    result.physical = this.isPhysical();
    result.drain = this.isDrain();
    if (result.isHit()) {
    if (this.item().damage.type > 0) {
    result.critical = (Math.random() < this.itemCri(target));
    var value = this.makeDamageValue(target, result.critical);
    this.executeDamage(target, value);
    }
    this.item().effects.forEach(function(effect) {
    this.applyItemEffect(target, effect);
    }, this);
    this.applyItemUserEffect(target);
    }
    };


    (js/rpg_object.js : 1644줄)

    를 살펴보시게 되면 케에데님께서 원하시는 부분이 나옵니다.

    result.critical = (Math.random() < this.itemCri(target));




    해당부분은 BattleManager 객체에서 전투시에 모두 접근이 가능합니다.

    BattleManager..actor()로 즉각적으로

    $gameParty.members()[this._actorIndex] or 대상없음

    으로 값을 알 수 있고

    전투시가 아니면 제대로된 값을 얻기 힘듭니다.


    추가적으로 모르시겠다면 질문해주세요.

  • ?
    케에데 2017.01.31 12:16

    긴 답글에 일단 감사드립니다.
    만들고자 하는 기능은 Yanfly 의 사이드베틀(시컨스1번) 플러그인에 있는 전투중 목표(user나 target(대상)을 정해서 HP를 증가시킬지 감소시킬지를 정하는 시컨스에서 HP증감양을 조절할때 정수와 변수로 조절하는 기능이 있는데 거기서 정수가 아닌 변수로 사용하고자 합니다.
    HP -100, user // HP +variable 13, target 이런식의 시컨스입니다.

    => 첫번째 유저의 체력을 100만큼 감소 // 둘째 변수13값 만큼 대상의 체력회복.


    그래서 저 변수값을 시컨스에 불러와서 쓰려고 하는데 문제는 HP 데미지를 만들고자 할때 크리티컬이 터졌는지 안터졌는지에 따라
    데미지의 양을 조절해서 대입하고자 하는건데 변수안에 있는 대입값 스크립트란에 코딩을 어찌해야 되는지를 몰라 질문드린겁니다.
    크리티컬이 터졌으면 2배의 데미지를 크리티컬이 안터졌으면 1배의 데미지를 이런식으로..

     

    $gameActors.actor(7).mat *35.8 - $gameTroop.members()[0].mdf * 2 => 액터 7번의 마법력 * 35.8 - 적 맴버 0번의 마법방어력 *2

    이부분은 제대로 실행이 되는것으로 확인이 되었습니다.

    다만 if 문을 써서 크리의 여부에 따라 실행값을 두부분으로 나누어야 하는데 조건부에 코딩을 모르겠습니다.

  • profile
    러닝은빛 2017.02.01 13:24

    데미지 값을 바꾸려는 거라면, Damage Core로 데미지 변경과 데미지의 흐름을 매개변수로 조절이 가능합니다.

     

    Damage Core - http://yanfly.moe/2015/11/07/yep-25-damage-core/

     

    모든 스크립트는 스킬 또는 아이템의 메모(Note)란에 적으면 됩니다.

     

    <damage formula>
    if (b.result().critical) {
      value = (a.mat *35.8 - b.mdf * 2)* 2;
    } else {
      value = a.mat *35.8 - b.mdf * 2;
    }
    </damage formula>


List of Articles
번호 제목 글쓴이 날짜 조회 수
8827 저번 글들과, 이전 글에 대해 묻고 싶습니다. idtptkd 2005.05.17 1314
8826 이전 작가들은 어떻게 되는 건가요? 아렉스 2005.05.17 1091
8825 이전 작가들은 어떻게 되는 건가요? 영원전설 2005.05.18 1152
8824 프루티룹스 질문... 신승일 2005.05.18 1472
8823 창작글만 있는데 감상문 같은 건 쓸수 없나요? 다르칸 2005.05.18 994
8822 창작글만 있는데 감상문 같은 건 쓸수 없나요? 아렉스 2005.05.18 1031
8821 창작글만 있는데 감상문 같은 건 쓸수 없나요? 천무 2005.05.18 820
8820 창작글만 있는데 감상문 같은 건 쓸수 없나요? 『水』신교 2005.05.18 869
8819 rpg만들기 2000에서 신규프로젝트가 만들어지지 않아요;; 밀크마스터 2005.05.18 1166
8818 rpg만들기 2000에서 신규프로젝트가 만들어지지 않아요;; 나랑놀자 2005.05.18 1111
8817 rpg만들기 2000에서 신규프로젝트가 만들어지지 않아요;; 셉티찡 2005.05.18 1170
8816 릴레이 소설 말인데요... 외로운갈매기 2005.05.18 675
8815 이전의 창작글 게시판의 글은 어케되나요? 천무 2005.05.18 471
8814 이전의 창작글 게시판의 글은 어케되나요? Sir_아사히 2005.05.19 563
8813 윈도우 98에서는 rpgxp안돌아가요 ? 바람을 가르는 자 2005.05.19 767
8812 윈도우 98에서는 rpgxp안돌아가요 ? 미칼렌 2005.05.19 927
8811 패치 요청... Norid 2005.05.19 454
8810 rpg만들기 2000에서 신규프로젝트가 만들어지지 않아요;; black-angel 2005.05.19 1147
8809 [RPG XP] 게임 테스트 오류. 살려주세요// Norid 2005.05.19 939
8808 릴레이소설 사래신장전 완결했는데요.. 적랑 2005.05.20 648
Board Pagination Prev 1 2 3 4 5 6 7 8 9 10 ... 442 Next
/ 442


[개인정보취급방침] | [이용약관] | [제휴문의] | [후원창구] | [인디사이드연혁]

Copyright © 1999 - 2016 INdiSide.com/(주)씨엘쓰리디 All Rights Reserved.
인디사이드 운영자 : 천무(이지선) | kernys(김원배) | 사신지(김병국)