실험용 블로그

취미로 이것저것 하는 블로그

이 블로그 검색

arrow_upward

실험용 블로그

취미로 이것저것 하는 블로그
TITLE
개조용#스타1 유즈맵

9. 메딕에 스크럽 스킬 달아주기


update 2024/1/17
특수유닛의 스킬은 대부분 기존에 있는 스킬이지만
마나사용 스팀팩, 마인, 스크럽과 자체수리는 직접 만들었다

스킬 제작 예시로 마나사용 스크럽 스킬을 자세히 살펴보자
실제로는 메딕옆에 숨어있는 리버가 스크럽을 생산하고 공격한다


유닛생산 대기열 인식기법으로 스킬을 발동한다
기본적인 내용은 스타에디터아카데미의 강낭땅콩님의 대기열 인식하기를 참고하자
[스타에디터아카데미-대기열 인식하기(강낭땅콩)]

순서대로 하나하나 진행하자
강낭땅콩님의 강좌를 이해했다면 어렵지 않다

메딕의 버튼셋에 스킬 버튼을 추가 한다
조건에 미사용 스킬과 생산에 적당한 유닛을 하나 정하자
스킬과 유닛은 같은 인덱스로 하는게 편하다


마나사용량은 기술부문에서 설정한다
그러나 실제 사용시 마나가 소비되지는 않는다
이부분은 스크립트로 처리해야 된다


상황에 따라 스킬 비활성화가 필요한 경우가 있다
사용조건에 연구완료를 지정 해주자
연구여부는 스크립트로 처리하면 된다


스킬에 미네랄이나 가스 사용을 피하려면 대기열 유닛의 생산비용을 0으로 하자
생산조건도 없음으로 해두자


스킬에 필요한 마나가 표시되게 텍스트를 변경하자
텍스트 위의 한정자를 스킬사용으로 변경하면 된다
스킬 사용불가 텍스트는 없음으로 했다


리버의 크기를 0으로 해서 안보이게 하자
이상상황이 생길지도 모르니 절대무적 설정도 해주자



메딕에 안쓰는 무기하나를 지정해주자
현재 가지고 있는 스크럽 개수 표시 용도다
무기의 아이콘을 스크럽으로 변경하고 기타사항도 변경하자



이제 스크립트 설명이다

일단 메딕이 생성되면 스크럽 1개를 탑재한 리버를 생성하고 지상 충돌판정을 무시한다

스킬발동 상황이면 리버가 메딕을 계속 따라 다니고 킬카운트를 넘겨준다
리버의 스크럽 개수에 따라 안쓰는 무기 레벨을 올린다
스크럽이 3개 이상이면 스킬버튼을 비활성 시킨다

현재 선택한 유닛의 정보를 가져오고 메딕인지 확인한다
스킬버튼을 클릭해서 대기열에 저그에그가 올라왔는지 확인한다
대기열 체크에 성공하면 스크럽 하나를 생산하고 마나를 소모한다
마나가 없으면 에러메세지만 내보낸다

제작스킬 사용에는 터보함수를 꼭 넣어주자
특정유닛 이동이나 대기열 인식의 시간차로 인한 문제를 줄여준다
대기열이 항상 유지되면 연속으로 이벤트가 계속 발생한다
대기열 리셋함수도 필요하다
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
var scarab_SUB = 0;//숨은리버 변수
 
