TITLE
개조용#스타1 유즈맵
9. 메딕에 스크럽 스킬 달아주기
update
2024/1/17
특수유닛의 스킬은 대부분 기존에 있는 스킬이지만 마나사용 스팀팩, 마인, 스크럽과 자체수리는 직접 만들었다 스킬 제작 예시로 마나사용 스크럽 스킬을 자세히 살펴보자 실제로는 메딕옆에 숨어있는 리버가 스크럽을 생산하고 공격한다유닛생산 대기열 인식기법으로 스킬을 발동한다 기본적인 내용은 스타에디터아카데미의 강낭땅콩님의 대기열 인식하기를 참고하자 [스타에디터아카데미-대기열 인식하기(강낭땅콩)] 순서대로 하나하나 진행하자 강낭땅콩님의 강좌를 이해했다면 어렵지 않다 메딕의 버튼셋에 스킬 버튼을 추가 한다 조건에 미사용 스킬과 생산에 적당한 유닛을 하나 정하자 스킬과 유닛은 같은 인덱스로 하는게 편하다
마나사용량은 기술부문에서 설정한다 그러나 실제 사용시 마나가 소비되지는 않는다 이부분은 스크립트로 처리해야 된다
상황에 따라 스킬 비활성화가 필요한 경우가 있다 사용조건에 연구완료를 지정 해주자 연구여부는 스크립트로 처리하면 된다
스킬에 미네랄이나 가스 사용을 피하려면 대기열 유닛의 생산비용을 0으로 하자 생산조건도 없음으로 해두자
스킬에 필요한 마나가 표시되게 텍스트를 변경하자 텍스트 위의 한정자를 스킬사용으로 변경하면 된다 스킬 사용불가 텍스트는 없음으로 했다
리버의 크기를 0으로 해서 안보이게 하자 이상상황이 생길지도 모르니 절대무적 설정도 해주자
![]()
메딕에 안쓰는 무기하나를 지정해주자 현재 가지고 있는 스크럽 개수 표시 용도다 무기의 아이콘을 스크럽으로 변경하고 기타사항도 변경하자
![]()
이제 스크립트 설명이다 일단 메딕이 생성되면 스크럽 1개를 탑재한 리버를 생성하고 지상 충돌판정을 무시한다 스킬발동 상황이면 리버가 메딕을 계속 따라 다니고 킬카운트를 넘겨준다 리버의 스크럽 개수에 따라 안쓰는 무기 레벨을 올린다 스크럽이 3개 이상이면 스킬버튼을 비활성 시킨다 현재 선택한 유닛의 정보를 가져오고 메딕인지 확인한다 스킬버튼을 클릭해서 대기열에 저그에그가 올라왔는지 확인한다 대기열 체크에 성공하면 스크럽 하나를 생산하고 마나를 소모한다 마나가 없으면 에러메세지만 내보낸다 제작스킬 사용에는 터보함수를 꼭 넣어주자 특정유닛 이동이나 대기열 인식의 시간차로 인한 문제를 줄여준다 대기열이 항상 유지되면 연속으로 이벤트가 계속 발생한다 대기열 리셋함수도 필요하다
맵을 실행하고 메딕이 스크럽을 날리는지 확인하자 스킬 만드는건 복잡하지만 재미는 있다
12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182 var scarab_SUB = 0;//숨은리버 변수function medic_(){CreateUnitWithProperties(1, 34, "ep", P1, UnitProperty(energy = 100));CreateUnitWithProperties(1, "Warbringer", "ep", P1, UnitProperty(hanger = 1));foreach( ptr, epd : EUDLoopUnit2() ){if( wread_epd(epd + 0x64/4, 0) == $U("Warbringer") ){scarab_SUB = epd;SetMemoryXEPD(scarab_SUB + 0xDC/4, SetTo, 0, 0x100000);//Is NormalSetMemoryXEPD(scarab_SUB + 0xDC/4, SetTo, 0x200000, 0x200000);//No Collide}}}function skill_reset(epd){// 대기열 초기화, 1열에는 항상 마린, 1열 없음으로 하면 에러 발생dwwrite_epd(epd + 0x98/4, 0 + 228*65536);//대기열1 마린, 2 없음dwwrite_epd(epd + 0x9C/4, 228 + 228*65536);//대기열3 없음, 4 없음wwrite_epd(epd + 0xA0/4, 0, 228);//대기열5 없음// 버튼 갱신CreateUnit(1, "Protoss Probe", "rest", P1);RemoveUnit("Protoss Probe", P1);}function scarab(epd, type){if(scarab_SUB > 0 && bread_epd(epd + 0x4C/4, 1) != 0) {//숨은리버를 메딕옆으로 이동const _x = wread_epd(epd + 0x28/4, 0);//epd X좌표const _y = wread_epd(epd + 0x28/4, 2);//epd Y좌표wwrite_epd(scarab_SUB + 0x10/4, 0, _x);wwrite_epd(scarab_SUB + 0x10/4, 2, _y);wwrite_epd(scarab_SUB + 0x18/4, 0, _x);wwrite_epd(scarab_SUB + 0x18/4, 2, _y);dwwrite_epd(scarab_SUB + 0x02C / 4, _x*256);dwwrite_epd(scarab_SUB + 0x030 / 4, _y*256);//숨은리버 킬카운트를 메딕에게 주기var killCount = bread_epd(scarab_SUB + 0x8C/4, 3);bwrite_epd(epd + 0x8C/4, 3, killCount);}//현재 마우스 클릭된 대상의 주소const ptr, cur = dwepdread_epd( EPD(0x6284E8) );// + 12*playerif(ptr <= 0) return;//현재 메딕이 가진 스크럽 개수 보여주기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-24, 0);else bwrite(0x58F140 + 36-24, 1);if (MemoryEPD(cur + 0x64/4, Exactly, type)){if (MemoryEPD(cur + 0x98/4, Exactly, $U("Zerg Egg")*65536)){//대기열 1번이 에그면var mana = wread_epd(cur + 0xA0/4, 2);//매딕의 마나량if( mana >= 50*256){//사용ModifyUnitHangarCount(1, All, "Warbringer", P1,"Anywhere");//스크럽 1 증가wwrite_epd(cur + 0xA0/4, 2, mana-50*256);//마나 50사용}else{//마나없음PlayWAV("sound/terran/advisor/taderr06.wav");//마나 없음 음성eprintln("Not enough energy");//마나 없음 메세지}}}}function beforeTriggerExec() {dwwrite(0x6509A0, 0); // EUD Turbo}function afterTriggerExec() {//매 프래임 마다 발생foreach( ptr, epd : EUDLoopPlayerUnit(P1) ){const type = wread_epd(epd + 0x64/4, 0);switch(type){case 34://"Terran Medic"//"Hope"scarab(epd, type); skill_reset(epd);break;}}}cs
COMMENT(0)