function medic_(){
    CreateUnitWithProperties(134"ep", P1,  UnitProperty(energy = 100));
    CreateUnitWithProperties(1"Warbringer""ep", P1,  UnitProperty(hanger = 1));
    foreach( ptr, epd : EUDLoopUnit2() ){ 
        if( wread_epd(epd + 0x64/40== $U("Warbringer") ){
            scarab_SUB = epd; 
            SetMemoryXEPD(scarab_SUB + 0xDC/4, SetTo, 00x100000);//Is Normal
            SetMemoryXEPD(scarab_SUB + 0xDC/4, SetTo, 0x2000000x200000);//No Collide
        }
    }
}
 
function skill_reset(epd){
    // 대기열 초기화, 1열에는 항상 마린, 1열 없음으로 하면 에러 발생
    dwwrite_epd(epd + 0x98/40 + 228*65536);//대기열1 마린, 2 없음
    dwwrite_epd(epd + 0x9C/4228 + 228*65536);//대기열3 없음, 4 없음
    wwrite_epd(epd + 0xA0/40228);//대기열5 없음
    // 버튼 갱신
    CreateUnit(1"Protoss Probe""rest", P1);
       RemoveUnit("Protoss Probe", P1);
}
 
function scarab(epd, type){
    if(scarab_SUB > 0 && bread_epd(epd + 0x4C/41!= 0) {
        //숨은리버를 메딕옆으로 이동
        const _x = wread_epd(epd + 0x28/40);//epd X좌표
        const _y = wread_epd(epd + 0x28/42);//epd Y좌표
        wwrite_epd(scarab_SUB + 0x10/40, _x);
        wwrite_epd(scarab_SUB + 0x10/42, _y);
        wwrite_epd(scarab_SUB + 0x18/40, _x);
        wwrite_epd(scarab_SUB + 0x18/42, _y);
        dwwrite_epd(scarab_SUB + 0x02C / 4, _x*256);
        dwwrite_epd(scarab_SUB + 0x030 / 4, _y*256);
        //숨은리버 킬카운트를 메딕에게 주기
        var killCount = bread_epd(scarab_SUB + 0x8C/43);
        bwrite_epd(epd + 0x8C/43, killCount);
    }
    
    //현재 마우스 클릭된 대상의 주소
    const ptr, cur = dwepdread_epd( EPD(0x6284E8) );// + 12*player
    if(ptr <= 0return;
    
    //현재 메딕이 가진 스크럽 개수 보여주기
    if( Command(P1, Exactly, 0,"Protoss Scarab") ) <?SetUpgrade(55, P1, SetTo, 0)?>;
    if( Command(P1, Exactly, 1,"Protoss Scarab") ) <?SetUpgrade(55, P1, SetTo, 1)?>;
    if( Command(P1, Exactly, 2,"Protoss Scarab") ) <?SetUpgrade(55, P1, SetTo, 2)?>;
    if( Command(P1, Exactly, 3,"Protoss Scarab") ) <?SetUpgrade(55, P1, SetTo, 3)?>;
    //스크럽 3개면 생산 버튼 비활성, 적으면 활성
    if( Command(P1,AtLeast,3,"Protoss Scarab") ) bwrite(0x58F140 + 36-240);
    else bwrite(0x58F140 + 36-241);
    
    if (MemoryEPD(cur + 0x64/4, Exactly, type)){
        if (MemoryEPD(cur + 0x98/4, Exactly, $U("Zerg Egg")*65536)){//대기열 1번이 에그면
            var mana = wread_epd(cur + 0xA0/42);//매딕의 마나량
            if( mana >= 50*256){//사용
                ModifyUnitHangarCount(1, All, "Warbringer", P1,"Anywhere");//스크럽 1 증가
                 wwrite_epd(cur + 0xA0/42, mana-50*256);//마나 50사용
            }else{//마나없음
                PlayWAV("sound/terran/advisor/taderr06.wav");//마나 없음 음성
                eprintln("Not enough energy");//마나 없음 메세지
            }
        }
    }
}
 
function beforeTriggerExec() {
    dwwrite(0x6509A00); // EUD Turbo
}
 
function afterTriggerExec() {//매 프래임 마다 발생
    foreach( ptr, epd : EUDLoopPlayerUnit(P1) ){
        const type = wread_epd(epd + 0x64/40);
        
        switch(type){ 
            case 34://"Terran Medic"//"Hope"
                scarab(epd, type); skill_reset(epd);
            break;
        }
    }
}
cs
맵을 실행하고 메딕이 스크럽을 날리는지 확인하자 스킬 만드는건 복잡하지만 재미는 있다

COMMENT(0)